1

我已经能够使用 genfromtxt 从 csv 文件中导入和绘制多列数据,并使用图例在同一个 x 轴(时间)上绘制,如以下链接所示:

Matplotlib:直接从 .csv 导入和绘制带有图例的多个时间序列

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

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

此外,我正在尝试找到一个通用解决方案,当这些事先不知道时,它将直接从 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()
4

1 回答 1

2

我想如果你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())
于 2015-06-05T21:50:55.653 回答