Matplotlib/Genfromtxt:多个时间图,跳过丢失的数据点,来自 .csv

Matplotlib/Genfromtxt: Multiple plots against time, skipping missing data points, from .csv

我已经能够使用 genfromtxt 从 csv 文件中导入并绘制多列数据,如图例 link:

如果 csv 文件中的所有单元格都包含数据,则上述简单示例可以正常工作。但是,我的某些单元格缺少数据,并且某些参数(列)仅包含数据点,例如第二次或第三次增量。

我想像以前一样在同一时间轴上绘制所有参数;如果一列中的一个或多个数据点丢失,我希望绘图函数跳过该参数丢失的数据点,只在该参数可用的点之间画线。

此外,我正在尝试寻找一种通用解决方案,该解决方案将直接从 csv 文件自动以上述样式绘制任意数量的列、时间点、缺失数据点等,当这些在提前。

我已经尝试使用 genfromtxt 选项 missing_values 和 filling_values,如下面的非工作示例所示;但是我想跳过丢失的数据点而不是为它们分配值“0”;在任何情况下,使用这种方法,当遇到丢失的数据点时,我似乎都会得到 "ValueError: could not convert string to float" 。

在同一张图上绘制多个参数与时间的关系,同时处理偶尔或经常跳过的值对于科学界来说一定是一个非常普遍的问题。

对于使用 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()

我认为如果您在 genfromtxt 命令中设置 usemask =True,它就会执行您想要的操作。可能不想 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())