Discussion:
[Matplotlib-users] TypeError: can't multiply sequence by non-int of type 'float'
Shakthi Kannan
2015-09-26 07:46:53 UTC
Permalink
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

------------------------------------------------------------------------------
Benjamin Root
2015-09-28 15:43:28 UTC
Permalink
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.
Post by Shakthi Kannan
Hi,
I am trying to create poly lines using matplotlib and animation. My
=== 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
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 ===
=== 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
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
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
https://lists.sourceforge.net/lists/listinfo/matplotlib-users
Jerzy Karczmarczuk
2015-09-28 18:28:04 UTC
Permalink
Shakhti Kannan tries to multiply a list by a float, and Python disagrees.
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/.



------------------------------------------------------------------------------
Benjamin Root
2015-09-28 19:03:39 UTC
Permalink
On Mon, Sep 28, 2015 at 2:28 PM, Jerzy Karczmarczuk <
Post by Jerzy Karczmarczuk
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.
Post by Jerzy Karczmarczuk
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
Jerzy Karczmarczuk
2015-09-28 20:25:08 UTC
Permalink
Post by Benjamin Root
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.
Post by Benjamin Root
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


------------------------------------------------------------------------------
Benjamin Root
2015-09-28 20:38:36 UTC
Permalink
Jerzy,

On Mon, Sep 28, 2015 at 4:25 PM, Jerzy Karczmarczuk <
Post by Benjamin Root
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
Post by Benjamin Root
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
Daniele Nicolodi
2015-09-28 20:36:16 UTC
Permalink
Post by Jerzy Karczmarczuk
Post by Benjamin Root
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.
Post by Jerzy Karczmarczuk
Post by Benjamin Root
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


------------------------------------------------------------------------------
Eric Firing
2015-09-28 21:15:02 UTC
Permalink
Post by Benjamin Root
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.

------------------------------------------------------------------------------
Shakthi Kannan
2015-09-29 18:05:09 UTC
Permalink
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

------------------------------------------------------------------------------
Benjamin Root
2015-09-29 18:29:34 UTC
Permalink
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
Post by Shakthi Kannan
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
=== 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
print x, y, z
l, = ax.plot(x, y, z, label='Line')
return l,
print("Connected with result code "+str(rc))
client.subscribe("hello/world")
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 ===
=== 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 ]
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
https://lists.sourceforge.net/lists/listinfo/matplotlib-users
Shakthi Kannan
2015-09-30 03:49:38 UTC
Permalink
Hi,

--- On Tue, Sep 29, 2015 at 11:59 PM, Benjamin Root
<***@gmail.com> 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

------------------------------------------------------------------------------
Loading...