Matplotlib show|是否保留在平移/缩放过程中消失的可见注解线?

eblbsuwk  于 2023-04-07  发布在  其他
关注(0)|答案(1)|浏览(107)

考虑以下代码:

import matplotlib as mpl
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.subplots()

ax.plot([1, 2, 3, 4], [0, 0.5, 1, 0.2])

ax.annotate("", xy=(0,0), xytext=(1,1), arrowprops=dict(facecolor='black'))

ax.set_ylabel('some numbers')
ax.set_xlim([0,5])
ax.set_ylim([0,2])
plt.show()

它会产生以下结果:

我用鼠标将窗口向下拖动了一点-线完全消失了-即使根据上一张图像判断,它应该仍然可见:

显然,matplotlib认为如果注解行在窗口中不完全可见,也就是说,它是可裁剪的,那么它应该被完全删除。
我认为,如果注解行被剪裁,那么它应该显示到可见的程度。
如何让matplotlib做我想做的,而不是它想做的?
编辑:刚刚发现关于annotation_clip;如果我将其设置为True,则行为与上面相同;如果我将它设置为False;那么我可以得到:

但这也不是我想要的--我想要的是这个(PS):

我到底怎么弄到这个-你怎么叫它,剪的,没剪的,半剪的,不管它是什么?

bfhwhh0e

bfhwhh0e1#

找到了:当绘制轴外的线段箭头时注解问题· Issue #1402 · matplotlib/matplotlib · GitHub
“annotate”的首要目的是用文本和可选的箭头来注解一些东西.而当前行为是一个在大多数情况下都有意义的功能.对于你想要的,你需要调整两件事.首先你应该抑制注解的当前行为你可以通过设置“annotation_clip=False”来实现这一点(更多细节请参见文档)。你还需要用坐标轴的bbox来裁剪箭头。...
因此,OP中的正确示例是:

import matplotlib as mpl
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.subplots()

ax.plot([1, 2, 3, 4], [0, 0.5, 1, 0.2])

annot = ax.annotate("", xy=(0,0), xytext=(1,1), arrowprops=dict(facecolor='black'), annotation_clip=False) # no clip_rect
annot.arrow_patch.set_clip_box(ax.bbox)

ax.set_ylabel('some numbers')
ax.set_xlim([0,5])
ax.set_ylim([0,2])
plt.show()

相关问题