วิธีการวาดเส้นแนวตั้งบนพล็อตที่กำหนดใน matplotlib?


259

กำหนดพล็อตของสัญญาณในการแสดงเวลาวิธีการวาดเส้นที่ทำเครื่องหมายดัชนีเวลาที่สอดคล้องกัน?

โดยเฉพาะเมื่อพล็อตสัญญาณพร้อมดัชนีเวลาตั้งแต่ 0 ถึง 2.6 ฉันต้องการวาดเส้นสีแดงแนวตั้งเพื่อระบุดัชนีเวลาที่สอดคล้องกันสำหรับรายการ[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)

คุณสามารถใช้หลายคำหลักที่มีพล็อตสำหรับคำสั่งอื่น ๆ (เช่นcolor, linestyle, linewidth... ) คุณสามารถส่งผ่านคำหลักในการขัดแย้งyminและymaxถ้าคุณต้องการในแกน corrdinates (เช่นymin=0.25, ymax=0.75จะครอบคลุมครึ่งตรงกลางของพล็อต) มีฟังก์ชั่นที่เกี่ยวข้องสำหรับเส้นแนวนอน ( axhline) และสี่เหลี่ยม ( axvspan)


7
แต่ฉันจะพล็อตบรรทัดบนวัตถุแกนที่กำหนดได้อย่างไร
Eric

8
@Eric ถ้าaxเป็นวัตถุแล้วax.axvline(x=0.220589956)ดูเหมือนว่าจะทำงานให้ฉัน
Joel

ข้อโต้แย้ง axvlineเป็นสเกลาร์ 0-1 เมื่อเทียบกับหน้าต่างพล็อต คุณจะวาดเส้นที่ตำแหน่ง x หรือ y ที่กำหนดเช่น 2.205 ... ที่ถูกถามในคำถามนี้ได้อย่างไร
เอ็ดเวิร์ดเน็ดฮาร์วีย์

ดูเหมือนstackoverflow.com/questions/16930328/…มีคำตอบ plt.plot((x1,x2),(y1,y2))
Edward Ned Harvey

1
โปรดทราบว่า ymax และ ymin ควรอยู่ระหว่าง 0 และ 1, 0 คือด้านล่างของพล็อต 1 ด้านบนของพล็อต หากคุณใช้ค่าที่อยู่นอกช่วงนี้คุณจะต้องแปลตำแหน่ง y ด้วยอัตราส่วนที่ถูกต้อง
Dylan Kapp

50

สำหรับหลายบรรทัด

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

1
เราจะใส่คำอธิบายแผนภูมิลงบนเส้นแนวตั้งได้อย่างไร
Charlie Parker

@CharlieParker ลองถามคำถามแยกต่างหาก เอกสารส่วนนี้ของ matplotlibอาจช่วยคุณได้
Ciprian Tomoiagă

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

ผล:

พล็อตที่น่าตื่นตาตื่นใจของฉัน seralouk


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.axvlineและและplt.plot((x1, x2), (y1, y2))หรือplt.plot([x1, x2], [y1, y2])ตามที่ระบุไว้ในคำตอบข้างต้นหนึ่งสามารถใช้

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

เพื่อพล็อตเส้นแนวตั้งที่x_posทอดจากy1ถึงy2จุดที่ค่าy1และy2อยู่ในพิกัดข้อมูลแบบสัมบูรณ์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.