[英]Averaging multiple graph lines into one, python & matplotlib
我是编码新手,请温柔。 我有一个主脚本,可以模拟在微重力条件下相互碰撞的粒子和墙壁:这部分脚本输出包含时间步长的单个数据文件。 总。 有 15 个粒子,所以我得到 15 个 txt 文件。
N_max = sim.getNumTimeSteps()
particleData = [ [] for x in range(len(sim.getParticleList()))]
for n in range (N_max):
sim.runTimeStep()
if (n%1000==0):
particles = sim.getParticleList()
for i in range(len(sim.getParticleList())):
print i
x, y, z = particles[i].getVelocity()
particleData[i].append( (n, x, y, z ))
print len(sim.getParticleList())
for i in range(len(sim.getParticleList())):
with open("{0:d}.dat".format(i), "w") as f:
for j in particleData[i]:
f.write("%f,%f \n" % (j[0], (math.sqrt(float(j[1])**2+float(j[2])**2+float(j[3])**2)) ))
sim.exit()
我需要努力的最终结果是这 15 个粒子随时间变化的平均值。 例如,在这个模拟中,它运行了 22000 个时间步,增量为 1000。如果我错了,请纠正我,但平均值应该是 (vtotal1+vtotal2+vtotal3+...vtotal15)/每个增量。 当它随时间绘制时,一条线代表模拟中 15 个粒子的平均速度? 这是我正在做的一个版本,它改编自另一个平均尝试。
import matplotlib
matplotlib.use('agg')
import matplotlib.pyplot as plt
import csv
import math
import numpy as np
x = []
y = []
y_mean = np.array([1 for _ in range(22000/1000)])
fig, axes = plt.subplots(nrows=1, ncols=1, figsize=(10, 7))
for i in range(15):
x = []
y = []
with open("{}.dat".format(i),'r') as csvfile:
plots = csv.reader(csvfile, delimiter=',')
for row in plots:
x.append(float(row[0]))
y.append(float(row[1]))
y_mean[int(float(row[0]) / 1000)] += y[-1]
axes.plot(x,y, color='skyblue', label="Total v {}".format(i+1))
axes.plot(x,y_mean, color='olive', label="Average v {}".format(i+1))
plt.title('Particles Over Time')
plt.xlabel('Timestep Number')
plt.grid(alpha=.5,linestyle='--')
plt.ylabel('Velocity')
plt.xlim(0, 2000)
plt.show()
plt.autoscale(enable=True, axis=y, tight=True)
plt.legend()
plt.savefig("round2avgs.png")
y_mean = np.asarray(y) / 15
我只是不知道出了什么问题。 任何帮助表示赞赏。
通常,您应该将数据处理和可视化分为两个不同的步骤。
假设您有 5 个 CSV,都具有相同的数据:
0,1
1000,2
2000,3
3000,4
4000,5
我们将其命名为 1.dat、2.dat... 3.dat。
import csv
import matplotlib.pyplot as plt
import numpy as np
x = []
ys = []
for i in range(5):
with open(f'{i+1}.dat') as data_file:
data = csv.reader(data_file, delimiter=',')
y = []
for row in data:
if i == 0:
x.append(float(row[0]))
y.append(float(row[1]))
ys.append(y)
means_per_timestep = np.array(ys).mean(axis=0)
plt.plot(x, means_per_timestep)
这是你所期待的吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.