Matplotlib / Genfromtxt:来自.csv

时间:2015-06-05 20:41:26

标签: python csv matplotlib plot genfromtxt

我已经能够使用genfromtxt从csv文件导入和绘制多个数据列与图例相同的x轴(时间),如下所示:

Matplotlib: Import and plot multiple time series with legends direct from .csv

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

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

此外,我试图找到一个通用的解决方案,它会直接从csv文件中自动绘制上述样式,用于任意数量的列,时间点,缺少数据点等,当这些在提前。

我尝试过使用genfromtxt选项missing_values和filling_values,如下面的非工作示例所示;但是我想跳过丢失的数据点,而不是给它们分配值' 0&#39 ;;在任何情况下,这种方法我似乎得到" 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 个答案:

答案 0 :(得分:1)

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

然后您可以使用以下内容进行绘图:

{{1}}