Matplotlib的set_data函数中,xdata和ydata的长度必须相同,否则会出现错误。

5
我有一个简单的matplotlib图表,我想通过一个函数来添加点。但是当我扩展存储x和y值的数组时,尽管这两个数组都有6个值,但我却得到了错误信息RuntimeError: xdata and ydata must be the same length
import matplotlib.pyplot as plt
import numpy as np
import time

x = np.array([1, 2, 3])
y = np.array([1, 7, 5])

plt.ion()

fig = plt.figure()
ax = fig.add_subplot(111)
line1, = ax.plot(x, y, 'r-')
plt.show()


def update_points(new_x, new_y):
    global x, y, fig, line1, ax
    time.sleep(2)
    x = np.append(x, new_x)
    y = np.append(y, new_y)
    line1.set_xdata(x)
    line1.set_xdata(y)
    ax.relim()
    ax.autoscale_view()
    fig.canvas.draw()


update_points(np.array([4, 5, 6]), np.array([4, 5, 3]))

您打错了:line1.set_xdata(y) 应该改为 line1.set_ydata(y) - a_guest
2个回答

9

之所以如此,是因为您已经使用引用变量line1创建了一个图表。因此,当您执行创建的函数时,第一次说,您已经有了一个绘图,因此仅更改一个轴会导致错误。

所以这是错误的

line1.set_xdata(x) line1.set_xdata(y)

将其更改为

line1.set_data(x,y)

如果您已经绘制了图表,请使用plt.draw()进行重绘以查看更改。


谢谢。这个可以用,但似乎还需要使用fig.canvas.draw()而不是plt.draw() - user2242044
是的,因为在这里,你是第一次绘制它。我说“如果”你已经画过了,你会想要重新绘制,所以那个命令。 - Aakash Verma
明白了,那么如果我多次调用它,有没有办法检查绘图是否已经被绘制并调用 plt.draw() 而不是第二次调用? - user2242044
你为什么要检查呢?只需执行plt.draw()或fig.canvas.draw()即可查看更改。两者的效果相同。 - Aakash Verma
好的,我认为plt.draw()可能更好,但仍然需要使用fig.canvas.draw()。 - user2242044
我不是很确定其中的区别,请自行查阅。 - Aakash Verma

2
我知道这是一个旧帖子,但对于任何仍在查看此内容的人,有两种解决此问题的方法。
第一种解决方案是Aakash Verma在他们的解决方案中所写的,即将line1.set_xdata(x)line1.set_xdata(y)替换为简单的line1.set_data(x,y),假设输入x和y的长度相同,这将保持xdataydata相同的长度。
第二个解决方案是注意到
user2242044只是犯了一个打字错误,两次写了set_xdata,而第二次应该是set_ydata。 这就是导致RuntimeError: xdata and ydata must be the same length(或者对我来说使用Python 3时是ValueError: shape mismatch: objects cannot be broadcast to a single shape)的原因,因为程序两次添加到xdata,而没有匹配的ydata进行绘制。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接