numpy Matplotlib set_data不显示行

fae0ux8s  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(63)

在以前的代码版本中,我清除了绘图并重新绘制了数据,直到最近计算的数据点。为了加快绘图速度,我试图切换到使用set_data,所以我没有清除每一步。不幸的是,我无法使用此更改生成一条线。
下面您可以看到我尝试使用set_data来绘制顶部图,但我保留了原始方法来绘制底部图。
请让我知道如何解决这个问题。

import matplotlib.pyplot as plt
import numpy as np

plt.close("all")

frames = 200
x = np.linspace(0, 4*np.pi, frames)
y1 = np.sin(x)
y2 = np.cos(x)

fig, (ax1, ax2) = plt.subplots(2, 1)
line1, = ax1.plot([], [])
line2, = ax2.plot([], [])
ax1.set_xlim(x.min()*1.1, x.max()*1.1)
ax1.set_ylim(y1.min()*1.1, y1.max()*1.1)

def animate(i):
    line1.set_data(x[i], y1[i])
    
    ax2.cla()
    ax2.plot(x[:i], y2[:i])
    ax2.set_xlim(x.min()*1.1, x.max()*1.1)
    ax2.set_ylim(y2.min()*1.1, y2.max()*1.1)
    
    plt.pause(0.01)

for i in range(20*frames):
    animate(i%frames)

字符串

wyyhbhjk

wyyhbhjk1#

我在这个问题上的错误是一个非常基本的错误,并且是基于对set_data函数的误解。我认为我需要传入一个新的数据点,但实际上你需要传入整个数据集,但要更新点。
因此,代码最终看起来如下:

import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
import numpy as np

plt.close("all")

frames = 200
x = np.linspace(0, 4*np.pi, frames)
y1 = np.sin(x)
y2 = np.cos(x)

fig, (ax1, ax2) = plt.subplots(2, 1)
line1, = ax1.plot([], [])
line2, = ax2.plot([], [])
ax1.set_xlim(x.min()*1.1, x.max()*1.1)
ax1.set_ylim(y1.min()*1.1, y1.max()*1.1)

def animate(i):
    line1.set_data(x[:i], y1[:i])
    
    ax2.cla()
    ax2.plot(x[:i], y2[:i])
    ax2.set_xlim(x.min()*1.1, x.max()*1.1)
    ax2.set_ylim(y2.min()*1.1, y2.max()*1.1)
    
    plt.pause(0.01)

for i in range(20*frames):
    animate(i%frames)

字符串
而且,正如@Lutz Lehmann在评论中建议的那样,我可以使用FuncAnimation很容易地做到这一点,如下所示。

import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
import numpy as np

plt.close("all")

frames = 200
x = np.linspace(0, 4*np.pi, frames)
y1 = np.sin(x)
y2 = np.cos(x)

fig, (ax1, ax2) = plt.subplots(2, 1)
line1, = ax1.plot([], [])
line2, = ax2.plot([], [])
for ax in (ax1, ax2):
    ax.set_xlim(x.min()*1.1, x.max()*1.1)
    ax.set_ylim(y1.min()*1.1, y1.max()*1.1)

def animate(i):
    line1.set_data(x[:i], y1[:i])
    line2.set_data(x[:i], y2[:i])
    return (line1, line2), 

anim = FuncAnimation(fig, animate, frames=frames, interval=0.01)

相关问题