【问题标题】:Filling above/below matplotlib line plot在 matplotlib 线图上方/下方填充
【发布时间】:2013-05-30 20:29:55
【问题描述】:

我正在使用 matplotlib 创建一个简单的线图。我的情节是一个简单的时间序列数据集,其中我有沿 x 轴的时间和我在 y 轴上测量的东西的值。 y 值可以有正值或负值,如果 y 值 > 0,我想用蓝色填充我的线上方和下方的区域,如果 y 值

如您所见,我可以正确填写蓝色,但无法正确填写红色。这是我正在使用的基本代码:

plt.plot(x, y, marker='.', lw=1)
d = scipy.zeros(len(y))
ax.fill_between(xs,ys,where=ys>=d, color='blue')
ax.fill_between(xs,0,where=ys<=d, color='red')

如何使从正 y 值到 x 轴的区域为蓝色,从负 y 值到 x 轴的区域为红色?感谢您的帮助。

【问题讨论】:

  • 我相信代码 sn-p 中的最后一行应该是 ax.fill_between(xs,ys,where=ys&lt;=d, color='red'),因为您现在正在尝试填充 y1=0y2=0 之间的区域(即没有区域)。第二个参数(在本例中为ys)被传递给y1 参数,并且由于y2 具有默认值0,该方法将填充您拥有的数组之间 的区域为y1 和行 y=0 指定,这就是你想要的。
  • 感谢您的帮助。你的建议部分奏效了。但是,如果一个点 (10, 10) 连接到另一个穿过 x 轴的点 (11, -10),我仍然没有得到正确的颜色填充。剧情如下:postimg.org/image/u329jhlob
  • 啊,我想这就是你想要的,看到你说上图中的蓝色填充是正确的。这应该很容易解决:ax.fill_between(xs,ys,where=ys&lt;=d, interpolate=True, color='red')interpolate 参数使函数插值以找到 y1y2 数组之间的交集,以获得“更平滑”的图。
  • 完美!!!非常感谢您的帮助。

标签: python matplotlib


【解决方案1】:

您提供的代码sn-p应该更正如下:

plt.plot(x, y, marker='.', lw=1)
d = scipy.zeros(len(y))
ax.fill_between(xs, ys, where=ys>=d, interpolate=True, color='blue')
ax.fill_between(xs, ys, where=ys<=d, interpolate=True, color='red')

fill_between 方法至少有两个参数xy1,同时它还有一个参数y2,默认值为0。该方法将填充y1y2 之间的区域指定的x-values。

之所以没有在 x 轴下方进行任何填充,是因为您已指定 fill_between 方法应填充 y1=0y2=0 之间的区域,即 没有区域。为确保填充不仅出现在 explicit x 值上,请指定该方法应插入 y1 以查找与 y2 的交集,这是通过指定 interpolate=True 来完成的在方法调用中。

【讨论】:

  • 很好的答案,谢谢!如果您跳过第二行“d = ...”并将第三行和第四行中的变量“d”替换为“0”,它也可以工作。
  • @TomPohl 谢谢。是的,我知道。我保留d = ... 语句的原因是,我不会对 OP 的原始代码进行比使其正常运行所需的更多更改。这是为了确保不会混淆“错误”的位置。
  • 我明白了。只是想确保使用您的解决方案的其他人知道该快捷方式。
【解决方案2】:

尝试设置关键字interpolate=True

【讨论】:

  • 啊,@nordev 已经在上面的评论中写过了。我建议您将您的评论转换为答案,以便对其进行适当的投票。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-14
  • 1970-01-01
  • 1970-01-01
  • 2013-12-15
  • 1970-01-01
相关资源
最近更新 更多