Matplotlib'de belirli bir arsa üzerinde dikey çizgiler nasıl çizilir?


260

Zaman gösteriminde bir sinyal grafiği verildiğinde, karşılık gelen zaman dizinini işaretleyen çizgiler nasıl çizilir?

Özellikle, zaman indeksi 0 ila 2.6 (s) arasında değişen bir sinyal grafiği göz önüne alındığında, liste için karşılık gelen zaman dizinini gösteren dikey kırmızı çizgiler çizmek istiyorum [0.22058956, 0.33088437, 2.20589566], nasıl yapabilirim?

Yanıtlar:


426

Gerçek yüksekliklerini belirtmenize gerek kalmadan tüm çizim pencerenizi kaplayacak dikey çizgiler eklemenin standart yolu plt.axvline

import matplotlib.pyplot as plt

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

VEYA

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

Sen diğer arsa komutlar için kullanılabilir anahtar kelimelerin çoğunu kullanabilirsiniz (örneğin color, linestyle, linewidth...). Anahtar kelime argümanlarını iletebilirsiniz yminve ymaxeksenlerde isterseniz düzeltir (örn. ymin=0.25, Grafiğin ymax=0.75orta yarısını kaplar). Yatay çizgiler ( axhline) ve dikdörtgenler ( axvspan) için karşılık gelen işlevler vardır .


7
Ancak çizgiyi belirli bir eksen nesnesine nasıl çizebilirim?
Eric

8
@ axNesne ise, o zaman ax.axvline(x=0.220589956)benim için çalışıyor gibi görünüyor.
Joel

Axvline için argümanlar çizim penceresi göre 0'dan 1'e sayıl vardır. Bu soruda sorulan 2.205 gibi belirli bir x veya y konumunda nasıl çizgi çizersiniz?
Edward Ned Harvey

Görünüşe göre stackoverflow.com/questions/16930328/… bir cevabı var. plt.plot((x1,x2),(y1,y2))
Edward Ned Harvey

1
Lütfen ymax ve ymin 0 ile 1 arasında olmalı, 0 grafiğin alt kısmı, 1 grafiğin üst kısmı olmalıdır. Bu aralığın ötesinde değerler kullanıyorsanız, y konumlarını doğru oranla çevirmeniz gerekir.
Dylan Kapp

50

Birden fazla hat için

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

1
dikey çizgiye nasıl bir efsane koyabiliriz?
Charlie Parker

@CharlieParker ayrı bir soru sormayı düşünüyor.
Matplotlib

@CharlieParker Ek bir seçenek label='label'işe yarıyor ancak plt.legend([options])daha sonra aramanız gerekiyor
kon psych

29

Birisi bazı dikey çizgilere legendve / veya eklemek istiyorsanız, bunu colorskullanın:


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

Sonuçlar:

benim inanılmaz komplo seralouk


27

Bir döngüde axvline'ı çağırmak, diğerlerinin de önerdiği gibi, işe yarar, ancak rahatsız edici olabilir, çünkü

  1. Her satır ayrı bir çizim nesnesidir, bu da çok satırınız olduğunda işlerin çok yavaş olmasına neden olur.
  2. Göstergeyi oluşturduğunuzda her satırın yeni bir girişi vardır, bu sizin istediğiniz olmayabilir.

Bunun yerine, tüm satırları tek bir çizim nesnesi olarak oluşturan aşağıdaki kolaylık işlevlerini kullanabilirsiniz:

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

Yukarıdaki cevaplarda belirtildiği gibi plt.axvlineve plt.plot((x1, x2), (y1, y2))VEYA'ya ek olarak,plt.plot([x1, x2], [y1, y2])

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

dikey bir çizgi çizmek için x_poskadar yayılan y1için y2burada değerleri y1ve y2kesin veri koordinatları bulunmaktadır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.