TypeError: can't multiply sequence by non-int of type 'float'

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

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 <shakthimaan@…287…> 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

Matplotlib-users@lists.sourceforge.net

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

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/.

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

···

On Mon, Sep 28, 2015 at 2:28 PM, Jerzy Karczmarczuk < jerzy.karczmarczuk@...3937...> wrote:

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

···

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

···

On 28/09/15 22:25, Jerzy Karczmarczuk wrote:

Le 28/09/2015 21:03, Benjamin Root a écrit :

Jerzy,

···

On Mon, Sep 28, 2015 at 4:25 PM, Jerzy Karczmarczuk <jerzy.karczmarczuk@…3937…> wrote:

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 21:03, Benjamin Root a écrit :

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

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.

···

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.

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

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 <shakthimaan@…287…> 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

Hi,

···

--- On Tue, Sep 29, 2015 at 11:59 PM, Benjamin Root <ben.v.root@...287...> 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