matplotlibの与えられたプロットに垂直線を描く方法は?


259

時間表現で信号のプロットが与えられた場合、対応する時間インデックスをマークする線を描く方法は?

具体的には、時間インデックスが0から2.6(s)の範囲のシグナルプロットがある場合、リストに対応する時間インデックスを示す垂直の赤い線を描画したいのですが[0.22058956, 0.33088437, 2.20589566]、どうすればよいですか?

回答:


423

実際の高さを指定しなくても、プロットウィンドウ全体を覆う垂直線を追加する標準的な方法は次のとおりです。 plt.axvline

import matplotlib.pyplot as plt

plt.axvline(x=0.22058956)
plt.axvline(x=0.33088437)
plt.axvline(x=2.20589566)

または

xcoords = [0.22058956, 0.33088437, 2.20589566]
for xc in xcoords:
    plt.axvline(x=xc)

あなたが他のプロットコマンドの使用可能なキーワードの多くを使用することができます(たとえばcolorlinestylelinewidth...)。キーワード引数yminを渡すことができymaxます。Axesで調整する場合は、たとえばymin=0.25ymax=0.75プロットの中央をカバーします。水平線(axhline)と長方形(axvspan)に対応する関数があります。


7
しかし、与えられた軸オブジェクトに線をプロットするにはどうすればよいですか?
Eric

8
@Eric axがオブジェクトの場合、ax.axvline(x=0.220589956)私にとってはうまくいくようです。
Joel

axvline引数は、プロットウィンドウに対して0〜1のスカラーです。この質問で尋ねられた2.205 ...などの特定のxまたはyの位置に線をどのように描画しますか?
エドワードネッドハーヴェイ

stackoverflow.com/questions/16930328/…に答えがあるようです。plt.plot((x1,x2),(y1,y2))
エドワードネッドハーヴェイ

1
ymaxとyminは0から1の間でなければなりません。0はプロットの下部、1はプロットの上部です。この範囲を超える値を使用している場合は、y位置を正しい比率で変換する必要があります。
ディランカップ

50

複数回線の場合

xposition = [0.3, 0.4, 0.45]
for xc in xposition:
    plt.axvline(x=xc, color='k', linestyle='--')

1
縦線に凡例を付けるにはどうすればよいですか?
チャーリーパーカー

@CharlieParkerは別の質問をすることを検討してください。matplotlibドキュメントのこの部分が役立つかもしれません
CiprianTomoiagăOct

@CharlieParker追加オプションでlabel='label'機能しますが、plt.legend([options])後で電話する必要があります
kon psych

29

誰かが縦線にlegendやを追加したい場合はcolors、これを使用します:


import matplotlib.pyplot as plt

# x coordinates for the lines
xcoords = [0.1, 0.3, 0.5]
# colors for the lines
colors = ['r','k','b']

for xc,c in zip(xcoords,colors):
    plt.axvline(x=xc, label='line at x = {}'.format(xc), c=c)

plt.legend()
plt.show()

結果:

私の驚くべきプロットセラルーク


27

他の人が示唆したように、ループでaxvlineを呼び出すことは機能しますが、次の理由で不便な場合があります。

  1. 各線は個別のプロットオブジェクトであるため、多数の線があると処理が非常に遅くなります。
  2. 凡例を作成すると、各行に新しいエントリが追加されます。

代わりに、すべての線を単一のプロットオブジェクトとして作成する次の便利な関数を使用できます。

import matplotlib.pyplot as plt
import numpy as np


def axhlines(ys, ax=None, **plot_kwargs):
    """
    Draw horizontal lines across plot
    :param ys: A scalar, list, or 1D array of vertical offsets
    :param ax: The axis (or none to use gca)
    :param plot_kwargs: Keyword arguments to be passed to plot
    :return: The plot object corresponding to the lines.
    """
    if ax is None:
        ax = plt.gca()
    ys = np.array((ys, ) if np.isscalar(ys) else ys, copy=False)
    lims = ax.get_xlim()
    y_points = np.repeat(ys[:, None], repeats=3, axis=1).flatten()
    x_points = np.repeat(np.array(lims + (np.nan, ))[None, :], repeats=len(ys), axis=0).flatten()
    plot = ax.plot(x_points, y_points, scalex = False, **plot_kwargs)
    return plot


def axvlines(xs, ax=None, **plot_kwargs):
    """
    Draw vertical lines on plot
    :param xs: A scalar, list, or 1D array of horizontal offsets
    :param ax: The axis (or none to use gca)
    :param plot_kwargs: Keyword arguments to be passed to plot
    :return: The plot object corresponding to the lines.
    """
    if ax is None:
        ax = plt.gca()
    xs = np.array((xs, ) if np.isscalar(xs) else xs, copy=False)
    lims = ax.get_ylim()
    x_points = np.repeat(xs[:, None], repeats=3, axis=1).flatten()
    y_points = np.repeat(np.array(lims + (np.nan, ))[None, :], repeats=len(xs), axis=0).flatten()
    plot = ax.plot(x_points, y_points, scaley = False, **plot_kwargs)
    return plot

15

上記の回答で提供されているplt.axvlineplt.plot((x1, x2), (y1, y2))ORに加えて、plt.plot([x1, x2], [y1, y2])

plt.vlines(x_pos, ymin=y1, ymax=y2)

で垂直線をプロットするためにx_pos及ぶy1y2場合の値y1y2絶対データ座標です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.