Hi,

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

------------------------------------------------------------------------------
_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users

Reply via email to