Matplotlib:使用直接来自.csv的图例导入并绘制多个时间序列

时间:2015-05-24 11:34:46

标签: excel csv numpy matplotlib import

我有几个电子表格,其中包含以下列格式保存为逗号分隔(.csv)文件的数据:第一行包含列标签作为字符串('Time','Parameter_1'...)。第一列数据是Time,每个后续列包含相应的参数数据,如float或integer。

我想在同一个绘图上绘制每个参数与时间的关系,参数图例直接从.csv文件的第一行派生。

我的电子表格中有不同数量的(列)参数要根据时间绘制;所以我想找到一个通用的解决方案,它也可以直接从.csv文件中获取列数。

附加的最小工作示例显示了我正在尝试使用np.loadtxt(减去图例);但我找不到从.csv文件导入列标签的方法来使用这种方法制作图例。

np.genfromtext提供了更多功能,但我对此并不熟悉,并且正在努力寻找一种方法来使用它来完成上述操作。

从.csv文件中绘制此样式的数据必定是一个常见问题,但我一直无法在网络上找到解决方案。我非常感谢你的帮助和帮助。建议。

非常感谢

"""
Example data: Data.csv:
Time,Parameter_1,Parameter_2,Parameter_3
0,10,0,10
1,20,30,10
2,40,20,20
3,20,10,30  
"""
import numpy as np
import matplotlib.pyplot as plt

data = np.loadtxt('Data.csv', skiprows=1, delimiter=',') # skip the column labels
cols = data.shape[1] # get the number of columns in the array
for n in range (1,cols):
    plt.plot(data[:,0],data[:,n]) # plot each parameter against time
plt.xlabel('Time',fontsize=14)
plt.ylabel('Parameter values',fontsize=14)
plt.show()

2 个答案:

答案 0 :(得分:2)

这是我上面使用genfromtxt而不是loadtxt的最小工作示例,以防它对其他人有帮助。 我确信有更简洁和优雅的方法可以做到这一点(我总是乐于对如何改进我的编码进行建设性的批评),但它是有道理的,并且工作正常:

import numpy as np
import matplotlib.pyplot as plt

arr = np.genfromtxt('Data.csv', delimiter=',', dtype=None) # dtype=None automatically defines appropriate format (e.g. string, int, etc.) based on cell contents
names = (arr[0])  # select the first row of data = column names
for n in range (1,len(names)):  # plot each column in turn against column 0 (= time)
    plt.plot (arr[1:,0],arr[1:,n],label=names[n]) # omitting the first row ( = column names)
plt.legend()    
plt.show()

答案 1 :(得分:1)

函数numpy.genfromtxt更适用于缺少值的破坏表,而不是您尝试执行的操作。您可以做的只是在将文件交给numpy.loadtxt之前打开文件并阅读第一行。那你甚至不需要跳过它。以下是您在上面的内容的编辑版本,它可以读取标签并制作图例:

"""
Example data: Data.csv:
Time,Parameter_1,Parameter_2,Parameter_3
0,10,0,10
1,20,30,10
2,40,20,20
3,20,10,30  
"""
import numpy as np
import matplotlib.pyplot as plt

#open the file
with open('Data.csv') as f:
    #read the names of the colums first
    names = f.readline().strip().split(',')
    #np.loadtxt can also handle already open files
    data = np.loadtxt(f, delimiter=',') # no skip needed anymore

cols = data.shape[1]
for n in range (1,cols):
    #labels go in here
    plt.plot(data[:,0],data[:,n],label=names[n])

plt.xlabel('Time',fontsize=14)
plt.ylabel('Parameter values',fontsize=14)

#And finally the legend is made
plt.legend()
plt.show()