从具有可变x轴的阵列绘制曲线

时间:2016-02-18 02:24:13

标签: python arrays numpy matplotlib plot

我正在寻找一种绘制数组的pythonic方法,其中x轴值波动。我从h5文件(几行和几列)读入我的所有数据,以便:

data = h5py.File("file",'r')
dset = data['/DATA/DATA/'][:]

我现在有一个有形状的数组(25,432)。 23个独立数据条目中的432个数据点。数据是在432个光谱带上收集的光谱反射率数据,取自23个点。

我使用:

使用波段号为数据创建x轴
xvals = numpy.arange(1, 433, 1)

我可以通过分别调用每个数据来绘制所有这些数据。它不是很优雅,但它能完成这项工作,以便:

plt.plot(xvals, values[0])
plt.plot(xvals, values[1])
plt.plot(xvals, values[2])

但是,数据包含一些错误的值。我可以通过切片数组来省略它们,例如:

values = dset[np.logical_and(dset<1, dset>0)]

但是这会改变每个数组的长度,以便每个数组可以是唯一的长度。我可以用类似的方式切割x轴,但这不适用于所有阵列。

基本上我有:

a = [[1,2,3,-1,5,6],
     [1,-1,3,4,5,6],
     [1,2,3,4,-1,6]]

x = [1,2,3,4,5,6]

如果我删除-1值,则x太长并且我无法将它们绘制为&#34;没有相同的第一个维度&#34;。但是,对于a。中的每个数组,x都是不同的。

是否有一种pythonic方法可以在一个绘图中绘制所有数据,从而可以省略来自“dset”的错误数据(在0-1范围之外)。并相应地调整x轴上的数据点数量?

1 个答案:

答案 0 :(得分:2)

这听起来像是numpy's masked arrays的绝佳案例!

在您的情况下,您可以像这样使用它:

import matplotlib.pyplot as plt
import numpy as np
plt.ion()
a = np.array([[1,2,3,-1,5,6],
     [1,-1,3,4,5,6],
     [1,2,3,4,-1,6]])
x = np.array([1,2,3,4,5,6])

A = np.ma.array(a, mask=a<0)

plt.plot(x, A.T)

出于可视化目的,我使用偏移量绘制了它,它显示了掩蔽值的效果。请注意,您的线条显然是不连续的,但更重要的是:如果只有一个数据点被屏蔽值包围,那么一个数据点不会用线条绘制,因为一条线至少需要两个点。然后确保使用标记,如我所示。

plt.plot(x, A.T + np.array([[0,1,2]]), marker="o")

结果:

plotting masked arrays