使用Matplotlib注释注释

Bri*_*ion 9 python matplotlib

我目前在Matplotlib中做一些"花哨"的注释:

import matplotlib.pyplot as plt
ax = plt.subplot(111)
plt.axis('equal')
src_pos, dst_pos = (0, 0), (1, 1)
src_patch = plt.Rectangle(src_pos, .25, .25, color='r')
ax.add_patch(src_patch)
dst_patch = plt.Circle(dst_pos, .25, color='b')
ax.add_patch(dst_patch)
arrowprops = dict(
    arrowstyle='<-', 
    connectionstyle='arc3,rad=0.3', 
    patchA=dst_patch, 
    patchB=src_patch, 
    shrinkA=1, 
    shrinkB=1)
ant = ax.annotate('', src_pos, dst_pos, arrowprops=arrowprops)
plt.draw()
plt.show()
Run Code Online (Sandbox Code Playgroud)

现在我想在箭头旁边添加一些文字.输出应如下所示:

在此输入图像描述

我对一般解决方案感兴趣,其中文本放置是根据渲染器选择的箭头路径以编程方式选择的.例如,

  • 文本应适当放置的未知值src_posdst_pos.
  • 无论如何arrowprops设置和使用哪个文本,都应该适当放置文本connectionstyle.
  • 宁愿plt.draw()在剧本结束之前不必打电话.

谢谢!

Tro*_*ood 2

只需查看http://matplotlib.org/users/annotations_intro.html页面即可。如果您知道坐标,似乎可以独立于箭头放置文本。在draw()命令之前添加以下内容:

ant2 = ax.annotate('this is\nthe text\ni want\nto add', xy=(0.1, 0.8), xytext=(0.1, 0.8), horizontalalignment='left', verticalalignment='top')
Run Code Online (Sandbox Code Playgroud)

就广义解决方案而言,它会与原始注释一样复杂,因为根据给定注释的参数创建了相当多不同类型的事物。例如,如果未指定 arrowstyle,则会创建 YAArow 补丁实例。您可以调用 YAArow 的 get_path() 但路径的用处有限,因为它或多或少只是点的集合。您需要编写一个“find_middle_of_path()”,它需要考虑到路径不一定需要连续,并且有时路径的所有属性都没有由使用它的方法填写,等等箭头路径不连续的一个例子是当箭头路径的中间被图形的边缘剪裁时。

如果指定了 arrowstyle,则会创建 FancyArrowPatch 实例。如果创建了 FancyArrowPatch,您可以调用 get_path_in_displaycoord() 来获取路径,其警告与 YAArow 补丁路径相同。

恕我直言,您最好创建一些相当简单的例程,调用两次注释,一次用于箭头,一次用于与您真正想要使用注释的可能有限方式相对应的文本。

  • 我可能是错的,但我认为 matplotlib 中没有一个现成的通用解决方案。如果您想要该功能,我认为您必须使用此答案自行添加它。 (3认同)