python - 为什么我保存视频时,动画会显示在 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')
解决方案
推荐阅读
- javascript - Select2:使用 ajax 创建标签
- azure - 超大规模数据库上 New-AzSqlDatabaseCopy 的替代方案
- vue.js - 使用 Vue.JS 时,我们是否被迫在 CSP 中使用“unsafe-inline”?
- github - 从 GitHub 下载目录
- java - Android Studio Request App Permissions cant compile 显示错误:缺少数组维度
- c - 如何设置有理数小数展开的精度级别
- javascript - 反应钩子:无法更新功能组件内的状态
- python - 我应该怎么做才能使用烧瓶脚本连接到已经运行的烧瓶实例并在 ubuntu 的终端内单击
- java - 可运行的执行时间为每个 cron 滴答声两次
- javascript - 如何在带有 Javascript/node.js 的 SQL 语句中使用 MySQL 变量?