我正在调整来自this matplotlib example的代码,但是我发现在我的动画中,每个粒子似乎都会跳回到它的初始位置,但不是所有粒子都在同一时间?我无法弄清楚为什么会出现这种情况(我正确输入数据吗?)。
我有一个程序模拟围绕中心质量的测试粒子。程序以新行分隔的块输出数据。每个块由每个粒子的新行组成,每行有3个数字,每个维度1个。
以下是相关代码:
import numpy as np
import matplotlib.pyplot as plt
import mpl_toolkits.mplot3d.axes3d as p3
import matplotlib.animation as animation
import csv
#read in data
with open('tmpfile', 'rb') as csvfile:
reader = csv.reader(csvfile, delimiter='\t')
data = np.array([[float(field) for field in row]
for row in filter(lambda x: x != [], reader)])
print(data.shape)
data = data.reshape((21, -1, 3)).swapaxes(1,2)
print(data.shape)
def update_points(num, dataPoints, points) :
for point, data in zip(points, dataPoints) :
point.set_data(data[0:2, num-1:num])
point.set_3d_properties(data[2,num-1:num])
return points
#prepare plot
fig = plt.figure()
ax = p3.Axes3D(fig)
points = [ax.plot(dat[0, 0:1], dat[1, 0:1], dat[2, 0:1], c='b', marker='o')[0] for dat in data]
# Set the axes properties
ax.view_init(90, 90)
ax.set_xlim3d([-8.0, 8.0])
ax.set_xlabel('X')
ax.set_ylim3d([-8.0, 8.0])
ax.set_ylabel('Y')
ax.set_zlim3d([-1.0, 1.0])
ax.set_zlabel('Z')
#Create the Animation object
ani = animation.FuncAnimation(fig, update_points, 101, fargs=(data, points),
interval=500, blit=False)
plt.show()
以下是输出文件格式的示例(对于21个粒子和2个时间步,link to full file with all 100 timesteps):
0 0 0
1.954 -0.4259 0
0.7562 -1.852 0
2.308 1.917 0
-1.032 -2.817 0
2.001 2.235 0
3.813 1.208 0
-1.888 3.526 0
2.298 -3.274 0
2.556 3.077 0
-4.664 1.802 0
2.719 4.196 0
-3.991 3.012 0
-4.018 2.976 0
4.398 -2.379 0
3.924 -4.539 0
-1.954 -5.673 0
-2.751 5.332 0
3.87 4.585 0
5.725 -1.796 0
5.369 -2.678 0
0 0 0
1.956 -0.419 0
0.7627 -1.849 0
2.304 1.922 0
-1.026 -2.819 0
1.996 2.239 0
3.812 1.212 0
-1.892 3.524 0
2.302 -3.271 0
2.553 3.08 0
-4.666 1.798 0
2.715 4.198 0
-3.994 3.008 0
-4.02 2.973 0
4.4 -2.375 0
3.927 -4.536 0
-1.95 -5.674 0
-2.755 5.33 0
3.867 4.588 0
5.726 -1.792 0
5.371 -2.674 0
提前致谢。
答案 0 :(得分:0)
让我们考虑一个2个时间步长和3个粒子的小例子:
In [175]: data = np.arange(6*3).reshape(6,3); data
Out[175]:
array([[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8],
[ 9, 10, 11],
[12, 13, 14],
[15, 16, 17]])
如果我们使用data.reshape(3, -1, 3).swapaxes(1, 2)
,我们就会获得
In [176]: data.reshape(3, -1, 3).swapaxes(1, 2)
Out[176]:
array([[[ 0, 3],
[ 1, 4],
[ 2, 5]],
[[ 6, 9],
[ 7, 10],
[ 8, 11]],
[[12, 15],
[13, 16],
[14, 17]]])
请注意,第一个粒子的位置变为[0,1,2]和[3,4,5]。 但我们希望第一个粒子的位置为[0,1,2]和[9,10,11]。
所以改为使用
In [177]: data.reshape((-1, 3, 3)).transpose([1, 2, 0])
Out[177]:
array([[[ 0, 9],
[ 1, 10],
[ 2, 11]],
[[ 3, 12],
[ 4, 13],
[ 5, 14]],
[[ 6, 15],
[ 7, 16],
[ 8, 17]]])
因此,改变
data = data.reshape((21, -1, 3)).swapaxes(1,2)
到
data = data.reshape((-1, 21, 3)).transpose([1, 2, 0])