Re: [Matplotlib-users] TypeError: can't multiply sequence by non-int of type 'float'
Hi, --- On Tue, Sep 29, 2015 at 11:59 PM, Benjamin Rootwrote: | 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 -- ___ Matplotlib-users mailing list Matplotlib-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/matplotlib-users
Re: [Matplotlib-users] TypeError: can't multiply sequence by non-int of type 'float'
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 [ 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 Matplotlib-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/matplotlib-users
Re: [Matplotlib-users] TypeError: can't multiply sequence by non-int of type 'float'
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 Kannanwrote: > 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 > > [ 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 > Matplotlib-users@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/matplotlib-users > --
Re: [Matplotlib-users] TypeError: can't multiply sequence by non-int of type 'float'
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. -- ___ Matplotlib-users mailing list Matplotlib-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/matplotlib-users
Re: [Matplotlib-users] TypeError: can't multiply sequence by non-int of type 'float'
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 -- ___ Matplotlib-users mailing list Matplotlib-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/matplotlib-users
Re: [Matplotlib-users] TypeError: can't multiply sequence by non-int of type 'float'
Jerzy, On Mon, Sep 28, 2015 at 4:25 PM, Jerzy Karczmarczuk < jerzy.karczmarc...@unicaen.fr> 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 -- ___ Matplotlib-users mailing list Matplotlib-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/matplotlib-users
Re: [Matplotlib-users] TypeError: can't multiply sequence by non-int of type 'float'
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 -- ___ Matplotlib-users mailing list Matplotlib-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/matplotlib-users