我是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()
答案 0 :(得分:2)
绘图功能的markevery
参数接受不同类型的输入。根据输入类型,它们的解释不同。在this matplotlib example中找到一个很好的可能性列表。
如果您要显示标记的条件,则有两个选项。假设t
和y
是numpy数组且其中一个import
编辑numpy as np
,
指定布尔数组,
plt.plot(t,y,'-gD',markevery = np.where(y > 0.5, True, False))
或
索引数组。
plt.plot(t,y,'-gD',markevery = np.arange(len(t))[y > 0.5])
完整示例
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()
导致
答案 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不熟悉,而且似乎使事情复杂化了,因此我在尝试做最佳答案时找到了这个解决方案