Hi, --- On Tue, Sep 29, 2015 at 11:59 PM, Benjamin Root <[email protected]> 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 [email protected] https://lists.sourceforge.net/lists/listinfo/matplotlib-users