Issue with Redrawing a Line (numpy.ndarray, set_ydata, and draw)

I have a code that continuously modifies a numpy.ndarray variable. Then, I use set_ydata on the matplotlib.lines.Line2D object to the same ndarray variable. Then, I call fig.canvas.draw() to redraw the figure, where fig is Figure object.

However, the line on the graph never changes. I print a few entries to the console to make sure that the variable is changing.

It seems like the only way I can get the line to update is to create a completely new ndarray, update that variable with the new values and use set_ydata on my line object. Then, the redraw works. Other things that I tried that didn’t seem to work were:

L1.set_ydata(x[:])
L1.set_ydata(x.tolist())
L1.set_ydata(list(x))

where L1 is my line object, and x is my ndarray. To make it redraw I have to do something like this.

xnew = numpy.zeros(numpy.size(x,0))
for k in range(numpy.size(x,0)):
xnew[k] = x[k]
L1.set_ydata(xnew)
fig.canvas.draw()

Is there some switch I can set to force a redraw of the elements? I feel like I am missing something fundamental.

Thanks,
Michael

···


Michael,

Which version of matplotlib are you using? Which backend are you using? Also, could you include a small script or two that demonstrate the problem? This way, we can poke around with it and see what is up.

Ben Root

···

On Wed, Oct 6, 2010 at 1:06 PM, Michael Cracraft <michael.cracraft@…287…> wrote:

I have a code that continuously modifies a numpy.ndarray variable. Then, I use set_ydata on the matplotlib.lines.Line2D object to the same ndarray variable. Then, I call fig.canvas.draw() to redraw the figure, where fig is Figure object.

However, the line on the graph never changes. I print a few entries to the console to make sure that the variable is changing.

It seems like the only way I can get the line to update is to create a completely new ndarray, update that variable with the new values and use set_ydata on my line object. Then, the redraw works. Other things that I tried that didn’t seem to work were:

L1.set_ydata(x[:])
L1.set_ydata(x.tolist())
L1.set_ydata(list(x))

where L1 is my line object, and x is my ndarray. To make it redraw I have to do something like this.

xnew = numpy.zeros(numpy.size(x,0))

for k in range(numpy.size(x,0)):
xnew[k] = x[k]
L1.set_ydata(xnew)
fig.canvas.draw()

Is there some switch I can set to force a redraw of the elements? I feel like I am missing something fundamental.

Thanks,
Michael

I believe that you're using older version of mpl (<1.0) and this is a
known issues, which has been fixed.

http://sourceforge.net/tracker/?func=detail&aid=2917758&group_id=80706&atid=560720

Try to add

L1.recache()

after set_ydata.

Regards,

-JJ

···

On Thu, Oct 7, 2010 at 3:06 AM, Michael Cracraft <michael.cracraft@...287...> wrote:

I have a code that continuously modifies a numpy.ndarray variable. Then, I
use set_ydata on the matplotlib.lines.Line2D object to the same ndarray
variable. Then, I call fig.canvas.draw() to redraw the figure, where fig is
Figure object.

However, the line on the graph never changes. I print a few entries to the
console to make sure that the variable is changing.

It seems like the only way I can get the line to update is to create a
completely new ndarray, update that variable with the new values and use
set_ydata on my line object. Then, the redraw works. Other things that I
tried that didn't seem to work were:

L1.set_ydata(x[:])
L1.set_ydata(x.tolist())
L1.set_ydata(list(x))

where L1 is my line object, and x is my ndarray. To make it redraw I have
to do something like this.

xnew = numpy.zeros(numpy.size(x,0))
for k in range(numpy.size(x,0)):
xnew[k] = x[k]
L1.set_ydata(xnew)
fig.canvas.draw()

Is there some switch I can set to force a redraw of the elements? I feel
like I am missing something fundamental.

Thanks,
Michael

--
_____________________________________________

------------------------------------------------------------------------------
Beautiful is writing same markup. Internet Explorer 9 supports
standards for HTML5, CSS3, SVG 1.1, ECMAScript5, and DOM L2 & L3.
Spend less time writing and rewriting code and more time creating great
experiences on the web. Be a part of the beta today.
http://p.sf.net/sfu/beautyoftheweb
_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users

I am running python 2.6.4 and matplotlib 0.99.1.1. I was using the TkAgg backend with my original problem, but I tried GTKAgg with the same result. Here are two sample codes. One works and the other does not.

This one works …

plt.ion()

x = np.arange(0,2*np.pi,0.01)
y = np.sin(x)
line, = plt.plot(x,y)
for i in np.arange(1,200):
y = np.sin(x + i/10.0)
line.set_ydata(y)
plt.draw()

This one does not …

plt.ion()

x = np.arange(0,2*np.pi,0.01)
y = np.sin(x)
line, = plt.plot(x,y)
for i in np.arange(1,200):
for k in range(len(x)):
y[k] = np.sin(x[k] + i/10.0)
line.set_ydata(y)
plt.draw()

The only real difference is that I do not get a new ndarray instance in the second one. My guess was that there was something to do with the object being the same instance as before causing some issue when I updated the ydata.

···

On Wed, Oct 6, 2010 at 7:56 PM, Benjamin Root <ben.root@…1304…> wrote:

On Wed, Oct 6, 2010 at 1:06 PM, Michael Cracraft <michael.cracraft@…287…> wrote:

I have a code that continuously modifies a numpy.ndarray variable. Then, I use set_ydata on the matplotlib.lines.Line2D object to the same ndarray variable. Then, I call fig.canvas.draw() to redraw the figure, where fig is Figure object.

However, the line on the graph never changes. I print a few entries to the console to make sure that the variable is changing.

It seems like the only way I can get the line to update is to create a completely new ndarray, update that variable with the new values and use set_ydata on my line object. Then, the redraw works. Other things that I tried that didn’t seem to work were:

L1.set_ydata(x[:])
L1.set_ydata(x.tolist())
L1.set_ydata(list(x))

where L1 is my line object, and x is my ndarray. To make it redraw I have to do something like this.

xnew = numpy.zeros(numpy.size(x,0))

for k in range(numpy.size(x,0)):
xnew[k] = x[k]
L1.set_ydata(xnew)
fig.canvas.draw()

Is there some switch I can set to force a redraw of the elements? I feel like I am missing something fundamental.

Thanks,
Michael

Michael,

Which version of matplotlib are you using? Which backend are you using? Also, could you include a small script or two that demonstrate the problem? This way, we can poke around with it and see what is up.

Ben Root


You are correct about the version. I was just working with the version installed on Fedora 13, and the recache works. Looks like a working solution for now.

Thanks,
Michael

···

On Wed, Oct 6, 2010 at 8:18 PM, Jae-Joon Lee <lee.j.joon@…287…> wrote:

I believe that you’re using older version of mpl (<1.0) and this is a

known issues, which has been fixed.

http://sourceforge.net/tracker/?func=detail&aid=2917758&group_id=80706&atid=560720

Try to add

L1.recache()

after set_ydata.

Regards,

-JJ

On Thu, Oct 7, 2010 at 3:06 AM, Michael Cracraft > <michael.cracraft@…287…> wrote:

I have a code that continuously modifies a numpy.ndarray variable. Then, I

use set_ydata on the matplotlib.lines.Line2D object to the same ndarray

variable. Then, I call fig.canvas.draw() to redraw the figure, where fig is

Figure object.

However, the line on the graph never changes. I print a few entries to the

console to make sure that the variable is changing.

It seems like the only way I can get the line to update is to create a

completely new ndarray, update that variable with the new values and use

set_ydata on my line object. Then, the redraw works. Other things that I

tried that didn’t seem to work were:

L1.set_ydata(x[:])

L1.set_ydata(x.tolist())

L1.set_ydata(list(x))

where L1 is my line object, and x is my ndarray. To make it redraw I have

to do something like this.

xnew = numpy.zeros(numpy.size(x,0))

for k in range(numpy.size(x,0)):

 xnew[k] = x[k]

L1.set_ydata(xnew)

fig.canvas.draw()

Is there some switch I can set to force a redraw of the elements? I feel

like I am missing something fundamental.

Thanks,

Michael



Beautiful is writing same markup. Internet Explorer 9 supports

standards for HTML5, CSS3, SVG 1.1, ECMAScript5, and DOM L2 & L3.

Spend less time writing and rewriting code and more time creating great

experiences on the web. Be a part of the beta today.

http://p.sf.net/sfu/beautyoftheweb


Matplotlib-users mailing list

Matplotlib-users@lists.sourceforge.net

https://lists.sourceforge.net/lists/listinfo/matplotlib-users


Just as a side note because 'tis the season for Linux upgrades… It looks like Jef Spaleta has packaged the version 1.0 of mpl for the upcoming Fedora 14 release (early Nov.). However, Ubuntu 10.10 (Maverick Meerkat) will be released in a few days with version 0.99.3. Is this because Ubuntu typically follows whatever is in the Debian repos?

Ben Root

···

On Wed, Oct 6, 2010 at 7:31 PM, Michael Cracraft <michael.cracraft@…287…> wrote:

You are correct about the version. I was just working with the version installed on Fedora 13, and the recache works. Looks like a working solution for now.

Thanks,
Michael