20

プロットの 1 つで距離を示したいと思います。私が念頭に置いているのは、彼らが技術図面でそれを行う方法であり、距離を横にテキストとして示す両方向矢印を示しています。

例:

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")

これにより、次のような結果が得られます (2 つの hlines は実際には必要ありません。描画領域が増えるだけです...):距離マーカー手動式

これを行うためのより迅速な方法はありますか? テキストを自動的に配置するための追加ポイントも。

編集: 私は遊んでいましannotateたが、弦を犠牲にする必要があるため、このソリューションは私にとって魅力を失いました. ただし、矢印スタイルを指摘してくれてありがとう、似たようなことを試みたときは機能しませんでした。1回の呼び出しでそれを行う小さな関数を書く方法はないと思います...

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 に答える