माटप्लोटलिब - वैश्विक किंवदंती और शीर्षक एक तरफ सबप्लॉट्स


125

मैंने मैटप्लॉट के साथ शुरुआत की है और कुछ बुनियादी भूखंडों का प्रबंधन किया है, लेकिन अब मुझे यह पता लगाना मुश्किल है कि मुझे कुछ सामान कैसे करना है:

मेरा वास्तविक सवाल यह है कि कैसे एक वैश्विक शीर्षक और वैश्विक किंवदंती को उप-बिंदुओं के साथ रखा जाए।

मैं 2x3 सबप्लॉट कर रहा हूं जहां मेरे पास विभिन्न रंगों (लगभग 200) में बहुत सारे अलग-अलग रेखांकन हैं। उनमें से (अधिकांश) भेद करने के लिए मैंने कुछ ऐसा लिखा

def style(i, total):
    return dict(color=jet(i/total),
                linestyle=["-", "--", "-.", ":"][i%4],
                marker=["+", "*", "1", "2", "3", "4", "s"][i%7])

fig=plt.figure()
p0=fig.add_subplot(321)
for i, y in enumerate(data):
    p0.plot(x, trans0(y), "-", label=i, **style(i, total))
# and more subplots with other transN functions

(इस पर कोई विचार! :)) प्रत्येक सबप्लॉट का एक ही स्टाइल फंक्शन होता है।

अब मैं सभी सबप्लॉट्स के लिए एक वैश्विक खिताब पाने की कोशिश कर रहा हूं और एक वैश्विक किंवदंती भी है जो सभी शैलियों की व्याख्या करता है। इसके अलावा, मुझे वहां पर सभी 200 शैलियों को फिट करने के लिए फ़ॉन्ट को छोटा करने की आवश्यकता है (मुझे पूरी तरह से अनूठी शैली की आवश्यकता नहीं है, लेकिन कम से कम कुछ प्रयास)

क्या कोई मुझे इस कार्य को हल करने में मदद कर सकता है?


1
वैश्विक शीर्षक: matplotlib.sourceforge.net/examples/pylab_examples/…
ev-br

जवाबों:


192

वैश्विक शीर्षक : मैटलपोटलिब के नए रिलीज़ में चित्रा.सूटिटेल () विधि का उपयोग कर सकते हैं Figure:

import matplotlib.pyplot as plt
fig = plt.gcf()
fig.suptitle("Title centered above all subplots", fontsize=14)

वैकल्पिक रूप से ( @Steven C. Howell की टिप्पणी के आधार पर नीचे (आपको धन्यवाद!)), Matplotlib.pyplot.suptitle () फ़ंक्शन का उपयोग करें :

 import matplotlib.pyplot as plt
 # plot stuff
 # ...
 plt.suptitle("Title centered above all subplots", fontsize=14)

64
इस तरह से आयात करने वालों के लिए: import matplotlib.pyplot as pltकमांड को बस plt.figure(); plt.suptitle('Title centered above all subplots'); plt.subplot(231); plt.plot(data[:,0], data[:,1]);आदि के रूप में दर्ज किया जा सकता है ...
स्टीवन सी। हॉवेल

1
धन्यवाद। यह वास्तविक चयनित उत्तर होना चाहिए।
gustafbstrom

62

ऑर्बस्ट के उत्तर के अलावा, कोई भी सबप्लॉट्स को नीचे शिफ्ट करना चाह सकता है। यहाँ OOP शैली में एक MWE है:

import matplotlib.pyplot as plt

fig = plt.figure()
st = fig.suptitle("suptitle", fontsize="x-large")

ax1 = fig.add_subplot(311)
ax1.plot([1,2,3])
ax1.set_title("ax1")

ax2 = fig.add_subplot(312)
ax2.plot([1,2,3])
ax2.set_title("ax2")

ax3 = fig.add_subplot(313)
ax3.plot([1,2,3])
ax3.set_title("ax3")

fig.tight_layout()

# shift subplots down:
st.set_y(0.95)
fig.subplots_adjust(top=0.85)

fig.savefig("test.png")

देता है:

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


2
इसका सबसे अच्छा उत्तर होना चाहिए
स्टेटम

माना ! स्वीकृत उत्तर एक और निर्भरता का परिचय देता है, इसलिए ओपी प्रश्न का ठीक से उत्तर नहीं देता है।
योहन ओबदिया

7

लीजेंड लेबल के लिए नीचे की तरह कुछ का उपयोग कर सकते हैं। लीजेंडलैबल्स प्लॉट लाइनों को बचाए हुए हैं। modFreq वे होते हैं, जहां प्लॉट लाइनों के अनुरूप वास्तविक लेबल का नाम होता है। फिर तीसरा पैरामीटर किंवदंती का स्थान है। अंत में, आप किसी भी दलील में पास हो सकते हैं क्योंकि मैं यहां नीचे हूं लेकिन मुख्य रूप से पहले तीन की जरूरत है। इसके अलावा, यदि आप लेबल को प्लॉट कमांड में सही ढंग से सेट करते हैं, तो आपको माना जाता है। लोकेशन पैरामीटर के साथ केवल लेजेंड को कॉल करने के लिए और यह प्रत्येक लाइनों में लेबल पाता है। मैंने नीचे के रूप में अपनी खुद की किंवदंती बनाने के लिए बेहतर किस्मत पाई है। उन सभी मामलों में काम करने लगता है जहां कभी नहीं लगता था कि दूसरे रास्ते को ठीक से जाना है। अगर आपको समझ नहीं आया तो मुझे बताएं:

legendLabels = []
for i in range(modSize):
    legendLabels.append(ax.plot(x,hstack((array([0]),actSum[j,semi,i,semi])), color=plotColor[i%8], dashes=dashes[i%4])[0]) #linestyle=dashs[i%4]       
legArgs = dict(title='AM Templates (Hz)',bbox_to_anchor=[.4,1.05],borderpad=0.1,labelspacing=0,handlelength=1.8,handletextpad=0.05,frameon=False,ncol=4, columnspacing=0.02) #ncol,numpoints,columnspacing,title,bbox_transform,prop
leg = ax.legend(tuple(legendLabels),tuple(modFreq),'upper center',**legArgs)
leg.get_title().set_fontsize(tick_size)

आप फॉन्टसाइज़ या लेजेंड के लगभग किसी भी पैरामीटर को बदलने के लिए लेग का भी उपयोग कर सकते हैं।

वैश्विक टिप्पणी जैसा कि ऊपर टिप्पणी में कहा गया है, दिए गए लिंक के अनुसार पाठ जोड़ने के साथ किया जा सकता है: http://matplotlib.sourceforge.net/examples/pylab_examples/newscalarformatter_demo.html

f.text(0.5,0.975,'The new formatter, default settings',horizontalalignment='center',
       verticalalignment='top')

4

suptitleजाने का रास्ता लगता है, लेकिन इसके लायक क्या है, figureइसके लिए एक transFigureसंपत्ति है जिसका आप उपयोग कर सकते हैं:

fig=figure(1)
text(0.5, 0.95, 'test', transform=fig.transFigure, horizontalalignment='center')
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.