在matplotlib图中突出显示任意点?

时间:2017-03-18 08:39:03

标签: python-3.x matplotlib

我是python和matplotlib的新手。

我试图在matplotlib的现有情节中突出显示符合某个标准的几个点。

初始图的代码如下:

pl.plot(t,y)
pl.title('Damped Sine Wave with %.1f Hz frequency' % f)
pl.xlabel('t (s)')
pl.ylabel('y')
pl.grid()
pl.show()

在上面的图中,我想强调一些符合标准abs(y)> 0.5的特定点。提出这些要点的代码如下:

markers_on = [x for x in y if abs(x)>0.5]

我尝试使用“markevery”这个参数,但它引发了一个错误说

'markevery' is iterable but not a valid form of numpy fancy indexing;

给出错误的代码如下:

pl.plot(t,y,'-gD',markevery = markers_on)
pl.title('Damped Sine Wave with %.1f Hz frequency' % f)
pl.xlabel('t (s)')
pl.ylabel('y')
pl.grid()
pl.show()

3 个答案:

答案 0 :(得分:2)

绘图功能的markevery参数接受不同类型的输入。根据输入类型,它们的解释不同。在this matplotlib example中找到一个很好的可能性列表。

如果您要显示标记的条件,则有两个选项。假设ty是numpy数组且其中一个import编辑numpy as np

  1. 指定布尔数组

    plt.plot(t,y,'-gD',markevery = np.where(y > 0.5, True, False))
    
    1. 索引数组

      plt.plot(t,y,'-gD',markevery = np.arange(len(t))[y > 0.5])
      
    2. 完整示例

      import matplotlib.pyplot as plt
      import numpy as np; np.random.seed(42)
      
      t = np.linspace(0,3,14)
      y = np.random.rand(len(t))
      
      plt.plot(t,y,'-gD',markevery = np.where(y > 0.5, True, False))
      # or 
      #plt.plot(t,y,'-gD',markevery = np.arange(len(t))[y > 0.5])
      
      plt.xlabel('t (s)')
      plt.ylabel('y')
      
      plt.show()
      

      导致

      enter image description here

答案 1 :(得分:0)

markevery参数只接受None,integer或boolean数组的索引作为输入。由于我直接传递了值,因此抛出错误。

我知道它不是非常pythonic但我使用下面的代码来提出索引。

marker_indices = []
for x in range(len(y)):
    if abs(y[x]) > 0.5:
        marker_indices.append(x)

答案 2 :(得分:0)

markevery使用布尔值标记布尔值为True的每个点

所以不是markers_on = [x for x in y if abs(x)>0.5]

您将执行markers_on = [abs(x)>0.5 for x in y],该操作将返回一个与y大小相同的布尔值列表,以及| x |的每个点。 > 0.5您将获得True

然后您将按原样使用代码:

pl.plot(t,y,'-gD',markevery = markers_on)
pl.title('Damped Sine Wave with %.1f Hz frequency' % f)
pl.xlabel('t (s)')
pl.ylabel('y')
pl.grid()
pl.show()

我知道这个问题很旧,但是由于我对numpy不熟悉,而且似乎使事情复杂化了,因此我在尝试做最佳答案时找到了这个解决方案