使用Matplotlib注释注释

时间:2013-12-02 00:05:37

标签: 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()

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

enter image description here

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

  • 对于src_posdst_pos
  • 的未知值,文本应妥善放置
  • 无论arrowprops的设置方式和使用的connectionstyle如何,都应妥善放置文字。
  • 我希望首选,直到脚本结束才能调用plt.draw()

谢谢!

2 个答案:

答案 0 :(得分: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')

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

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

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

答案 1 :(得分:0)

还有另一个选项text()可以在已知位置添加任何文本。 look at this link for extra options

ant1 = ax.text(0.4, 0.6, 'text')

这不取决于arrowprops