Jak narysować pionowe linie na danym poletku w Matplotlib?


259

Biorąc pod uwagę wykres sygnału w reprezentacji czasu, jak narysować linie oznaczające odpowiedni indeks czasu?

W szczególności, biorąc pod uwagę wykres sygnału z indeksem czasu w zakresie od 0 do 2,6 (s), chcę narysować pionowe czerwone linie wskazujące odpowiedni indeks czasu dla listy [0.22058956, 0.33088437, 2.20589566], jak mogę to zrobić?

Odpowiedzi:


423

Standardowym sposobem dodawania pionowych linii, które pokryją całe okno działki bez konieczności określania ich rzeczywistej wysokości, jest plt.axvline

import matplotlib.pyplot as plt

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

LUB

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

Można użyć wielu słów kluczowych dostępnych dla innych poleceń terenu (np color, linestyle, linewidth...). Można przekazać w kluczowych argumentów ymini ymaxjeśli chcesz w osi corrdinates (np ymin=0.25, ymax=0.75obejmie środkową połowę działki). Istnieją odpowiednie funkcje dla linii poziomych ( axhline) i prostokątów ( axvspan).


7
Ale jak narysować linię na danym obiekcie osi?
Eric

8
@Eric jeśli axjest obiektem, to ax.axvline(x=0.220589956)wydaje się działać dla mnie.
Joel

Te argumenty za axvline są skalarne od 0 do 1, w stosunku do okna wykresu. Jak narysować linię na danej pozycji x lub y, takiej jak 2.205 ... zadanej w tym pytaniu?
Edward Ned Harvey

Wygląda na to, że stackoverflow.com/questions/16930328/... ma odpowiedź. plt.plot((x1,x2),(y1,y2))
Edward Ned Harvey

1
Uwaga: ymax i ymin powinny wynosić od 0 do 1, gdzie 0 jest dolną częścią wykresu, a 1 górną krawędź wykresu. Jeśli używasz wartości spoza tego zakresu, musisz przełożyć pozycje y z właściwym współczynnikiem.
Dylan Kapp


29

Jeśli ktoś chce dodać a legendi / lub colorsdo niektórych linii pionowych, użyj tego:


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

Wyniki:

moja niesamowita fabuła Seralouk


27

Wywołanie axvline w pętli, jak sugerowali inni, działa, ale może być niewygodne, ponieważ

  1. Każda linia jest osobnym obiektem wykresu, co powoduje, że rzeczy są bardzo wolne, gdy masz wiele linii.
  2. Podczas tworzenia legendy każda linia ma nowy wpis, który może nie być tym, czego chcesz.

Zamiast tego możesz użyć następujących funkcji wygody, które tworzą wszystkie linie jako pojedynczy obiekt wykresu:

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

Oprócz plt.axvlinei plt.plot((x1, x2), (y1, y2))OR, plt.plot([x1, x2], [y1, y2])jak podano w odpowiedziach powyżej, można również użyć

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

wykreślić linię pionową w x_posrozpięte y1na y2których wartości y1i y2są absolutne współrzędne danych.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.