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

2015-09-29 Thread Shakthi Kannan
Hi,

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

--
___
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'

2015-09-29 Thread 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
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'

2015-09-29 Thread Benjamin Root
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 
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
> 
> [ 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'

2015-09-28 Thread Eric Firing
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'

2015-09-28 Thread Jerzy 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.

> 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'

2015-09-28 Thread Benjamin Root
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'

2015-09-28 Thread Daniele Nicolodi
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