Matplotlib में PyPlot के लिए सबसे सरल तरीके से एक किंवदंती जोड़ना


263

टी एल; डॉ -> कैसे एक में एक लाइन ग्राफ के लिए एक किंवदंती बना सकते हैं Matplotlibकी PyPlotकिसी भी अतिरिक्त चर बनाने के बिना?

कृपया रेखांकन लिपि पर विचार करें:

if __name__ == '__main__':
    PyPlot.plot(total_lengths, sort_times_bubble, 'b-',
                total_lengths, sort_times_ins, 'r-',
                total_lengths, sort_times_merge_r, 'g+',
                total_lengths, sort_times_merge_i, 'p-', )
    PyPlot.title("Combined Statistics")
    PyPlot.xlabel("Length of list (number)")
    PyPlot.ylabel("Time taken (seconds)")
    PyPlot.show()

आप देख सकते हैं, इस बात का एक बहुत ही बुनियादी इस्तेमाल होता है matplotlibकी PyPlot। यह आदर्श रूप में नीचे दिए गए जैसे एक ग्राफ बनाता है:

ग्राफ़

कुछ खास नहीं, मुझे पता है। हालाँकि, यह स्पष्ट नहीं है कि डेटा कहाँ पर प्लॉट किया जा रहा है (मैं कुछ छँटाई वाले एल्गोरिदम के डेटा को प्लॉट करने की कोशिश कर रहा हूँ, समय के विरुद्ध लंबाई, और मैं यह सुनिश्चित करना चाहूंगा कि लोगों को पता हो कि कौन सी लाइन कौन सी है)। इस प्रकार, मुझे एक किंवदंती की आवश्यकता है, हालांकि, नीचे दिए गए उदाहरण ( आधिकारिक साइट से ) पर एक नज़र डालें :

ax = subplot(1,1,1)
p1, = ax.plot([1,2,3], label="line 1")
p2, = ax.plot([3,2,1], label="line 2")
p3, = ax.plot([2,3,1], label="line 3")

handles, labels = ax.get_legend_handles_labels()

# reverse the order
ax.legend(handles[::-1], labels[::-1])

# or sort them by labels
import operator
hl = sorted(zip(handles, labels),
            key=operator.itemgetter(1))
handles2, labels2 = zip(*hl)

ax.legend(handles2, labels2)

आप देखेंगे कि मुझे एक अतिरिक्त चर बनाने की आवश्यकता है ax। मैं इस अतिरिक्त चर को बनाने और अपनी वर्तमान स्क्रिप्ट की सरलता को बनाए रखने के बिना अपने ग्राफ में एक किंवदंती कैसे जोड़ सकता हूं ?


एक अतिरिक्त चर बनाने की आपकी चिंता से मैं भ्रमित हूं। आपको वैसे भी उन वस्तुओं को पर्दे के पीछे करना होगा।
ताकसवेल

1
@tcaswell खैर मुझे उन्हें आत्मसात करने की कोशिश करो। मैं अतिरिक्त चर नहीं बनाना चाहता, क्योंकि यह पूरी स्क्रिप्ट में जटिलता जोड़ता है। मैं इसे छात्रों के एक समूह को सिखाने की कोशिश कर रहा हूं , और चूंकि उनका उपयोग matplotlibपहले नहीं हुआ है, इसलिए मैं चीजों को यथासंभव सरल रखना चाहता था। इसके अलावा, अगर आप रोब के उत्तर पर एक नज़र डालें, तो इसका उदाहरण वेबसाइट पर दिखाए गए उदाहरण से कहीं अधिक सरल है। मुझे आशा है कि वह मदद करेंगे।
गेम ब्रेनियाक

1
मैं तर्क दूंगा कि राज्य मशीन इंटरफेस का उपयोग करना लंबे समय में समझना कठिन हो जाता है क्योंकि ऐसा बहुत कुछ 'जादू से' किया जा रहा है। इसके अलावा, अधिवेशन का उपयोग import matplotlib.pyplot as pltकरने की जगह हैPyPlot
टैकसवेल

जवाबों:


440

label=अपनी प्रत्येक plot()कॉल में एक जोड़ें , और फिर कॉल करें legend(loc='upper left')

इस नमूने पर विचार करें (पायथन 3.8.0 के साथ परीक्षण):

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 20, 1000)
y1 = np.sin(x)
y2 = np.cos(x)

plt.plot(x, y1, "-b", label="sine")
plt.plot(x, y2, "-r", label="cosine")
plt.legend(loc="upper left")
plt.ylim(-1.5, 2.0)
plt.show()

यहां छवि विवरण दर्ज करें इस ट्यूटोरियल से थोड़ा संशोधित: http://jakevdp.github.io/mpl_tutorial/tutorial_pages/tut1.html


2
क्या ऐसा करने का कोई तरीका है यदि आपको श्रृंखला के प्लॉट किए जाने के समय लेबल नहीं पता है? यानी पहले से प्लॉट किए जाने के बाद एक श्रृंखला में लेबल जोड़ने का एक तरीका? या किंवदंती दिखाने से पहले प्लेसहोल्डर लेबल को संशोधित करने का एक तरीका हो सकता है?
davidA

13
plt.legend(loc='upper left')यह भी काम करता है, जहां pltसे है import matplotlib.pyplot as plt
मैट क्लिंसमिथ

धन्यवाद, @eric, इस पर ध्यान देने के लिए। मैंने कोड अपडेट कर दिया है।
रोबो

Upvoted क्योंकि ढेर अतिप्रवाह बहुत बढ़िया है और अच्छे जवाब बदल सकते हैं
eric

1
@ द्रविड़ हां, आप बस स्ट्रिंग्स की एक सूची पास कर सकते हैं plt.legend:plt.legend(['First Label', 'Second Label'])
अपोलो मोनिका

36

आप एक्सिस उदाहरण ( ax) के साथ पहुँच सकते हैं plt.gca()। इस मामले में, आप उपयोग कर सकते हैं

plt.gca().legend()

आप इसे label=अपने प्रत्येक plt.plot()कॉल में कीवर्ड का उपयोग करके या अपने लेबल को एक कार्य या सूची के legendरूप में असाइन करके , इस कार्य उदाहरण में कर सकते हैं:

import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-0.75,1,100)
y0 = np.exp(2 + 3*x - 7*x**3)
y1 = 7-4*np.sin(4*x)
plt.plot(x,y0,x,y1)
plt.gca().legend(('y0','y1'))
plt.show()

pltGcaLegend

हालाँकि, अगर आपको एक्सिस उदाहरण को एक बार और एक्सेस करने की आवश्यकता है, तो मैं इसे चर के axसाथ सहेजने की सलाह देता हूं

ax = plt.gca()

और फिर के axबजाय बुला रहा है plt.gca()


कॉपी-पेस्ट उत्तर जिसमें किसी भी पढ़ने की आवश्यकता नहीं है, और एक तस्वीर के साथ! यह उत्तर अधिक श्रेय का हकदार है
गुलज़ार

14

यहाँ एक उदाहरण के लिए आप मदद करने के लिए है ...

fig = plt.figure(figsize=(10,5))
ax = fig.add_subplot(111)
ax.set_title('ADR vs Rating (CS:GO)')
ax.scatter(x=data[:,0],y=data[:,1],label='Data')
plt.plot(data[:,0], m*data[:,0] + b,color='red',label='Our Fitting 
Line')
ax.set_xlabel('ADR')
ax.set_ylabel('Rating')
ax.legend(loc='best')
plt.show()

यहां छवि विवरण दर्ज करें


2
मैं बस उत्सुक हूं, आपकी फिटिंग लाइन डेटा से इतनी दूर क्यों है?
अपोलो मोनिका डे

13

एक किंवदंती के साथ साइन और कोसाइन घटता के लिए एक सरल साजिश।

उपयोग किया गया matplotlib.pyplot

import math
import matplotlib.pyplot as plt
x=[]
for i in range(-314,314):
    x.append(i/100)
ysin=[math.sin(i) for i in x]
ycos=[math.cos(i) for i in x]
plt.plot(x,ysin,label='sin(x)')  #specify label for the corresponding curve
plt.plot(x,ycos,label='cos(x)')
plt.xticks([-3.14,-1.57,0,1.57,3.14],['-$\pi$','-$\pi$/2',0,'$\pi$/2','$\pi$'])
plt.legend()
plt.show()

पाप और कोसाइन भूखंड (छवि देखने के लिए क्लिक करें)


6

अपने प्लॉट कॉल में प्रत्येक तर्क के लिए लेबल को उस श्रृंखला के अनुरूप जोड़ें जो इसे रेखांकन कर रही है, अर्थात label = "series 1"

फिर बस Pyplot.legend()अपनी स्क्रिप्ट के नीचे जोड़ें और किंवदंती इन लेबल को प्रदर्शित करेगा।


यह सही विचार है, लेकिन आप कभी भी लेबल नहीं जोड़ते हैं ताकि किंवदंती खाली हो जाए
tacaswell


0
    # Dependencies
    import numpy as np
    import matplotlib.pyplot as plt

    #Set Axes
    # Set x axis to numerical value for month
    x_axis_data = np.arange(1,13,1)
    x_axis_data

    # Average weather temp
    points = [39, 42, 51, 62, 72, 82, 86, 84, 77, 65, 55, 44]

    # Plot the line
    plt.plot(x_axis_data, points)
    plt.show()

    # Convert to Celsius C = (F-32) * 0.56
    points_C = [round((x-32) * 0.56,2) for x in points]
    points_C

    # Plot using Celsius
    plt.plot(x_axis_data, points_C)
    plt.show()

    # Plot both on the same chart
    plt.plot(x_axis_data, points)
    plt.plot(x_axis_data, points_C)

    #Line colors
    plt.plot(x_axis_data, points, "-b", label="F")
    plt.plot(x_axis_data, points_C, "-r", label="C")

    #locate legend
    plt.legend(loc="upper left")
    plt.show()
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.