我正在用Python写一个项目,其中包括matplotlib的动画。问题是我必须想象一个分为两行两列的窗口,所以有4个子图。在ax[0,0]
,ax[0,1]
和ax[1,0]
中,我有矩阵。在ax[1][1]
中,是一个二维线图。子图与矩阵的动画工作正常,但线一个不。
错误是:
list object has no attribute set_data
字符串
代码很长,所以我会做一个模式化。你能告诉我我做错了什么吗?
rows, cols = 2, 3
fig, ax = plt.subplots(nrows=rows, ncols=cols, num=None, figsize=(16, 12), dpi=80, facecolor='w', edgecolor='k')
# Initialization of matrices MATR1, MATR2, MATR3 all cells set to 0 #
# Coordinates lists for the line plot
x_time = []
y_values = []
index = count()
im = list()
im.append(ax[0][0].imshow(MATR1, cmap='Reds', animated=True))
im.append(ax[0][1].imshow(MATR2, cmap='Greens', animated=True))
im.append(ax[1][0].imshow(MATR3, animated=True))
im.append(ax[1][1].plot(x_time, y_values, animated=True))
def animate(i):
ax[1][1].cla()
# Here a lot of code that determines the values that are inserted into the matrices and the value
# to add in the y_values coordinates list for the line #
x_time.append(next(index))
y_values.append(len(ind_list))
im[0].set_array(MATR1)
im[1].set_array(MATR2)
im[2].set_array(MATR3)
im[4].set_data(x_time, y_erbpopulation) # ERROR FROM HERE
return im
ani = FuncAnimation(fig, update, frames=NUMDAYS-1, interval=10, blit=True, repeat=False)
型
更新问题:
在进行了一些建议的更改后,我的动画仍然没有显示。下面是我更新的代码。
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
import numpy as np
fig, ax = plt.subplots(2,2, num=None, figsize=(16, 12), dpi=80, facecolor='w', edgecolor='k')
MATR1 = np.zeros((100, 100))
MATR2 = np.zeros((100, 100))
MATR3 = np.zeros((100, 100))
# Coordinates lists for the line plot
x_time = []
y_values = []
im = list()
im.append(ax[0][0].imshow(MATR1, cmap='Reds', animated=True))
im.append(ax[0][1].imshow(MATR2, cmap='Greens', animated=True))
im.append(ax[1][0].imshow(MATR3, animated=True))
im.append(ax[1][1].plot(x_time, y_values, animated=True)[0])
def animate(i):
ax[1][1].cla()
# Here a lot of code that determines the values that are inserted into the matrices and the value
# to add in the y_values coordinates list for the line, let's say now i+5 #
x_time.append(i)
y_values.append(i+5)
im[0].set_array(MATR1)
im[1].set_array(MATR2)
im[2].set_array(MATR3)
im[4].set_data(x_time, y_values)
return im
ani = FuncAnimation(fig, update, frames=100, interval=10, blit=True, repeat=False)
型
2条答案
按热度按时间piwo6bdm1#
如果查看matplotlib plotting documentation,您将看到
ax.plot
返回Line2D
对象的列表。在本例中,该列表仅包含单个对象。但是,当您只需要Line2D
对象时,您将列表附加到im
。所以,你只需要索引返回的第一个值如下:字符串
更新的解决方案:
animated=True
的使用并不是你所想的那样,它是用于手动创建带有印迹的动画(参见here)。因此,这些应该被删除。1.你不需要
ax[1,1].cla()
。使用set_data
将处理更新。1.您需要设置轴限制,因为默认值将超出范围(matplotlib在绘制图时不知道范围)。
型
的数据
3duebb1j2#
发生错误的原因是列表不支持set_data()方法。您需要创建一个Line2D对象而不是列表,以便能够使用set_data()方法。
这应该可以工作:
字符串