Re: [Matplotlib-users] TypeError: can't multiply sequence by non-int of type 'float'

2015年9月29日 11:36:04 -0700

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 <shakthim...@gmail.com>
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
> Matplotlib-users@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/matplotlib-users
>
------------------------------------------------------------------------------
_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users

Reply via email to