matplotlib 为混合矩阵和线图的子图设置动画

byqmnocz  于 2023-08-06  发布在  其他
关注(0)|答案(2)|浏览(116)

我正在用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)

piwo6bdm

piwo6bdm1#

如果查看matplotlib plotting documentation,您将看到ax.plot返回Line2D对象的列表。在本例中,该列表仅包含单个对象。但是,当您只需要Line2D对象时,您将列表附加到im。所以,你只需要索引返回的第一个值如下:

im.append(ax[1][1].plot(x_time, y_values, animated=True)[0])

字符串
更新的解决方案:

  1. animated=True的使用并不是你所想的那样,它是用于手动创建带有印迹的动画(参见here)。因此,这些应该被删除。
    1.你不需要ax[1,1].cla()。使用set_data将处理更新。
    1.您需要设置轴限制,因为默认值将超出范围(matplotlib在绘制图时不知道范围)。
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
import numpy as np

plt.close("all")

fig, ax = plt.subplots(2, 2, figsize=(16, 12),)

MATR1 = np.random.random((100, 100))
MATR2 = np.random.random((100, 100))
MATR3 = np.random.random((100, 100))

x_time = []
y_values = []

im = []
im.append(ax[0][0].imshow(MATR1, cmap='Reds'))
im.append(ax[0][1].imshow(MATR2, cmap='Greens'))
im.append(ax[1][0].imshow(MATR3))
im.append(ax[1][1].plot(x_time, y_values)[0])

ax[1,1].set_xlim(0, 100)
ax[1,1].set_ylim(5, 105)

def animate(i):    
    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[3].set_data(x_time, y_values)

    return im

ani = FuncAnimation(fig, animate, frames=100, interval=10, blit=True, repeat=False)


的数据

3duebb1j

3duebb1j2#

发生错误的原因是列表不支持set_data()方法。您需要创建一个Line2D对象而不是列表,以便能够使用set_data()方法。
这应该可以工作:

import matplotlib.pyplot as plt
import matplotlib.animation as animation

# Initialize the matrices and the line plot
MATR1 = np.zeros((100, 100))
MATR2 = np.zeros((100, 100))
MATR3 = np.zeros((100, 100))
x_time = []
y_values = []

# Create the subplots
fig, ax = plt.subplots(2, 2)
im1 = ax[0, 0].imshow(MATR1, cmap='Reds', animated=True)
im2 = ax[0, 1].imshow(MATR2, cmap='Greens', animated=True)
im3 = ax[1, 0].imshow(MATR3, animated=True)
line = ax[1, 1].plot([], [], animated=True)

# Create the animation
def animate(i):
    ax[1, 1].cla()
    x_time.append(i)
    y_values.append(i * i)
    im1.set_array(MATR1)
    im2.set_array(MATR2)
    im3.set_array(MATR3)
    line.set_data(x_time, y_values)
    return im1, im2, im3, line

ani = animation.FuncAnimation(fig, animate, frames=100, interval=100)
plt.show()

字符串

相关问题