我已经能够使用genfromtxt从csv文件中导入和绘制带有图例的数据沿同一x轴(时间)绘制多列,如以下链接所示:
Matplotlib: Import and plot multiple time series with legends direct from .csv
如果csv文件中的所有单元格都包含数据,则上述简单示例可以正常工作。但是我的某些单元格缺少数据,并且某些参数(列)仅在每个数据点中包含数据点。第二或第三时间增量。
我想像以前一样在所有时间轴上绘制所有参数。如果某列中的一个或多个数据点丢失,我希望plot函数跳过该参数的丢失数据点,而仅在该参数可用的点之间绘制线。
此外,我正在尝试找到一种通用解决方案,如果事先不知道这些信息,则可以直接从csv文件中直接以上述样式绘制任意数量的列,时间点,丢失的数据点等。
我已经尝试使用genfromtxt选项missing_values和filling_values,如下面的非工作示例所示;但是我想跳过丢失的数据点,而不是为其分配值“ 0”;并且在任何情况下使用这种方法,当遇到丢失的数据点时,我似乎都会收到“ ValueError:无法将字符串转换为浮点数”。
在同一个绘图上相对于时间绘制多个参数,同时处理偶尔或定期跳过的值,对于科学界来说是一个相当普遍的问题。
我非常感谢使用genfromtxt提供的优雅解决方案的任何建议。
下面的无效代码和演示数据。非常感谢您的期待。
Demo data: 'Data.csv':
Time,Parameter_1,Parameter_2,Parameter_3
0,10,12,11
1,20,,
2,25,23,
3,30,,30
import numpy as np
import matplotlib.pyplot as plt
arr = np.genfromtxt('DemoData.csv', delimiter=',', dtype=None, missing_values='', filling_values = 0)
names = (arr[0])
for n in range (1,len(names)):
plt.plot (arr[1:,0],arr[1:,n],label=names[n])
plt.legend()
plt.show()
最佳答案
我认为,如果在usemask =True
命令中设置genfromtxt
,它将执行您想要的操作。可能也不想设置filling_values
arr = np.genfromtxt('DemoData.csv', delimiter=',', dtype=None, missing_values='', usemask=True)
然后,您可以使用以下内容进行绘制:
for n in range (1,len(names)):
plot(arr[1:,0][logical_not(arr[1:,n].mask)], arr[1:,n].compressed())