【问题标题】:Matplotlib fill_between() workaroundMatplotlib fill_between() 解决方法
【发布时间】:2014-04-23 16:47:44
【问题描述】:

我有一个奇怪的情况,我需要一些帮助。我有以下数据:

xdata = [ 11.125,  11.375,  11.625,  11.875,  12.125,  12.375,  12.625,  12.875,  13.125, 13.375,  13.625,  13.875,  14.125,  14.375,  14.625,  14.875,  15.125,  15.375]
ydata = [ 5.49305494,  6.51732366,  6.54733551,  6.38045781,  6.16101383,  5.93700054,  5.70674253,  5.47409529,  5.23715401,  4.98422568,  4.72124987,  4.43762374,   4.11756956,  3.74888544,  3.32613096,  2.79169065,  2.0374265,   1.07918125]

我想要的是使用 fill_between() 函数,这样填充区域在两个不属于 xdata 列表的 x 值之间,同时填充 y=0 之间的区域,并且提供的 ydata 生成的曲线。

我想到了两件事:1)不关心被 y 数据限制(在这种情况下,我会使用 axvspan() 函数);这不再是一个真正的选择,并且 2) 执行某种插值方案以找到我拥有的 x 值的插值 ydata 值(这又不是 xdata 的一部分)。如果我确实采用第二个想法,我需要知道 matplotlib 在使用 plot() 函数时默认如何在数据点之间进行插值,以便尝试完全匹配 ydata 生成的曲线。

我对插值的想法持开放态度,但我对任何可行的方法都持开放态度。谢谢!

【问题讨论】:

  • 什么是“不属于 xdata 列表的两个 x 值”?
  • 您能否描述一下您想要的输出与此有何不同? i.stack.imgur.com/4y6pM.png
  • 当然,我可以更详细地描述它(它确实与您生成的图像不同)。我们将 x 值称为:x1=13.3979400087 和 x2=13.414973348。基本上,我希望两者之间的填充看起来像您在图像中包含的内容,但是,我希望它从 x 值 x1 开始,并在 x 值 x2 处结束。这更有意义吗?
  • 所以基本上裁剪x1x2处显示的图像?这相当于使用线性插值(每个数据点之间的直线):plt.fill_between([x1, x2], 0, np.interp([x1, x2], xdata, ydata)

标签: python matplotlib plot


【解决方案1】:

我认为您可能必须进行插值。甚至以某种方式“裁剪”结果来自

plt.fill_between(xdata, 0, ydata)

正如上面 cmets 中所讨论的,它相当于线性插值(每个数据点之间的直线)。你可以这样做:

xdata = ...
ydata = ...
xleft, xright = 13.3979400087, 13.414973348
xfill = np.linspace(xleft, xright)
yfill = np.interp(xfill, xdata, ydata)
plt.fill_between(xfill, 0, yfill, color='r')

如果您在原件之上执行此操作,您可以更好地看到它:

当然,您可以进行更高级的插值,下一步是样条:

from scipy import interpolate
# same as above ...
yfill_spline = interpolate.spline(xdata, ydata, xfill) #note the different args ordering from np.interp
plt.fill_between(xfill, 0, yfill_spline, color='g')

对于您的示例,差异非常微妙,因此我放大了填充区域的顶部边缘,但使用更高的曲率数据,您会更容易注意到差异:

为了进行比较,请参阅线性插值与样条插值的未裁剪版本。如果您在峰值附近有xleftxright1112 左右),您会注意到这些方法之间的巨大差异。

【讨论】:

  • 这太棒了 - 我会试一试,然后回复你。
  • 好的 - 这行得通。我还提出了我自己的解决方案,它结合了两件事:1) 感兴趣区域的 axvspan,然后 2) 放置一个 fill_between 区域,它是白色的并且在曲线上方具有更高的 zorder。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2015-06-02
  • 2018-06-20
  • 1970-01-01
  • 1970-01-01
  • 2015-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多