Plotting a list of lines

Dear John,

Thank you very much for your thoughtful reply. Indeed, the code
fragment I sent was incomplete and not expected to do nothing else
than illustrate the general idea (what, hopefully, it did).

You suggested collections, and in my previous attempts I have already
used them (worked quite well, but did not solved my problem).

Perhaps my problem is a simpler than I am being able to see and it is
(still) related to using MPL/Basemap embedded in a wx GUI. Well, in my
previously presented sample application for plotting point-coordinate
datasets (in that case, corresponding to cities) on a Basemap, I have
checkboxes which I use to toggle the points on the map on and off. I
do this by storing the plot corresponding to each dataset in a Python
list, eg.

self.plot_list.append(self.map.ax.plot(longs,lats,'o'))

where map is a Basemap instance and longs,lats are float arrays of
geographic coordinates in decimal format.

Then, in a checkbox event, I do the following:

index = event.GetSelection()
plot = self.plot_list[index]
if self.FileList.IsChecked(index):
       plot[0].set_visible(True)
else:
       plot[0].set_visible(False)

This works quite well and points are properly toggled on/off the Basemap.

But then I want to plot minimum spanning trees connecting the point
datasets. For this I do:

n = len(nodes)
for i in range(n):
       try:
               t = edges[i,0]-1
               u = edges[i,1]-1
               x = [nodes[t,0], nodes[u,0]]
               y = [nodes[t,1], nodes[u,1]]
              self.plot_list.append(map.ax.plot(x,y,'-b'))
       except:
               continue

where nodes is the array of point coordinates and edges are the
from/to indexes of the coordinates, computed with Prim's algorithm.
The lines between points (representing the minimum spanning tree) are
displayed OK. But then my problem appears: I cannot find a way to turn
the entire tree (which is composed of n-1 line segments) on and off of
the map in the same way I do with the points (as shown above). What I
would like is to store all line segments inside the for loop, and then
show the tree at once, outside the loop; so I could use the same
"plot[0].set_visible(True|False)" I use for the points.

Searching the list archives, I found that more than an year ago,
another user, Mr. David Clark, had about the same problem
(http://www.nabble.com/Toggle-plot-trace-tt8968338r0.html). Your
answer to him helped me with toggling of the points, but not with the
lines.

Well, hope to have been as clear as possible.

Thanks in advance for any assistance you can provide, and for your patience!

With best regards,

2008/11/27 John Hunter <jdh2358@...287...>:

···

Could you be a little bit more clear about your use case? In the code
above, nothing is drawn inside the loop. The Line2D is created but not
rendered until a figure draw command is issued. So it would help to
know what it is that you are trying to achieve, rather than simply the
approach to the solution you are taking.

--
Dr. Mauro J. Cavalcanti
Ecoinformatics Studio
P.O. Box 46521, CEP 20551-970
Rio de Janeiro, RJ, BRASIL
E-mail: maurobio@...287...
Web: http://studio.infobio.net
Linux Registered User #473524 * Ubuntu User #22717
"Life is complex. It consists of real and imaginary parts."

Hi Mauro,

Yes, you should be able to use a collection for this quite easily.
One comment first. You never want to try/except and catch all
exceptions w/o handling them in some way. If you want to catch a
specific exception, fine, or of you want to catch all of them and log
them and then reraise, also fine, but there is not good use case for
catching them all and then continuing silently.

Now, on to collections. In your example above, you would simply do::

    segments = []
    n = len(nodes)
    for i in range(n):
        t = edges[i,0]-1
        u = edges[i,1]-1
        xt, yt = nodes[t,0], nodes[t,1] # assuming xt, yt are scalars here....
        xu, yu = nodes[u,0], nodes[u,1]
        segments.append( [ (xt,yt), (xu,yu) ] )

    collection = collections.LineCollection(segments)

and later::

    collection.set_visible(True|False) # etc...

Hope this helps,

JDH

···

On Thu, Nov 27, 2008 at 11:21 AM, Mauro Cavalcanti <maurobio@...287...> wrote:

Then, in a checkbox event, I do the following:

index = event.GetSelection()
plot = self.plot_list[index]
if self.FileList.IsChecked(index):
      plot[0].set_visible(True)
else:
      plot[0].set_visible(False)

This works quite well and points are properly toggled on/off the Basemap.

But then I want to plot minimum spanning trees connecting the point
datasets. For this I do:

n = len(nodes)
for i in range(n):
      try:
              t = edges[i,0]-1
              u = edges[i,1]-1
              x = [nodes[t,0], nodes[u,0]]
              y = [nodes[t,1], nodes[u,1]]
             self.plot_list.append(map.ax.plot(x,y,'-b'))
      except:
              continue

where nodes is the array of point coordinates and edges are the
from/to indexes of the coordinates, computed with Prim's algorithm.
The lines between points (representing the minimum spanning tree) are
displayed OK. But then my problem appears: I cannot find a way to turn
the entire tree (which is composed of n-1 line segments) on and off of
the map in the same way I do with the points (as shown above). What I
would like is to store all line segments inside the for loop, and then
show the tree at once, outside the loop; so I could use the same
"plot[0].set_visible(True|False)" I use for the points.