Cara menggambar garis vertikal pada plot tertentu di matplotlib?


259

Diberikan plot sinyal dalam representasi waktu, cara menggambar garis yang menandai indeks waktu yang sesuai?

Khususnya, mengingat plot sinyal dengan indeks waktu mulai dari 0 hingga 2,6 (s), saya ingin menggambar garis merah vertikal yang menunjukkan indeks waktu yang sesuai untuk daftar [0.22058956, 0.33088437, 2.20589566], bagaimana saya bisa melakukannya?

Jawaban:


424

Cara standar untuk menambahkan garis vertikal yang akan menutupi seluruh jendela plot Anda tanpa Anda harus menentukan ketinggian sebenarnya plt.axvline

import matplotlib.pyplot as plt

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

ATAU

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

Anda dapat menggunakan banyak kata kunci yang tersedia untuk perintah petak lainnya (misalnya color, linestyle, linewidth...). Anda dapat menyampaikan argumen kata kunci ymindan ymaxjika Anda suka dalam sumbu mengoreksi (mis. ymin=0.25, ymax=0.75Akan mencakup bagian tengah plot). Ada fungsi yang sesuai untuk garis horizontal ( axhline) dan persegi panjang ( axvspan).


7
Tetapi bagaimana saya memplot garis pada objek sumbu yang diberikan?
Eric

8
@Eric if axadalah objek, maka ax.axvline(x=0.220589956)sepertinya bekerja untuk saya.
Joel

The argumen untuk axvline adalah skalar dari 0 ke 1, relatif terhadap jendela petak. Bagaimana Anda menggambar garis pada posisi x atau y yang diberikan, seperti 2.205 ... yang ditanyakan dalam pertanyaan ini?
Edward Ned Harvey

Sepertinya stackoverflow.com/questions/16930328/… memiliki jawaban. plt.plot((x1,x2),(y1,y2))
Edward Ned Harvey

1
Harap dicatat, ymax dan ymin harus antara 0 dan 1, 0 menjadi bagian bawah plot, 1 bagian atas plot. Jika Anda menggunakan nilai di luar rentang ini, Anda harus menerjemahkan posisi y dengan rasio yang benar.
Dylan Kapp


29

Jika seseorang ingin menambahkan a legenddan / atau colorske beberapa garis vertikal, maka gunakan ini:


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

Hasil:

seralouk plot menakjubkan saya


27

Memanggil axvline dalam satu lingkaran, seperti yang disarankan orang lain, berfungsi, tetapi dapat merepotkan karena

  1. Setiap baris adalah objek plot terpisah, yang menyebabkan semuanya menjadi sangat lambat ketika Anda memiliki banyak baris.
  2. Saat Anda membuat legenda, setiap baris memiliki entri baru, yang mungkin bukan yang Anda inginkan.

Sebagai gantinya Anda dapat menggunakan fungsi kenyamanan berikut yang membuat semua baris sebagai objek plot tunggal:

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

Selain plt.axvlinedan plt.plot((x1, x2), (y1, y2))ATAU plt.plot([x1, x2], [y1, y2])seperti yang disediakan dalam jawaban di atas, orang juga dapat menggunakan

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

untuk memplot garis vertikal pada x_posrentang dari y1ke y2tempat nilai y1dan y2berada dalam koordinat data absolut.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.