Làm thế nào để vẽ các đường thẳng đứng trên một ô đã cho trong matplotlib?


259

Cho một biểu đồ tín hiệu trong biểu diễn thời gian, làm thế nào để vẽ các đường đánh dấu chỉ số thời gian tương ứng?

Cụ thể, được đưa ra một biểu đồ tín hiệu với chỉ số thời gian từ 0 đến 2,6 (s), tôi muốn vẽ các đường màu đỏ dọc cho biết chỉ số thời gian tương ứng cho danh sách [0.22058956, 0.33088437, 2.20589566], làm thế nào tôi có thể làm điều đó?

Câu trả lời:


423

Cách tiêu chuẩn để thêm các đường thẳng đứng sẽ bao phủ toàn bộ cửa sổ cốt truyện của bạn mà bạn không phải chỉ định chiều cao thực tế của chúng là plt.axvline

import matplotlib.pyplot as plt

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

HOẶC LÀ

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

Bạn có thể sử dụng nhiều từ khóa có sẵn cho các lệnh cốt truyện khác (ví dụ color, linestyle, linewidth...). Bạn có thể vượt qua trong đối số từ khóa yminymaxnếu bạn thích trong trục corrdinates (ví dụ ymin=0.25, ymax=0.75sẽ bao gồm một nửa giữa cốt truyện). Có các hàm tương ứng cho các đường ngang ( axhline) và hình chữ nhật ( axvspan).


7
Nhưng làm thế nào để tôi vẽ đường trên một đối tượng trục cho trước?
Eric

8
@Eric nếu axlà đối tượng, thì ax.axvline(x=0.220589956)dường như làm việc cho tôi.
Joel

Các đối số cho axvline là vô hướng từ 0 đến 1, liên quan đến cửa sổ cốt truyện. Làm thế nào để bạn vẽ một đường tại một vị trí x hoặc y nhất định, chẳng hạn như 2.205 ... đã được hỏi trong câu hỏi này?
Edward Ned Harvey

Hình như stackoverflow.com/questions/16930328/ có một câu trả lời. plt.plot((x1,x2),(y1,y2))
Edward Ned Harvey

1
Xin lưu ý, ymax và ymin phải nằm trong khoảng từ 0 đến 1, 0 là phần cuối của cốt truyện, 1 trên cùng của cốt truyện. Nếu bạn đang sử dụng các giá trị ngoài phạm vi này, bạn sẽ cần dịch các vị trí y với tỷ lệ chính xác.
Dylan Kapp

50

Đối với nhiều dòng

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

1
Làm thế nào để chúng ta đặt một huyền thoại cho dòng dọc?
Charlie Parker

@CharlieParker xem xét đặt câu hỏi riêng. Phần này của tài liệu matplotlib có thể giúp bạn
Ciprian Tomoiagă

@CharlieParker Một tùy chọn bổ sung label='label'thực hiện công việc nhưng bạn cần gọi plt.legend([options])sau
kon psych

29

Nếu ai đó muốn thêm một legendvà / hoặc colorsmột số dòng dọc, thì hãy sử dụng:


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

Các kết quả:

cốt truyện tuyệt vời của tôi seralouk


27

Gọi axvline trong một vòng lặp, như những người khác đã đề xuất, hoạt động, nhưng có thể bất tiện vì

  1. Mỗi dòng là một đối tượng cốt truyện riêng biệt, khiến mọi thứ rất chậm khi bạn có nhiều dòng.
  2. Khi bạn tạo huyền thoại, mỗi dòng có một mục mới, có thể không phải là điều bạn muốn.

Thay vào đó, bạn có thể sử dụng các hàm tiện lợi sau đây để tạo tất cả các dòng dưới dạng một đối tượng cốt truyện duy nhất:

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

Ngoài plt.axvlineplt.plot((x1, x2), (y1, y2))HOẶC plt.plot([x1, x2], [y1, y2])như được cung cấp trong các câu trả lời ở trên, người ta cũng có thể sử dụng

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

để vẽ một đường thẳng đứng x_poskéo dài từ y1đến y2nơi các giá trị y1y2nằm trong tọa độ dữ liệu tuyệt đối.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.