【问题标题】:How to create overlay plots from 20 CSV files in Python 2?如何在 Python 2 中从 20 个 CSV 文件创建叠加图?
【发布时间】:2019-03-14 12:58:19
【问题描述】:

我在 python 2 中执行的每个长计算都会生成 20 个 CSV 文件。从每个文件中的所有数据集中,这里有 2 个很重要。第一个设置为 x 轴上的 row[0],第三个设置为 y 轴上的 row[2]。第一组 (row[0]) 总是相同的,所以一个条目就足够了,但是第三组 (row[2]) 由文件更改,需要根据我的需要绘制在 (row[0]) 上绘制所有叠加文件中的所有第三组。

我不是程序员,但我可以按照以下方式单独绘制它们:

import matplotlib.pyplot as plt
import csv

x = []
y = []

with open('energy.csv','r') as csvfile:
    plots = csv.reader(csvfile, delimiter=',')
    for row in plots:
        x.append(row[0])
        y.append(row[2])

plt.plot(x,y, label='Energies')
plt.xlabel('x')
plt.ylabel('y')
plt.title('Energy Graph\n per particle')
plt.legend()
plt.savefig('energy.png')
plt.savefig('energy.pdf')

plt.show()

但要叠加所有数据集,我想尝试“for file_name in files:”将数据集作为变量附加到文件名,并将它们全部绘制在一张图中:

for dirpath, dirnames, files in os.walk('.'):
    for file_name in files:
            if file_name.endswith('.csv'):
                    print(file_name)
                    with open(file_name,'r') as csvfile:
                            plots = csv.reader(csvfile, delimiter=',')
                            for row in plots:
                                    x.append(row[0])
                                    file_name.append(row[2])
            plt.plot(x,file_name, label='Loaded from file!')
            plt.xlabel('x')
            plt.ylabel('y')
            plt.title('Energy')
            plt.legend()
            plt.savefig('1.png')
            plt.savefig('1.pdf')

            plt.show()

然后我得到这个错误:

file_name.append(行[1]) AttributeError: 'str' 对象没有属性 'append'

任何帮助将不胜感激

【问题讨论】:

  • 你想用x.appendfilename.append 达到什么目的?
  • 我猜 x.append 附加了我在 row[0] 中的数据集?这很有效,因为我明白了情节。我希望我可以通过将集合作为变量附加到文件名中来从每个文件中获取每第三行 [],然后将每个文件的第三行中的所有 20 个集合绘制在彼此之上。我不是程序员,所以我无法评论它是如何工作的,但如果有任何其他建议,那就太好了。

标签: python csv matplotlib plot overlay


【解决方案1】:

要创建叠加图,请反复调用plt.plot()


for dirpath, dirnames, files in os.walk('.'):
    for file_name in files:
        if file_name.endswith('.csv'):
            print(file_name)
            x = []
            y = []
            with open(file_name,'r') as csvfile:
                plots = csv.reader(csvfile, delimiter=',')
                for row in plots:
                    x.append(row[0])
                    y.append(row[2])
            plt.plot(x,y, label=file_name)

plt.xlabel('x')
plt.ylabel('y')
plt.title('Energy')
plt.legend()
plt.show()

示例:
a.csv

1,3,4,3,5
3,2,5,2,5

b.csv

1,3,2,3,5
3,2,6,2,5

然后你会得到这个情节:

但如果 CSV 文件包含数字数据,我建议使用 NumPy,因为它速度很快。 :

import os
import numpy as np
import matplotlib.pyplot as plt

for dirpath, dirnames, files in os.walk('.'):
    for file_name in files:
        if file_name.endswith('.csv'):
            print(file_name)
            data = np.loadtxt(file_name, delimiter=',').transpose()
            plt.plot(data[0], data[2], label=file_name)
plt.xlabel('x')
plt.ylabel('y')
plt.title('Energy')
plt.legend()
plt.show()

【讨论】:

  • 谢谢,这会横向处理数据,如果我提供横向数据:1,2,3,4,5,6,7,8 32,65,4,21,854,5,1423, 25 5,4,32,132,1568,48,798,452 1,213,15,4,364,654,64,84 56,465,45,65,46,46,5456,4 在读取第一个文件后出现此错误:return array(a, dtype, copy=False , order=order) ValueError: could not convert string to float:
  • 在 452 和 1 之间缺少逗号?
  • 是4行x 8列的数据集,评论区不让我编辑。
  • 文件是否有标题、空白或其他非数字数据?您可以使用np.genfromtxt(filename, delimiter=',') 忽略非数字数据。
  • 感谢您指出这一点,但为了让它发挥作用,我使用了一组简单的数据。我如何从每个文件中获取第三组 y.append.(row[0]) (以及最后用作标签的 file_name)并将它们写入一个新的 csv 文件,然后绘制所有数据集从最终文件 new_y.append() 以及用于绘制图形的标签?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-24
  • 1970-01-01
  • 2018-10-05
  • 1970-01-01
  • 1970-01-01
  • 2020-04-04
  • 1970-01-01
相关资源
最近更新 更多