繁体   English   中英

将多条图形线平均为一条,python & matplotlib

[英]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。

  1. 导入库并加载数据
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)
  1. 使用 numpy 计算每个时间步的平均值
means_per_timestep = np.array(ys).mean(axis=0)
  1. Plot 它
plt.plot(x, means_per_timestep)

这是你所期待的吗?

阴谋

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM