到目前为止,我总是在这里找到帮助。我一直在寻找我的问题的解决方案,我现在可能会失明..我希望你可以帮助我这个:
我已经构建了一个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!
答案 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)]