在Matplotlib图表中标记感兴趣的区域

10
给定一个类似以下的情节:
import matplotlib
import matplotlib.pyplot as plt
import numpy as np
t = np.arange(0.0, 2.0, 0.01)
s = 1 + np.sin(2 * np.pi * t)
fig, ax = plt.subplots()
ax.plot(s)
ax.set(xlabel='time (s)', ylabel='voltage (mV)', title='sine')
ax.grid()
plt.show()

如何自动对图表中y值在1.25和0.75之间的垂直切片(从底部到顶部)进行着色?这里只是一个正弦函数的示例,实际绘图的值不太规则。我看过matplotlib中两条垂直线之间填充,它看起来与这个问题相似,但那里的答案会在固定的x值之间着色。我希望着色区域由y值决定。

1
啊,但是标记的重复项在固定的x值之间遮蔽了一个区域。我希望阴影区域由y值确定。 - retorquere
2个回答

13

你可能正在寻找ax.fill_between,它非常灵活(请参阅链接的文档)。

对于您的特定情况,如果我理解正确,这应该足够了:

fig, ax = plt.subplots()
ax.plot(s)
ax.set(xlabel='time (s)', ylabel='voltage (mV)', title='sine')
ax.fill_between(range(len(s)), min(s), max(s), where=(s < 1.25) & (s > 0.75), alpha=0.5)
ax.grid()

输入图片描述


是的!我不知道为什么我不能将其标记为答案,它显然就是。 - retorquere
我正在尝试使用https://gist.github.com/ccfa18896996ce8128f13687f32acca8做同样的事情,但出现了问题。当我尝试使用fill_between(df.index, ymin, ymax, where=(df.traffic_density > 18) & (df.traffic_density < 40))进行着色时,即使(我认为)只有一个连续区域的值在18和40之间,我仍然得到了两个有色列。有什么想法吗? - retorquere
我对使用hack的方式并不介意(只要能够画出该死的图形即可),但是使用“ax2.fill_between(np.linspace(min(plt.xlim()), max(plt.xlim()), len(df)), ymin, ymax, color=color, alpha=0.3, where=(df.traffic_density > 10) & (df.traffic_density < 40))”,我得到了相同的两个阴影区域。 - retorquere
有两个不同的区域,其中 traffic_density 在 10 到 40 之间(如果您执行 np.diff(df.loc[(df.traffic_density > 10) & (df.traffic_density < 40)].index),您可以看到这一点),它们相隔 501 行。只有一个区域的值在 18 到 40 之间(这是您在上一条评论中尝试做的),因此只会在那里生成一个柱形图。 - sacuL
1
真是的,你说得对。非常抱歉这样滥用了你的时间和专业知识。那个文件中缺少数据,这可能对我们来说是一个重大问题 - 很高兴我现在就发现了它,而不是以后! - retorquere
显示剩余3条评论

10
您可以使用ax.axvspan,它恰好可以实现您想要的效果。为了获得更好的结果,建议将alpha值设置在0.5以下,并可选设置颜色和边缘颜色/宽度。
fig, ax = plt.subplots()
ax.plot(s)
ax.set(xlabel='时间 (s)', ylabel='电压 (mV)', title='正弦曲线')
ax.axvspan(0.75, 1.25, alpha=0.2)
ax.grid()
plt.show()
如果您希望阴影呈不同方向(水平而非垂直),还有ax.axhspan方法。

我已经尝试过这个,虽然没有错误,但我也没有看到任何阴影区域。 - retorquere
这是因为在您当前的绘图序列中没有数据,我猜测。但是即使您不绘制任何数据,您仍然可以明确设置 ylim。在您当前的情况下,这条评论有意义吗? - heltonbiker
我需要阴影区域依赖于绘图的值。 - retorquere

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接