删除streamplots(matplotlib)而不清除图形

时间:2013-10-27 18:09:43

标签: python matplotlib

到目前为止,我总是在这里找到帮助。我一直在寻找我的问题的解决方案,我现在可能会失明..我希望你可以帮助我这个:

我已经构建了一个python程序,可以绘制方向字段(箭头)或streamplot。由于图中可能还有其他数据(例如轨迹),我不能只清除所有内容和重新绘制。相反,我想删除单个元素。这对除了streamplot之外的所有东西都是完美的。

所以,streamplot由直线和箭头组成。存储在变量sl中的我可以简单地调用sl.lines.remove()来删除这些行。但这对箭头不起作用。 我该如何删除这些?

编辑: 所以这里有一些代码:

import numpy as np
import matplotlib.pyplot as pp

streamplot = None

def mySystem(z):
    x, y = z
    return y, -x


def stream():
    xmin = -10
    xmax = 10
    ymin = -10
    ymax = 10

    N = 40
    M = int(N)
    a = np.linspace(xmin,xmax,N)
    b = np.linspace(ymin,ymax,N)

    X1, Y1 = np.meshgrid(a,b)
    DX1, DY1 = mySystem([X1,Y1])

    global streamplot
    streamplot = pp.streamplot(X1, Y1, DX1, DY1, density=2, color='#b5b5b5')

def removeStream():
    global streamplot
    streamplot.lines.remove()

    #doesn't work: streamplot.arrows.remove()

stream()
removeStream()
pl.show() # arrows still here!

1 个答案:

答案 0 :(得分:3)

PatchCollection没有可行的remove方法,有一种解决方法。

箭头已添加到ax.patches。假设您在绘图中没有任何其他补丁(例如条形图使用补丁),您可以ax.patches = []删除箭头。

理想情况下,您可以从sl.arrows PatchCollection获取补丁,但它实际上并不存储对补丁本身的引用,只是它们的原始路径。

如果图中有其他补丁,则可以删除FancyArrowPatch的所有实例。 E.g。

keep = lambda x: not isinstance(x, mpl.patches.FancyArrowPatch)
ax.patches = [patch for patch in ax.patches if keep(patch)]