python - 将多条图形线平均为一条,python 和 matplotlib
问题描述
我是编码新手,请温柔!我有一个主脚本,可以模拟在微重力条件下相互碰撞的粒子和墙壁。这部分脚本输出包含:timestep、vtotal 的各个数据文件。有 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)
- 使用 numpy 计算每个时间步的平均值
means_per_timestep = np.array(ys).mean(axis=0)
- 绘制它
plt.plot(x, means_per_timestep)
这是你所期待的吗?
推荐阅读
- selenium - 在 Selenium 和 Java 中设置查找超时
- php - 在 2 个选项卡中工作时如何修复会话过期 - Laravel 5.7
- javascript - For of loop 进行 HTTPS 地理编码 api 调用并在结果上将坐标输入 SQL 数据库,如何让 Node 的 HTTPS 模块工作?
- java - 错误 Firebase Cloud Messaging FCM,无法发送消息
- keras - 基于第二个输出的条件损失
- ios - 如何从向上滑动并杀死 IOS 聊天应用程序发送交货确认
- python - 如何使用 matplotlib 读取文本文件和绘图
- php - Laravel - 连接时重定向
- sql - 如何从雅典娜的 DOB 中找到年龄?
- angularjs - 如何删除从父指令注入的组件的范围