【问题标题】:Annotating dimensions in matplotlib在 matplotlib 中标注尺寸
【发布时间】:2020-12-30 06:58:51
【问题描述】:

我想在 matplotlib 图中注释某些长度。例如,A点和B点之间的距离。

为此,我想我可以使用annotate 并弄清楚如何提供箭头的开始和结束位置。或者,使用arrow 并标记该点。

我尝试使用后者,但我不知道如何获得 2 头箭头:

from pylab import *

for i in [0, 1]:
    for j in [0, 1]:
        plot(i, j, 'rx')

axis([-1, 2, -1, 2]) 
arrow(0.1, 0, 0, 1, length_includes_head=True, head_width=.03) # Draws a 1-headed arrow
show()

如何创建 2 向箭头?更好的是,在 matplotlib 图形中是否有另一种(更简单的)标记尺寸的方法?

【问题讨论】:

标签: python matplotlib


【解决方案1】:

例如,您可以使用arrowstyle 属性更改箭头的样式

ax.annotate(..., arrowprops=dict(arrowstyle='<->'))

给出一个双向箭头。

可以在页面下方大约三分之一处找到完整的示例here,其中可能有不同的样式。

至于在地块上标记尺寸的“更好”方式,我想不出任何办法。

编辑:这是一个完整的示例,如果有帮助,您可以使用

import matplotlib.pyplot as plt
import numpy as np

def annotate_dim(ax,xyfrom,xyto,text=None):

    if text is None:
        text = str(np.sqrt( (xyfrom[0]-xyto[0])**2 + (xyfrom[1]-xyto[1])**2 ))

    ax.annotate("",xyfrom,xyto,arrowprops=dict(arrowstyle='<->'))
    ax.text((xyto[0]+xyfrom[0])/2,(xyto[1]+xyfrom[1])/2,text,fontsize=16)

x = np.linspace(0,2*np.pi,100)
plt.plot(x,np.sin(x))
annotate_dim(plt.gca(),[0,0],[np.pi,0],'$\pi$')

plt.show()

【讨论】:

  • 但是对于注释,我如何准确控制箭头的开始和结束位置?
  • 使用属性xyxytext(长度均为2 的元组)。 annotate 假设您想要添加一些文本,如果您不简单地将空字符串作为第一个参数传递。
  • 所以要明确一点:如果你想要一个尺寸线,文本居中并且“略高于”尺寸线 - 你不能在注释调用本身中使用文本,因为它将捕捉到一个端点 - 这就是为什么我们必须分别添加箭头和文本,对吗?我还尝试使用 va="center", ha="center" 属性 - 但文本仍然捕捉到一个端点...
【解决方案2】:

以下为您的绘图提供了一个很好的维度:使用不同的箭头道具('' 和 '|-|')添加了两次注释,之后将文本放在行中间的中心和一个 bbox用于覆盖标签下的线。

axs[0].annotate("", xy=(0, ht), xytext=(w, ht), textcoords=axs[0].transData, arrowprops=dict(arrowstyle='<->'))
axs[0].annotate("", xy=(0, ht), xytext=(w, ht), textcoords=axs[0].transData, arrowprops=dict(arrowstyle='|-|'))
bbox=dict(fc="white", ec="none")
axs[0].text(w/2, ht, "L=200 m", ha="center", va="center", bbox=bbox)

【讨论】:

  • 谢谢!我要注释的跨度要短得多,所以我在arrowprops 字典中添加了以下内容:shrinkA=0, shrinkB=0, color='k'(出于某种原因,我的默认颜色是白色)。我还通过将boxstyle="square,pad=0.1" 添加到bbox dict 来调整文本周围的填充。
猜你喜欢
  • 2020-04-04
  • 2017-03-23
  • 2011-07-16
  • 1970-01-01
  • 2016-06-23
  • 1970-01-01
  • 1970-01-01
  • 2019-05-14
  • 2014-08-26
相关资源
最近更新 更多