From: Shakthi K. <sha...@gm...> - 2015-09-26 07:47:00
|
Hi, I am trying to create poly lines using matplotlib and animation. My code snippet is as follows: === BEGIN === import matplotlib as mpl from mpl_toolkits.mplot3d import Axes3D import numpy as np import matplotlib.pyplot as plt import matplotlib.animation as animation def update_line(num, x, y, z, l): x.append(1.0) y.append (2.0) z.append(3.0) print x, y, z l, = ax.plot(x, y, z, label='Line') return l, fig = plt.figure() ax = fig.gca(projection='3d') ax.set_xlabel('X') ax.set_ylabel('Y') ax.set_zlabel('Z') ax.legend() x = [1.0, 2.0, 3.0] y = [4.0, 7.0, 8.0] z = [6.0, 9.0, 5.0] l, = ax.plot(x, y, z, label='Line') line_ani = animation.FuncAnimation(fig, update_line, 25, fargs=(x, y, z, l), interval=2000, blit=True) plt.show() === END === The error that I get: === ERROR === $ python mat-3.py /usr/lib/pymodules/python2.7/matplotlib/axes.py:4747: UserWarning: No labeled objects found. Use label='...' kwarg on individual plots. warnings.warn("No labeled objects found. " [1.0, 2.0, 3.0, 1.0] [4.0, 7.0, 8.0, 2.0] [6.0, 9.0, 5.0, 3.0] Exception in Tkinter callback Traceback (most recent call last): File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1535, in __call__ return self.func(*args) File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 586, in callit func(*args) File "/usr/lib/pymodules/python2.7/matplotlib/backends/backend_tkagg.py", line 363, in idle_draw self.draw() File "/usr/lib/pymodules/python2.7/matplotlib/backends/backend_tkagg.py", line 348, in draw FigureCanvasAgg.draw(self) File "/usr/lib/pymodules/python2.7/matplotlib/backends/backend_agg.py", line 451, in draw self.figure.draw(self.renderer) File "/usr/lib/pymodules/python2.7/matplotlib/artist.py", line 55, in draw_wrapper draw(artist, renderer, *args, **kwargs) File "/usr/lib/pymodules/python2.7/matplotlib/figure.py", line 1034, in draw func(*args) File "/usr/lib/pymodules/python2.7/mpl_toolkits/mplot3d/axes3d.py", line 270, in draw Axes.draw(self, renderer) File "/usr/lib/pymodules/python2.7/matplotlib/artist.py", line 55, in draw_wrapper draw(artist, renderer, *args, **kwargs) File "/usr/lib/pymodules/python2.7/matplotlib/axes.py", line 2086, in draw a.draw(renderer) File "/usr/lib/pymodules/python2.7/mpl_toolkits/mplot3d/art3d.py", line 117, in draw xs, ys, zs = proj3d.proj_transform(xs3d, ys3d, zs3d, renderer.M) File "/usr/lib/pymodules/python2.7/mpl_toolkits/mplot3d/proj3d.py", line 194, in proj_transform return proj_transform_vec(vec, M) File "/usr/lib/pymodules/python2.7/mpl_toolkits/mplot3d/proj3d.py", line 153, in proj_transform_vec vecw = np.dot(M, vec) TypeError: can't multiply sequence by non-int of type 'float' [1.0, 2.0, 3.0, 1.0, 1.0] [4.0, 7.0, 8.0, 2.0, 2.0] [6.0, 9.0, 5.0, 3.0, 3.0] Exception in Tkinter callback Traceback (most recent call last): File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1535, in __call__ return self.func(*args) File "/usr/lib/pymodules/python2.7/matplotlib/backends/backend_tkagg.py", line 276, in resize self.show() File "/usr/lib/pymodules/python2.7/matplotlib/backends/backend_tkagg.py", line 348, in draw FigureCanvasAgg.draw(self) File "/usr/lib/pymodules/python2.7/matplotlib/backends/backend_agg.py", line 451, in draw self.figure.draw(self.renderer) File "/usr/lib/pymodules/python2.7/matplotlib/artist.py", line 55, in draw_wrapper draw(artist, renderer, *args, **kwargs) File "/usr/lib/pymodules/python2.7/matplotlib/figure.py", line 1034, in draw func(*args) File "/usr/lib/pymodules/python2.7/mpl_toolkits/mplot3d/axes3d.py", line 270, in draw Axes.draw(self, renderer) File "/usr/lib/pymodules/python2.7/matplotlib/artist.py", line 55, in draw_wrapper draw(artist, renderer, *args, **kwargs) File "/usr/lib/pymodules/python2.7/matplotlib/axes.py", line 2086, in draw a.draw(renderer) File "/usr/lib/pymodules/python2.7/mpl_toolkits/mplot3d/art3d.py", line 117, in draw xs, ys, zs = proj3d.proj_transform(xs3d, ys3d, zs3d, renderer.M) File "/usr/lib/pymodules/python2.7/mpl_toolkits/mplot3d/proj3d.py", line 194, in proj_transform return proj_transform_vec(vec, M) File "/usr/lib/pymodules/python2.7/mpl_toolkits/mplot3d/proj3d.py", line 153, in proj_transform_vec vecw = np.dot(M, vec) TypeError: can't multiply sequence by non-int of type 'float' === END === I am using the basic_example.py as a template. http://matplotlib.org/1.4.1/examples/animation/basic_example.html What could I be missing? Appreciate any help in this regard, Thanks! SK -- Shakthi Kannan http://www.shakthimaan.com |
From: Benjamin R. <ben...@gm...> - 2015-09-28 15:43:55
|
Confirmed using a fairly recent matplotlib checkout. Could you file a bug report? This is going to need some investigating. As a side note though, the way you are updating the lines by calling `ax.plot` repeatedly, is bad form. You want to update the lines object itself, by calling its "set_data()" method. Also, move the call to `ax.legend()` to after calling `ax.plot` to avoid the warnings about unlabeled plotting objects. On Sat, Sep 26, 2015 at 3:46 AM, Shakthi Kannan <sha...@gm...> wrote: > Hi, > > I am trying to create poly lines using matplotlib and animation. My > code snippet is as follows: > > === BEGIN === > > import matplotlib as mpl > from mpl_toolkits.mplot3d import Axes3D > import numpy as np > import matplotlib.pyplot as plt > import matplotlib.animation as animation > > def update_line(num, x, y, z, l): > x.append(1.0) > y.append (2.0) > z.append(3.0) > print x, y, z > l, = ax.plot(x, y, z, label='Line') > return l, > > fig = plt.figure() > ax = fig.gca(projection='3d') > ax.set_xlabel('X') > ax.set_ylabel('Y') > ax.set_zlabel('Z') > ax.legend() > > x = [1.0, 2.0, 3.0] > y = [4.0, 7.0, 8.0] > z = [6.0, 9.0, 5.0] > > l, = ax.plot(x, y, z, label='Line') > > line_ani = animation.FuncAnimation(fig, update_line, 25, fargs=(x, y, > z, l), interval=2000, blit=True) > > plt.show() > > === END === > > The error that I get: > > === ERROR === > > $ python mat-3.py > > /usr/lib/pymodules/python2.7/matplotlib/axes.py:4747: UserWarning: No > labeled objects found. Use label='...' kwarg on individual plots. > warnings.warn("No labeled objects found. " > [1.0, 2.0, 3.0, 1.0] [4.0, 7.0, 8.0, 2.0] [6.0, 9.0, 5.0, 3.0] > Exception in Tkinter callback > Traceback (most recent call last): > File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1535, in __call__ > return self.func(*args) > File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 586, in callit > func(*args) > File "/usr/lib/pymodules/python2.7/matplotlib/backends/backend_tkagg.py", > line 363, in idle_draw > self.draw() > File "/usr/lib/pymodules/python2.7/matplotlib/backends/backend_tkagg.py", > line 348, in draw > FigureCanvasAgg.draw(self) > File "/usr/lib/pymodules/python2.7/matplotlib/backends/backend_agg.py", > line 451, in draw > self.figure.draw(self.renderer) > File "/usr/lib/pymodules/python2.7/matplotlib/artist.py", line 55, > in draw_wrapper > draw(artist, renderer, *args, **kwargs) > File "/usr/lib/pymodules/python2.7/matplotlib/figure.py", line 1034, in > draw > func(*args) > File "/usr/lib/pymodules/python2.7/mpl_toolkits/mplot3d/axes3d.py", > line 270, in draw > Axes.draw(self, renderer) > File "/usr/lib/pymodules/python2.7/matplotlib/artist.py", line 55, > in draw_wrapper > draw(artist, renderer, *args, **kwargs) > File "/usr/lib/pymodules/python2.7/matplotlib/axes.py", line 2086, in > draw > a.draw(renderer) > File "/usr/lib/pymodules/python2.7/mpl_toolkits/mplot3d/art3d.py", > line 117, in draw > xs, ys, zs = proj3d.proj_transform(xs3d, ys3d, zs3d, renderer.M) > File "/usr/lib/pymodules/python2.7/mpl_toolkits/mplot3d/proj3d.py", > line 194, in proj_transform > return proj_transform_vec(vec, M) > File "/usr/lib/pymodules/python2.7/mpl_toolkits/mplot3d/proj3d.py", > line 153, in proj_transform_vec > vecw = np.dot(M, vec) > TypeError: can't multiply sequence by non-int of type 'float' > [1.0, 2.0, 3.0, 1.0, 1.0] [4.0, 7.0, 8.0, 2.0, 2.0] [6.0, 9.0, 5.0, 3.0, > 3.0] > Exception in Tkinter callback > Traceback (most recent call last): > File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1535, in __call__ > return self.func(*args) > File "/usr/lib/pymodules/python2.7/matplotlib/backends/backend_tkagg.py", > line 276, in resize > self.show() > File "/usr/lib/pymodules/python2.7/matplotlib/backends/backend_tkagg.py", > line 348, in draw > FigureCanvasAgg.draw(self) > File "/usr/lib/pymodules/python2.7/matplotlib/backends/backend_agg.py", > line 451, in draw > self.figure.draw(self.renderer) > File "/usr/lib/pymodules/python2.7/matplotlib/artist.py", line 55, > in draw_wrapper > draw(artist, renderer, *args, **kwargs) > File "/usr/lib/pymodules/python2.7/matplotlib/figure.py", line 1034, in > draw > func(*args) > File "/usr/lib/pymodules/python2.7/mpl_toolkits/mplot3d/axes3d.py", > line 270, in draw > Axes.draw(self, renderer) > File "/usr/lib/pymodules/python2.7/matplotlib/artist.py", line 55, > in draw_wrapper > draw(artist, renderer, *args, **kwargs) > File "/usr/lib/pymodules/python2.7/matplotlib/axes.py", line 2086, in > draw > a.draw(renderer) > File "/usr/lib/pymodules/python2.7/mpl_toolkits/mplot3d/art3d.py", > line 117, in draw > xs, ys, zs = proj3d.proj_transform(xs3d, ys3d, zs3d, renderer.M) > File "/usr/lib/pymodules/python2.7/mpl_toolkits/mplot3d/proj3d.py", > line 194, in proj_transform > return proj_transform_vec(vec, M) > File "/usr/lib/pymodules/python2.7/mpl_toolkits/mplot3d/proj3d.py", > line 153, in proj_transform_vec > vecw = np.dot(M, vec) > TypeError: can't multiply sequence by non-int of type 'float' > > === END === > > I am using the basic_example.py as a template. > > http://matplotlib.org/1.4.1/examples/animation/basic_example.html > > What could I be missing? Appreciate any help in this regard, > > Thanks! > > SK > > -- > Shakthi Kannan > http://www.shakthimaan.com > > > ------------------------------------------------------------------------------ > _______________________________________________ > Matplotlib-users mailing list > Mat...@li... > https://lists.sourceforge.net/lists/listinfo/matplotlib-users > |
From: Jerzy K. <jer...@un...> - 2015-09-28 18:43:21
|
Shakhti Kannan tries to multiply a list by a float, and Python disagrees. Le 28/09/2015 17:43, Benjamin Root comments : > Could you file a bug report? This is going to need some investigating. == I suspect that it can be solved without Hercule Poirot. Convert *at the beginning* your lists x,y,z into np.arrays. (also: append ==> concatenate) Jerzy Karczmarczuk /Caen, France/. |
From: Benjamin R. <ben...@gm...> - 2015-09-28 19:04:07
|
On Mon, Sep 28, 2015 at 2:28 PM, Jerzy Karczmarczuk < jer...@un...> wrote: > Shakhti Kannan tries to multiply a list by a float, and Python disagrees. > > Where does he multiply a list by a float? The traceback shows the multiplication happening much further down in the draw stack. > Le 28/09/2015 17:43, Benjamin Root comments : > > Could you file a bug report? This is going to need some investigating. > > == > > I suspect that it can be solved without Hercule Poirot. > Convert *at the beginning* your lists x,y,z into np.arrays. > (also: append ==> concatenate) > That shouldn't matter. ax.plot() accepts lists as valid inputs and it should be converting them into numpy arrays under the hood. Indeed, if one takes out the animation creation, the code works just fine. Adding new plots(), while inefficient, shouldn't cause this problem. Ben Root |
From: Jerzy K. <jer...@un...> - 2015-09-28 20:25:16
|
Le 28/09/2015 21:03, Benjamin Root a écrit : > Where does he multiply a list by a float? The traceback shows the > multiplication happening much further down in the draw stack. Look, Benjamin Root, I don't know, and I will not "investigate" where this operation happens. The diagnosis is a standard Python message. Thus, I took the program of Shakhti Kannan, and in a few seconds I changed x = [1.0, 2.0, 3.0] into x = np.array([1.0, 2.0, 3.0]) and in update_line: x.append(1.0) into x=np.concatenate((x,[1.0])) And the program began to run without error messages. So, please, these are FACTS: somewhere the lists x,y,z get down in this draw stack. > That shouldn't matter. ax.plot() accepts lists as valid inputs and it > should be converting them into numpy arrays under the hood. There are two different issues, accepting any sequences/iterators is one, converting them into arrays - another one. This second operation visibly doesn't take place. J. Karczmarczuk |
From: Benjamin R. <ben...@gm...> - 2015-09-28 20:39:04
|
Jerzy, On Mon, Sep 28, 2015 at 4:25 PM, Jerzy Karczmarczuk < jer...@un...> wrote: > > Le 28/09/2015 21:03, Benjamin Root a écrit : > >> Where does he multiply a list by a float? The traceback shows the >> multiplication happening much further down in the draw stack. >> > > Look, Benjamin Root, I don't know, and I will not "investigate" where this > operation happens. I did not ask you to investigate anything for me. You made the assertion that the user was multiplying a list by a float, therefore, I assumed that you were seeing something that I had not seen. > The diagnosis is a standard Python message. Thus, I took the program of > Shakhti Kannan, and in a few seconds I changed > > > x = [1.0, 2.0, 3.0] into x = np.array([1.0, 2.0, 3.0]) > > and in update_line: x.append(1.0) into x=np.concatenate((x,[1.0])) > > And the program began to run without error messages. So, please, these are > FACTS: somewhere the lists x,y,z get down in this draw stack. > > I realize that, and that isn't in dispute. Nowhere did I say that converting the lists into numpy arrays would not solve the problem. > That shouldn't matter. ax.plot() accepts lists as valid inputs and it >> should be converting them into numpy arrays under the hood. >> > > There are two different issues, accepting any sequences/iterators is one, > converting them into arrays - another one. This second operation visibly > doesn't take place. > > Of course the second operation isn't visible. I did say that it happens "under the hood". His program is perfectly valid (albeit not ideal) and demonstrated a bug in matplotlib's codebase. That is why I asked him to file a bug report. My reading of your email is that you are upset for some reason, but I have no clue why. Ben Root |
From: Daniele N. <da...@gr...> - 2015-09-28 20:55:47
|
On 28/09/15 22:25, Jerzy Karczmarczuk wrote: > > Le 28/09/2015 21:03, Benjamin Root a écrit : >> Where does he multiply a list by a float? The traceback shows the >> multiplication happening much further down in the draw stack. > > Look, Benjamin Root, I don't know, and I will not "investigate" where > this operation happens. The diagnosis is a standard Python message. > Thus, I took the program of Shakhti Kannan, and in a few seconds I changed > > > x = [1.0, 2.0, 3.0] into x = np.array([1.0, 2.0, 3.0]) > > and in update_line: x.append(1.0) into x=np.concatenate((x,[1.0])) > > And the program began to run without error messages. So, please, these > are FACTS: somewhere the lists x,y,z get down in this draw stack. No one is doubting that. >> That shouldn't matter. ax.plot() accepts lists as valid inputs and it >> should be converting them into numpy arrays under the hood. > > There are two different issues, accepting any sequences/iterators is > one, converting them into arrays - another one. This second operation > visibly doesn't take place. And this is a bug in matplotlib that needs to be fixed. Your solution is just a workaround to an existing problem in matplotlib. Cheers, Daniele |
From: Eric F. <ef...@ha...> - 2015-09-28 21:46:01
|
On 2015/09/28 5:43 AM, Benjamin Root wrote: > Confirmed using a fairly recent matplotlib checkout. Could you file a > bug report? This is going to need some investigating. Line3D.set_3d_properties is not doing anything to turn zs into an ndarray; in fact, when zs is a scalar, it is turning it into a list. I suspect this is the place to make it an array. Probably better here than anywhere farther down. It also looks to me like Line3D.__init__ should be using self.set_3d_properties. |
From: Shakthi K. <sha...@gm...> - 2015-09-29 18:05:16
|
Hi, I was able to get past the error, and I am now trying to add a callback to receive values from a queue, add it to the existing poly line, and render the same using matplotlib. The code snippet is shown below: === BEGIN === import matplotlib as mpl from mpl_toolkits.mplot3d import Axes3D import numpy as np import matplotlib.pyplot as plt import matplotlib.animation as animation import sys import paho.mqtt.client as mqtt def update_line(num, x, y, z, l): print x, y, z l, = ax.plot(x, y, z, label='Line') return l, def on_connect(client, userdata, flags, rc): print("Connected with result code "+str(rc)) client.subscribe("hello/world") def on_message(client, userdata, msg): data = msg.payload print(msg.topic+" "+str(msg.payload)) point = np.asarray([float(x) for x in data.split()]) print point x=np.concatenate((x,[point[0]])) y=np.concatenate((y,[point[1]])) z=np.concatenate((z,[point[2]])) l, = ax.plot(x, y, z, label='Line') return l, fig = plt.figure() ax = fig.gca(projection='3d') ax.set_xlabel('X') ax.set_ylabel('Y') ax.set_zlabel('Z') x = np.array([1.0, 2.0, 3.0]) print type(x) y = np.array([4.0, 7.0, 8.0]) z = np.array([6.0, 9.0, 5.0]) l, = ax.plot(x, y, z, label='Line') ax.legend() client = mqtt.Client() client.on_connect = on_connect client.on_message = on_message client.connect_async("localhost", 1883, 60) client.loop_start() line_ani = animation.FuncAnimation(fig, update_line, 25, fargs=(x, y, z, l), interval=2000, blit=True) plt.show() === END === I now hit the following error: === ERROR === $ python mat-3.py <type 'numpy.ndarray'> [ 1. 2. 3.] [ 4. 7. 8.] [ 6. 9. 5.] Connected with result code 0 [ 1. 2. 3.] [ 4. 7. 8.] [ 6. 9. 5.] [ 1. 2. 3.] [ 4. 7. 8.] [ 6. 9. 5.] [ 1. 2. 3.] [ 4. 7. 8.] [ 6. 9. 5.] hello/world 34.56 15.912 0.72 [ 34.56 15.912 0.72 ] Exception in thread Thread-1: Traceback (most recent call last): File "/usr/lib/python2.7/threading.py", line 810, in __bootstrap_inner self.run() File "/usr/lib/python2.7/threading.py", line 763, in run self.__target(*self.__args, **self.__kwargs) File "/usr/local/lib/python2.7/dist-packages/paho/mqtt/client.py", line 2287, in _thread_main self.loop_forever() File "/usr/local/lib/python2.7/dist-packages/paho/mqtt/client.py", line 1261, in loop_forever rc = self.loop(timeout, max_packets) File "/usr/local/lib/python2.7/dist-packages/paho/mqtt/client.py", line 811, in loop rc = self.loop_read(max_packets) File "/usr/local/lib/python2.7/dist-packages/paho/mqtt/client.py", line 1073, in loop_read rc = self._packet_read() File "/usr/local/lib/python2.7/dist-packages/paho/mqtt/client.py", line 1475, in _packet_read rc = self._packet_handle() File "/usr/local/lib/python2.7/dist-packages/paho/mqtt/client.py", line 1943, in _packet_handle return self._handle_publish() File "/usr/local/lib/python2.7/dist-packages/paho/mqtt/client.py", line 2118, in _handle_publish self._handle_on_message(message) File "/usr/local/lib/python2.7/dist-packages/paho/mqtt/client.py", line 2274, in _handle_on_message self.on_message(self, self._userdata, message) File "mat-3.py", line 23, in on_message x=np.concatenate((x,[point[0]])) ValueError: zero-dimensional arrays cannot be concatenated [ 1. 2. 3.] [ 4. 7. 8.] [ 6. 9. 5.] [ 1. 2. 3.] [ 4. 7. 8.] [ 6. 9. 5.] [ 1. 2. 3.] [ 4. 7. 8.] [ 6. 9. 5.] ... === END === Is there a better way to re-render the plot after receiving data? Thanks! SK -- Shakthi Kannan http://www.shakthimaan.com |
From: Benjamin R. <ben...@gm...> - 2015-09-29 18:30:01
|
You have some logic issues here. First off, I wouldn't be updating the plot in the same function that is updating the data values. Assuming that "loop_start()" is asynchronous, the update frequency for it is likely to be entirely different from the Animation update frequency. So, just have that function do updates. You should also declare x, y, and z as globals in that function so that the reassignment of those arrays persist properly. Your list comprehension prior to concatenating uses a variable "x", which is likely causing the current error that you see. Change that name to something else. Lastly, I implore you to use "set_data()" like in the original example, rather than calling plot() repeatedly. Cheers! Ben Root On Tue, Sep 29, 2015 at 2:05 PM, Shakthi Kannan <sha...@gm...> wrote: > Hi, > > I was able to get past the error, and I am now trying to add a > callback to receive values from a queue, add it to the existing poly > line, and render the same using matplotlib. The code snippet is shown > below: > > === BEGIN === > > import matplotlib as mpl > from mpl_toolkits.mplot3d import Axes3D > import numpy as np > import matplotlib.pyplot as plt > import matplotlib.animation as animation > import sys > import paho.mqtt.client as mqtt > > def update_line(num, x, y, z, l): > print x, y, z > l, = ax.plot(x, y, z, label='Line') > return l, > > def on_connect(client, userdata, flags, rc): > print("Connected with result code "+str(rc)) > client.subscribe("hello/world") > > def on_message(client, userdata, msg): > data = msg.payload > print(msg.topic+" "+str(msg.payload)) > point = np.asarray([float(x) for x in data.split()]) > print point > x=np.concatenate((x,[point[0]])) > y=np.concatenate((y,[point[1]])) > z=np.concatenate((z,[point[2]])) > l, = ax.plot(x, y, z, label='Line') > return l, > > fig = plt.figure() > ax = fig.gca(projection='3d') > ax.set_xlabel('X') > ax.set_ylabel('Y') > ax.set_zlabel('Z') > > x = np.array([1.0, 2.0, 3.0]) > print type(x) > y = np.array([4.0, 7.0, 8.0]) > z = np.array([6.0, 9.0, 5.0]) > > l, = ax.plot(x, y, z, label='Line') > ax.legend() > > client = mqtt.Client() > client.on_connect = on_connect > client.on_message = on_message > client.connect_async("localhost", 1883, 60) > client.loop_start() > > line_ani = animation.FuncAnimation(fig, update_line, 25, fargs=(x, y, > z, l), interval=2000, blit=True) > > plt.show() > > === END === > > I now hit the following error: > > === ERROR === > > $ python mat-3.py > <type 'numpy.ndarray'> > [ 1. 2. 3.] [ 4. 7. 8.] [ 6. 9. 5.] > Connected with result code 0 > [ 1. 2. 3.] [ 4. 7. 8.] [ 6. 9. 5.] > [ 1. 2. 3.] [ 4. 7. 8.] [ 6. 9. 5.] > [ 1. 2. 3.] [ 4. 7. 8.] [ 6. 9. 5.] > hello/world 34.56 15.912 0.72 > [ 34.56 15.912 0.72 ] > Exception in thread Thread-1: > Traceback (most recent call last): > File "/usr/lib/python2.7/threading.py", line 810, in __bootstrap_inner > self.run() > File "/usr/lib/python2.7/threading.py", line 763, in run > self.__target(*self.__args, **self.__kwargs) > File "/usr/local/lib/python2.7/dist-packages/paho/mqtt/client.py", > line 2287, in _thread_main > self.loop_forever() > File "/usr/local/lib/python2.7/dist-packages/paho/mqtt/client.py", > line 1261, in loop_forever > rc = self.loop(timeout, max_packets) > File "/usr/local/lib/python2.7/dist-packages/paho/mqtt/client.py", > line 811, in loop > rc = self.loop_read(max_packets) > File "/usr/local/lib/python2.7/dist-packages/paho/mqtt/client.py", > line 1073, in loop_read > rc = self._packet_read() > File "/usr/local/lib/python2.7/dist-packages/paho/mqtt/client.py", > line 1475, in _packet_read > rc = self._packet_handle() > File "/usr/local/lib/python2.7/dist-packages/paho/mqtt/client.py", > line 1943, in _packet_handle > return self._handle_publish() > File "/usr/local/lib/python2.7/dist-packages/paho/mqtt/client.py", > line 2118, in _handle_publish > self._handle_on_message(message) > File "/usr/local/lib/python2.7/dist-packages/paho/mqtt/client.py", > line 2274, in _handle_on_message > self.on_message(self, self._userdata, message) > File "mat-3.py", line 23, in on_message > x=np.concatenate((x,[point[0]])) > ValueError: zero-dimensional arrays cannot be concatenated > > [ 1. 2. 3.] [ 4. 7. 8.] [ 6. 9. 5.] > [ 1. 2. 3.] [ 4. 7. 8.] [ 6. 9. 5.] > [ 1. 2. 3.] [ 4. 7. 8.] [ 6. 9. 5.] > > ... > > === END === > > Is there a better way to re-render the plot after receiving data? > > Thanks! > > SK > > -- > Shakthi Kannan > http://www.shakthimaan.com > > > ------------------------------------------------------------------------------ > _______________________________________________ > Matplotlib-users mailing list > Mat...@li... > https://lists.sourceforge.net/lists/listinfo/matplotlib-users > |
From: Shakthi K. <sha...@gm...> - 2015-09-30 03:49:44
|
Hi, --- On Tue, Sep 29, 2015 at 11:59 PM, Benjamin Root <ben...@gm...> wrote: | You have some logic issues here. First off, I wouldn't be updating the plot | in the same function that is updating the data values. Assuming that | "loop_start()" is asynchronous, the update frequency for it is likely to be | entirely different from the Animation update frequency. So, just have that | function do updates. \-- Okay. --- | You should also declare x, y, and z as globals in that | function so that the reassignment of those arrays persist properly. \-- Done. --- | Your list comprehension prior to concatenating uses a variable "x", which is | likely causing the current error that you see. Change that name to something | else. \-- Done. --- | Lastly, I implore you to use "set_data()" like in the original example, | rather than calling plot() repeatedly. \-- This is how the code looks like now: === BEGIN === import matplotlib as mpl from mpl_toolkits.mplot3d import Axes3D import numpy as np import matplotlib.pyplot as plt import matplotlib.animation as animation import sys import paho.mqtt.client as mqtt import itertools def update_line(num, dataLines, lines): for line, data in zip(itertools.repeat(lines, len(dataLines)), dataLines): line.set_data(data[0:2, :num]) # IndexError too many indices line.set_3d_properties(data[2, :num]) return lines def on_connect(client, userdata, flags, rc): print("Connected with result code "+str(rc)) client.subscribe("hello/world") def on_message(client, userdata, msg): global x, y, z data = msg.payload print(msg.topic+" "+str(msg.payload)) point = np.asarray([float(element) for element in data.split()]) print point x=np.concatenate((x,[point[0]])) y=np.concatenate((y,[point[1]])) z=np.concatenate((z,[point[2]])) fig = plt.figure() ax = fig.gca(projection='3d') ax.set_xlabel('X') ax.set_ylabel('Y') ax.set_zlabel('Z') x = np.array([1.0, 2.0, 3.0]) y = np.array([4.0, 7.0, 8.0]) z = np.array([6.0, 9.0, 5.0]) data = [x, y, z] lines, = ax.plot(x, y, z, label='Line') ax.legend() client = mqtt.Client() client.on_connect = on_connect client.on_message = on_message client.connect_async("localhost", 1883, 60) client.loop_start() line_ani = animation.FuncAnimation(fig, update_line, 25, fargs=(data, lines), interval=2000, blit=True) plt.show() === END === So, the error now is in line.set_data where it says there are too many indices. If I remove :num, in both line.set_data and line.set_3d_properties, it tells me that 'TypeError': 'Line3D' is not iterable. Thanks for patiently answering my queries. SK -- Shakthi Kannan http://www.shakthimaan.com |