20

我想在我的一个情节中指出一个距离。我想到的是他们在技术图纸中的做法,显示一个双头箭头,旁边是距离作为文本。

例子:

from matplotlib.pyplot import *

hlines(7,0,2, linestyles='dashed')
hlines(11,0,2, linestyles='dashed')
hlines(10,0,2, linestyles='dashed')
hlines(8,0,2, linestyles='dashed')
plot((1,1),(8,10), 'k',) # arrow line
plot((1,1),(8,8), 'k', marker='v',) # lower arrowhead
plot((1,1),(10,10), 'k', marker='^',) # upper arrowhead
text(1.1,9,"D=1")

这会导致类似这样的结果(其中两条线并不是真正需要的,它们只是增加了绘图区域......):距离标记手动样式

有没有更快的方法来做到这一点,最好是使用在确切位置结束的箭头,而不是低于/高于它们应该在的位置?自动放置文本的加分。

编辑: 我一直在玩,annotate但由于必须牺牲字符串,这个解决方案对我失去了一些吸引力。感谢您指出箭头样式,但当我尝试类似的东西时它不起作用。我想没有办法编写一个小函数来一次调用...

4

3 回答 3

25
import matplotlib.pyplot as plt

plt.hlines(7, 0, 2, linestyles='dashed')
plt.hlines(11, 0, 2, linestyles='dashed')
plt.hlines(10, 0, 2, linestyles='dashed')
plt.hlines(8, 0, 2, linestyles='dashed')
plt.annotate(
    '', xy=(1, 10), xycoords='data',
    xytext=(1, 8), textcoords='data',
    arrowprops={'arrowstyle': '<->'})
plt.annotate(
    'D = 1', xy=(1, 9), xycoords='data',
    xytext=(5, 0), textcoords='offset points')

# alternatively,
# plt.text(1.01, 9, 'D = 1')

plt.show()

产量

在此处输入图像描述

有关许多可用选项的详细信息plt.annotate,请参阅此页面


如上所示,可以使用plt.annotate或放置文本plt.text。使用plt.annotate您可以以点为单位指定偏移量(例如(5, 0)),而使用plt.text您可以指定数据坐标中的文本位置(例如(1.01, 9))。

于 2013-01-30T20:37:20.790 回答
12

尝试使用annotate

annotate ('', (0.4, 0.2), (0.4, 0.8), arrowprops={'arrowstyle':'<->'})

annotate 命令生成的图像

我不确定自动文本放置。

于 2013-01-30T20:31:15.637 回答
1

我制作了一个可以很好地完成此任务的函数:

import numpy as np
import matplotlib.pyplot as plt

def annotate_point_pair(ax, text, xy_start, xy_end, xycoords='data', text_offset=6, arrowprops = None):
    """
    Annotates two points by connecting them with an arrow. 
    The annotation text is placed near the center of the arrow.
    """

    if arrowprops is None:
        arrowprops = dict(arrowstyle= '<->')

    assert isinstance(text,str)

    xy_text = ((xy_start[0] + xy_end[0])/2. , (xy_start[1] + xy_end[1])/2.)
    arrow_vector = xy_end[0]-xy_start[0] + (xy_end[1] - xy_start[1]) * 1j
    arrow_angle = np.angle(arrow_vector)
    text_angle = arrow_angle - 0.5*np.pi

    ax.annotate(
            '', xy=xy_end, xycoords=xycoords,
            xytext=xy_start, textcoords=xycoords,
            arrowprops=arrowprops)

    label = ax.annotate(
        text, 
        xy=xy_text, 
        xycoords=xycoords,
        xytext=(text_offset * np.cos(text_angle), text_offset * np.sin(text_angle)), 
        textcoords='offset points')

    return label
于 2015-09-11T11:28:49.167 回答