SourceForge logo
SourceForge logo
Menu

matplotlib-users

From: Mauro C. <mau...@gm...> - 2008年11月27日 13:29:53
Dear ALL,
Is there a way to plot a list (a Python list) of lines (MPL Line2D
objects) at once?
For example, inside a loop I have:
for i in range(n):
 line, = ax.plot(x,y)
 plot_list.append(line)
In the code fragment above, "plot_list" is an ordinary Python list
which will be filled with matplotlib.lines.Line2D objetcs, each of
them representing a line in the plot. What I would like is how (if???)
to plot this entire list of lines at once in a single plot, outside
the for loop, but obviously this cannot be done with a canonical
"plot" command.
Thanks in advance.
With regards,
-- 
Dr. Mauro J. Cavalcanti
Ecoinformatics Studio
P.O. Box 46521, CEP 20551-970
Rio de Janeiro, RJ, BRASIL
E-mail: mau...@gm...
Web: http://studio.infobio.net
Linux Registered User #473524 * Ubuntu User #22717
"Life is complex. It consists of real and imaginary parts."
From: Mauro C. <mau...@gm...> - 2008年11月27日 17:21:28
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 <jd...@gm...>:
>
> 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: mau...@gm...
Web: http://studio.infobio.net
Linux Registered User #473524 * Ubuntu User #22717
"Life is complex. It consists of real and imaginary parts."
From: John H. <jd...@gm...> - 2008年11月29日 14:34:50
On Thu, Nov 27, 2008 at 11:21 AM, Mauro Cavalcanti <mau...@gm...> 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.
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
Want the latest updates on software, tech news, and AI?
Get latest updates about software, tech news, and AI from SourceForge directly in your inbox once a month.
Thanks for helping keep SourceForge clean.
X





Briefly describe the problem (required):
Upload screenshot of ad (required):
Select a file, or drag & drop file here.
Screenshot instructions:

Click URL instructions:
Right-click on the ad, choose "Copy Link", then paste here →
(This may not be possible with some types of ads)

More information about our ad policies

Ad destination/click URL:

AltStyle によって変換されたページ (->オリジナル) /