首页 > 解决方案 > 为什么我保存视频时,动画会显示在 matplotlib FuncAnimation 函数中绘制的曲线下方?

问题描述

我想绘制一个相图,其中一些点沿着单独的相图轨迹移动,但事实证明,这些点在我保存后移动到轨迹后面(如果我只使用它看起来不错plt.show())。一开始我还以为是不是因为我plot()调用后使用FuncAnimation的,但是改了之后没啥区别,好像不是因为scatter()我用plot()了(动画用的时候也是这样)

在此处输入图像描述

如图所示,沿着轨迹移动的点在这些曲线的后面,当曲线密集时,这是无法观察到的。

这是代码

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
plt.rcParams['animation.ffmpeg_path'] = r'E:\ffmpeg\bin\ffmpeg.exe' 
from matplotlib.animation import FuncAnimation

UIdata =  np.loadtxt('data_omega_bar_uncoupled.txt')
# UIdata = UIdata[:,15000:20001]
n = int(np.shape(UIdata)[0]/2)
length = int(np.shape(UIdata)[1])

data = []

for k in range(n):
    data_sep = np.zeros((2,length))
    for i in range(length):
        for j in range(2):
            if j == 0:
                #set values for Re
                data_sep[j][i] = UIdata[k][i]
            else:
                #set values for Im
                data_sep[j][i] = UIdata[k+n][i]
    data_sep = data_sep[:,35000:40000]
    data.append(data_sep)
    
N = np.shape(data_sep)[1]

c = np.array([0.0,0.1,0.9,0.7,0.5,0.55,0.3,0.2])

mpl.rcParams['axes.linewidth']=1.0
mpl.rcParams['xtick.labelsize']='20.0'
mpl.rcParams['ytick.labelsize']='20.0'
mpl.rcParams['axes.titlesize']='30.0'
mpl.rcParams['axes.titlepad']='15.0'
mpl.rcParams['axes.labelsize']='25.0'
mpl.rcParams['axes.labelpad']='12.0'

plt.rcParams['font.family'] = 'Times New Roman'

fig = plt.figure(figsize=(20,20)) 
xmax = 65 
ymax = 65
ax =  fig.add_subplot(111, xlim=(-xmax,xmax), ylim=(-ymax,ymax))

ax.set_xlabel('X ')
ax.set_ylabel('Y ')

ax.set_title('Phase diagram in rotational frame uncoupled')

yy0, xx0 = UIdata[8][15000:35001], UIdata[0][15000:35001]
yy1, xx1 = UIdata[9][15000:35001], UIdata[1][15000:35001]
yy2, xx2 = UIdata[10][15000:35001], UIdata[2][15000:35001]
yy3, xx3 = UIdata[11][15000:35001], UIdata[3][15000:35001]
yy4, xx4 = UIdata[12][15000:35001], UIdata[4][15000:35001]
yy5, xx5 = UIdata[13][15000:35001], UIdata[5][15000:35001]
yy6, xx6 = UIdata[14][15000:35001], UIdata[6][15000:35001]
yy7, xx7 = UIdata[15][15000:35001], UIdata[7][15000:35001]

ax.plot(xx7,yy7,color='yellow',linewidth=1,label='67.4kHz')
ax.plot(xx6,yy6,color='green',linewidth=1,label='61.8kHz')
ax.plot(xx5,yy5,color='tab:blue',linewidth=1,label='56.1kHz')
ax.plot(xx4,yy4,color='cyan',linewidth=1,label='50.5kHz')
ax.plot(xx3,yy3,color='blue',linewidth=1,label='44.9kHz')
ax.plot(xx2,yy2,color='magenta',linewidth=1,label='39.3kHz')
ax.plot(xx1,yy1,color='wheat',linewidth=1,label='33.6kHz')
ax.plot(xx0,yy0,color="lightcoral",linewidth=1,label='28.0kHz')

ax.legend()

oscillators = ax.scatter([], [], c=[], cmap="hsv", s=25, vmin=0, vmax=1)

def animate(i):
    thisx = [data[0][0][i],data[1][0][i],data[2][0][i],data[3][0][i],data[4][0][i],
              data[5][0][i],data[6][0][i],data[7][0][i]]
    # thisx = [1,2,3,4,5,6,7,8]
    thisy = [data[0][1][i],data[1][1][i],data[2][1][i],data[3][1][i],data[4][1][i],
              data[5][1][i],data[6][1][i],data[7][1][i]]
    this = [thisx,thisy]
    this = np.array(this).T
    oscillators.set_offsets(this)
    oscillators.set_array(c)
    return oscillators,
    

anim = FuncAnimation(fig, animate, N, interval=20, blit=True)
plt.show()

anim.save('phase diagram in rotating frame uncoupled.mp4',writer='ffmpeg')

标签: pythonnumpymatplotlibplot

解决方案


推荐阅读