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यदि आप कुल्हाड़ी के गलियारों में पसंद करते हैं (जैसे ymin=0.25, ymax=0.75भूखंड के मध्य आधे को कवर करेंगे)। क्षैतिज रेखाओं ( axhline) और आयतों ( axvspan) के लिए संबंधित कार्य हैं ।


7
लेकिन मैं किसी दिए गए अक्ष वस्तु पर रेखा को कैसे साजिश करूं?
एरिक

8
@ अगर axकोई वस्तु है, तो ax.axvline(x=0.220589956)मेरे लिए काम करने लगता है।
जोएल

Axvline के लिए बहस 0 से 1 तक अदिश, साजिश खिड़की के सापेक्ष हैं। आप किसी दिए गए x या y स्थिति पर एक रेखा कैसे बनाते हैं, जैसे कि 2.205 ... जो इस प्रश्न में पूछा गया था?
एडवर्ड नेड हार्वे

ऐसा लगता है कि stackoverflow.com/questions/16930328/... एक जवाब है। plt.plot((x1,x2),(y1,y2))
एडवर्ड नेड हार्वे

1
कृपया ध्यान दें, ymax और ymin 0 से 1 के बीच होना चाहिए, 0 भूखंड के नीचे, 1 भूखंड के शीर्ष पर होना चाहिए। यदि आप इस श्रेणी से परे मानों का उपयोग कर रहे हैं, तो आपको सही पदों के साथ y पदों का अनुवाद करना होगा।
डायलन कप

50

कई लाइनों के लिए

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

1
हम एक लेजेंड को वर्टिकल लाइन में कैसे डालते हैं?
चार्ली पार्कर

@CharlieParker एक अलग सवाल पूछने पर विचार करें।
Matplotlib

@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पूर्ण डेटा निर्देशांक में हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.