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

Posted

技术标签:

【中文标题】Matplotlib/Genfromtxt:针对时间的多个图,跳过丢失的数据点,来自 .csv【英文标题】:Matplotlib/Genfromtxt: Multiple plots against time, skipping missing data points, from .csv 【发布时间】:2015-08-20 22:24:23 【问题描述】:

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

Matplotlib: Import and plot multiple time series with legends direct from .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()

【问题讨论】:

【参考方案1】:

我认为如果你在你的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())

【讨论】:

完美!谢谢!遗憾的是我还不能投票,因为 newby 的声誉

以上是关于Matplotlib/Genfromtxt:针对时间的多个图,跳过丢失的数据点,来自 .csv的主要内容,如果未能解决你的问题,请参考以下文章

针对 iPhone 3.0 操作系统编译时 UIActionSheets 出现奇怪错误

哪些编译器针对 JavaScript 运行时?

可以在运行时使用代码针对 xsd 验证 xml 吗?

仅在针对特定路线时应用 CSS

可以在运行时使用 Objc/iPhone 代码针对 xsd 验证 xml

针对多个 iDevice 时资源管理的最佳实践?