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ć?

Francis
źródło

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

Gabriel
źródło
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
50

Dla wielu linii

xposition = [0.3, 0.4, 0.45]
for xc in xposition:
    plt.axvline(x=xc, color='k', linestyle='--')
Qina Yan
źródło
1
jak umieścić legendę na linii pionowej?
Charlie Parker
@CharlieParker rozważ zadanie osobnego pytania. Ta część dokumentacji matplotlib może ci pomóc
Ciprian Tomoiagă,
@CharlieParker Dodatkowa opcja label='label'działa, ale musisz zadzwonić plt.legend([options])później
kon psych
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

seralouk
źródło
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
Piotr
źródło
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.

Sheldore
źródło