Python - 如果超过阈值,则从数组绘制系列

时间:2017-08-18 13:02:39

标签: python numpy matplotlib

这里的第一个问题和相当新手的python用户。

我使用matplotlib从numpy数组生成数据系列的线图。这些数组是170 x 481,其中有169个系列,每个数据点有480个数据点(第一列是我的x轴值,顶行是带有列名的标题)。

在我的数据中,所有值的范围都在0和1之间。但是,这些系列中的许多都具有接近0的数据值。因此,我想仅绘制具有峰值的系列。系列超过一定的门槛。

简化的示例数组如下:

myarray = [['thickness' 'a' 'b' 'c']
 ['0.25' '0.5' '0.2' '0.001']
 ['0.5' '0.4' '0.3' '0.002']
 ['0.75' '0.3' '0.2' '0.001']]

使用matplotlib手动绘图:

plt.plot(myarray[1:,0], myarray[1:,1], label='a')
plt.plot(myarray[1:,0], myarray[1:,2], label='b')
plt.plot(myarray[1:,0], myarray[1:,3], label='c')
plt.xlabel('Thickness')
plt.ylabel('Intensity')
plt.legend(loc='upper right')

结果here

在这种情况下,我有兴趣绘制ab,而不是c。虽然这里很容易手动排除,但169系列并不容易。

我尝试过的路线是使用for循环numpy.amax()来仅绘制超过阈值的切片/系列:

for i in myarray[:,1:]:
    if np.amax(myarray[1:,i]) > 0.015: #example threshold
        plt.plot(myarray[1:,0], myarray[1:,i])

遗憾的是,使用此路由并不起作用,因为它会抛出一个IndexError,因为数组中的索引是浮点数,而不是int或bool:

IndexError                                Traceback (most recent call last)
<ipython-input-56-d5338b9231af> in <module>()
      1 for i in myarray[:,1:]:
----> 2     if np.amax(myarray[1:,i]) > 0.015:
      3         plt.plot(myarray[1:,0], myarray[1:,i])

IndexError: arrays used as indices must be of integer (or boolean) type

我的问题具体是你如何选择和绘制一系列拥有高于期望阈值的元素的数据(不修改数组中的数据)?

编辑:在@ImportanceOfBeingErnest的回答之后,它需要整个数组都是浮点数(事实证明,在我无意中将浮点数据转换为字符串的时候,将标题字符串插入到我的数组中)。在这种情况下,您会收到TypeError,因此如果遇到任何人,请记住这一点。

1 个答案:

答案 0 :(得分:0)

您希望沿着列循环遍历数组的indizes。

for i in range(1, myarray.shape[1]):
    if np.amax(myarray[1:,i]) > 0.015: 
        plt.plot(myarray[1:,0], myarray[1:,i])