我有几个电子表格,其中包含以下列格式保存为逗号分隔(.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()
答案 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()