如何在matplotlib fill_between函数中控制边缘的破折号?

时间:2015-10-14 09:03:27

标签: python matplotlib plot

我最近使用matplotlib的fill_between函数绘制带有虚线边的矩形。例如,这个位于t1,t2,fmin和fmax之间:

ax.fill_between([t1, t2], fmin, fmax, facecolor=(0, 0, 0, 0), linestyle='--) 

我知道可以在plot函数中使用关键字参数dashes=[6, 2]指定破折号开关序列,但这不适用于fill_between。我查看了fill_between() documentation,但我找不到任何解决方案。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

这将是一个评论,但似乎格式不正确。

查看代码,看起来fill_between返回一个PolyCollection,而不是如上所述使用dashes关键字的Line2D对象。 PolyCollection类实际上并不将边线保存为Line2D类(这可能是出于优化原因)。这意味着即使边缘像线条一样绘制,也不必像使用Line2D类那样具有完全的灵活性。 PolyCollection似乎缺少这段代码:

def _draw_dashed(self, renderer, gc, path, trans):
    gc.set_linestyle('dashed')
    if self._dashSeq is not None:
        gc.set_dashes(0, self._dashSeq)

特别是,PolyCollection的draw方法中没有 set_dashes 代码。要实现这一点,看来你需要一种方法在PolyCollection实例中设置一个破折号序列变量,然后在绘制命令期间调用 gc.set_dashes(dash_seq)

我没有看到任何方法将此代码挂钩(注入)到PolyCollection而不修改源代码。因此,最好将此报告作为matplotlib github中的功能请求报告。这似乎是一个合理的要求,能够控制边缘的破折号序列,但这可能比初始一瞥更复杂,因为那时你必须在每个单独的边缘(在一般情况下)之间同步这个序列,这可能不是值得。

但是,您可能会发现编写一个新函数来绘制正方形而不是使用fill_between函数会更好,因为这不是它的意思。使用个人功能,您可以使用Line2D对象。

编辑:如果您碰巧在github上询问matplotlib,请告诉我他们的意见。他们实际上可能会说你可以使用正确的子类化在draw命令中注入代码。我不得不考虑更多。