如何使用Python读取多个CSV文件,存储数据并在一个图中绘制 [英] How to read multiple CSV files, store data and plot in one figure, using Python

查看:50
本文介绍了如何使用Python读取多个CSV文件,存储数据并在一个图中绘制的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有几个.csv文件,我想从此文件中绘制图形.这些文件包含两列,每个csv文件的第一列均相同.

I have several .csv files, and i wanted to draw a graph from this files. These files contains two columns , whose the first column is the same for each csv files.

file1.csv:

file1.csv:

20 -4.140462670
25 -4.140537060
30 -4.140571620
35 -4.140581580
40 -4.140584350

file2.csv:

file2.csv:

20 -4.140468880
25 -4.140542900
30 -4.140577590
35 -4.140587560
40 -4.140590330

我尝试使用以下脚本,以绘制第一个脚本:

I tried with the script below, in order to plot the first:

import matplotlib.pyplot as plt
from matplotlib.ticker import FormatStrFormatter

with open('file1.csv') as f:
    f=[x.strip() for x in f if x.strip()]
    data=[tuple(map(float,x.split())) for x in f[0:]]
    oX=[x[0] for x in data]
    oY=[x[1] for x in data]

plt.figure(figsize=(9,6))
ax = plt.subplot(111)

ax.yaxis.set_major_formatter(FormatStrFormatter('%.4f'))
ax.plot(oX, oY, color='blue', linestyle='dashdot', linewidth=2, marker='o', markerfacecolor='red', markeredgecolor='black',markeredgewidth=2, markersize=6)

plt.show()

结果如下:

但是我想绘制一个包含两条曲线的图形(file1.csv和file2.csv)

but I want to draw a graph that contains both curves (file1.csv and file2.csv)

在另一时间,使用以下命令(使用xmgrace软件)解决了问题:xmgrace -free -nxy *

In the other time,the problem is solved (with xmgrace software) using the command: xmgrace -free -nxy *

我的问题是:读取多个文件后,能否绘制包含多个曲线的图形.csv(file1.csv,file2.csv,file3.csv ....).

my question is: can I draw a graph that contains multiple curves, after reading multiple files. csv (file1.csv, file2.csv, file3.csv ....).

我注意到我有:
1)n个CSV (file1.csv,file2.csv,file3.csv ....).
2)相同的X坐标
3)不同的Y坐标

I note that I have:
1) n amount of CSV (file1.csv, file2.csv, file3.csv ....).
2) same X coordinates
3) different Y coordinates

推荐答案

以下是我的代码来解决您的问题,使其变得更健壮,以便您可以更好地了解正在发生的事情.您还可以分析许多其他文件,例如 .txt .另外,在某些情况下,您可能会发现CSV文件用';'分隔这是不正确的,因为那不是CSV文件的格式,但是您也可以分析该文件.只要确定每个值之间的分隔符是什么,您就可以在下面的第二行代码中更改该字符.例如,在给定的数据中,分隔符为''(每个值之间的空格).请参阅下面的代码,以便您了解我的意思:

Here is my code to solve your problem, made it robust so you can understand better what is going on. Also you can analyze many other files, like .txt for example. Also, in some cases you might find that the CSV file is separated with ';' which is not correct since that is not what a CSV file should be, but however, you can analyze that file too. Just be sure what the separator is between every value and you can change that character in the second line of code below. For example, in the data you gave the separator is ' ' (an space between each value). See the code below so you know what I mean:

numFiles = 2 #Number of CSV files in your directory
separator = "," #Character that separates each value inside file
fExtension = ".csv" #Extension of the file storing the data

def MultiplePlots(xValues, allYValues):
    'Method to plot multiple times in one figure.'

    for yValues in allYValues:
        plt.plot(list(map(int, xValues)), list( map(float, yValues) ), label = "file" + str(i))

    plt.legend(loc = 'best')
    plt.show()
    return

def GetXandYValues(coordinates):
    'Method to get all coordinates from all CSV files.'
    xValues = []
    yValues = []
    allYValues = []
    fst = False
    for file in coordinates:
        for coordinate in file:
            if (fst == False):
                xValues.append(coordinate[0])
            yValues.append(coordinate[1])
        fst = True
        allYValues.append( yValues )
        yValues = []
    return xValues, allYValues

def GetCoordinates( n , separator , fExtension ):
    'Iterates through multiple CSV files and storing X values and Y values in different Lists'
    coordinates = [] #coordinates[0] = x values --- coordinates[1] = y values
    for i in range(n):
        coordinates.append( FillList( ReadFile("file" + str(i+1) + fExtension), separator ) )
    return coordinates

def ReadFile(path):
    'Function to read CSV file and store file data rows in list.'
    try:
        fileCSV = open(path,"r") #Opens file
        data = fileCSV.read() #Save file data in string
        listData = data.splitlines() #Split lines so you have List of all lines in file
        fileCSV.close() #Close file
    finally:
        return listData #Return list with file's rows

def FillList(myList, separator):
    'With this method you make a list containing every row from CSV file'
    valueTemp = ""
    listTemp = []
    newList = []
    for line in myList:
        for c in line:
            if c != separator:
                valueTemp += c
            else:
                listTemp.append( valueTemp )
                valueTemp = ""
        listTemp.append( valueTemp )
        newList.append(listTemp[:])
        valueTemp = ""
        del listTemp[:]
    return newList

xValues = GetXandYValues( GetCoordinates( numFiles, separator , fExtension) )[0]
allYValues = GetXandYValues( GetCoordinates( numFiles, separator , fExtension) )[1]

MultiplePlots( xValues, allYValues )

结果图:

如果您想知道这里的每个方法都有什么,可以打印该方法(带有所需的参数),以便知道返回的内容,但是我认为仅通过变量名就可以清楚地知道.如果您有任何疑问,请随时在下面评论.我希望这对您有用.

If you want to know what every method here does you can print the method (with the arguments needed) so you know what is returning, but I think it's clear by just the variables names. If you have any doubt don't hesitate to comment below. I hope this is useful for you.

这篇关于如何使用Python读取多个CSV文件,存储数据并在一个图中绘制的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆