Matplotlib अलग-अलग आकार के सबप्लॉट


237

मुझे एक आकृति में दो सबप्लॉट जोड़ने की आवश्यकता है। एक उपप्लॉट को दूसरे (समान ऊंचाई) के रूप में लगभग तीन गुना चौड़ा होना चाहिए। मैंने इसका उपयोग GridSpecऔर colspanतर्क को पूरा किया लेकिन मैं इसका उपयोग करना चाहूंगा figureताकि मैं पीडीएफ को बचा सकूं। मैं figsizeकंस्ट्रक्टर में तर्क का उपयोग करके पहले आंकड़े को समायोजित कर सकता हूं , लेकिन मैं दूसरे भूखंड के आकार को कैसे बदलूं?


2
ग्रिडस्पेक एक सामान्य आकृति के साथ काम करता है।
tillsten

जवाबों:


371

एक अन्य तरीका यह है कि subplotsफ़ंक्शन का उपयोग करें और इसके साथ चौड़ाई अनुपात पास करें gridspec_kw:

import numpy as np
import matplotlib.pyplot as plt 

# generate some data
x = np.arange(0, 10, 0.2)
y = np.sin(x)

# plot it
f, (a0, a1) = plt.subplots(1, 2, gridspec_kw={'width_ratios': [3, 1]})
a0.plot(x, y)
a1.plot(y, x)

f.tight_layout()
f.savefig('grid_figure.pdf')

1
इसके लिए धन्यवाद; plt.subplotsकाम करने के रास्ते अधिक स्वच्छ imo है।
ल्यूक डेविस

2
मुझे ग्रिडप्लेक से बेहतर सबप्लॉट पसंद हैं क्योंकि आपको अब धुरी के लिए सूची की सेटिंग्स से निपटना नहीं है (ग्रिडस्पेक के साथ आपको अभी भी अक्ष और भूखंडों को एक-एक करके बनाने की आवश्यकता है)। इसलिए सबप्लॉट क्लीनर और वास्तव में उपयोग करने के लिए तेज़ है
इलको वैन Vliet

3
क्या होगा अगर मैं एक पंक्ति में दो भूखंडों को भी ऊंचाई में भिन्न करना चाहता हूं? परिवर्तन height_ratioअन्य पंक्तियों के सापेक्ष पूरी पंक्ति को प्रभावित करता है।
मिशेल वैन जूइलेन

यह सबप्लॉट्स फ़ंक्शन के माध्यम से संभव नहीं है। हालाँकि, आप ऊपर दिए गए कोड में कुछ इस तरह जोड़ सकते हैं: mpl_toolkits.axes_grid1 से आयात करें_axes_locatable डिवाइडर = make_axes_locatable (a0) a_empty / "diver.append_axes (" नीचे ", आकार =" 50% ") a_empty.axis
हगैन

2
मुझे यह त्रुटि मिल रही है ValueError: Expected the given number of height ratios to match the number of rows of the grid। मैंने इसे {'width_ratios':[1]}1 पंक्ति, आदि के लिए कहकर हल किया
मार्कस वेबर

223

आप उपयोग कर सकते हैं gridspecऔर figure:

import numpy as np
import matplotlib.pyplot as plt 
from matplotlib import gridspec

# generate some data
x = np.arange(0, 10, 0.2)
y = np.sin(x)

# plot it
fig = plt.figure(figsize=(8, 6)) 
gs = gridspec.GridSpec(1, 2, width_ratios=[3, 1]) 
ax0 = plt.subplot(gs[0])
ax0.plot(x, y)
ax1 = plt.subplot(gs[1])
ax1.plot(y, x)

plt.tight_layout()
plt.savefig('grid_figure.pdf')

परिणामी भूखंड


31

संभवतः सरलतम तरीका उपयोग कर रहा है subplot2grid, जिसे ग्रिडप्लेस का उपयोग करके सबप्लॉट के कस्टमाइज़िंग स्थान में वर्णित किया गया है ।

ax = plt.subplot2grid((2, 2), (0, 0))

के बराबर है

import matplotlib.gridspec as gridspec
gs = gridspec.GridSpec(2, 2)
ax = plt.subplot(gs[0, 0])

इसलिए bmu का उदाहरण बनता है:

import numpy as np
import matplotlib.pyplot as plt

# generate some data
x = np.arange(0, 10, 0.2)
y = np.sin(x)

# plot it
fig = plt.figure(figsize=(8, 6))
ax0 = plt.subplot2grid((1, 3), (0, 0), colspan=2)
ax0.plot(x, y)
ax1 = plt.subplot2grid((1, 3), (0, 2))
ax1.plot(y, x)

plt.tight_layout()
plt.savefig('grid_figure.pdf')

29

मैं प्रयोग किया जाता pyplotहै axesवस्तु मैन्युअल का उपयोग किए बिना आकार समायोजित करने के लिए GridSpec:

import matplotlib.pyplot as plt
import numpy as np
x = np.arange(0, 10, 0.2)
y = np.sin(x)

# definitions for the axes
left, width = 0.07, 0.65
bottom, height = 0.1, .8
bottom_h = left_h = left+width+0.02

rect_cones = [left, bottom, width, height]
rect_box = [left_h, bottom, 0.17, height]

fig = plt.figure()

cones = plt.axes(rect_cones)
box = plt.axes(rect_box)

cones.plot(x, y)

box.plot(y, x)

plt.show()

2
हम में से उन लोगों के लिए उपयोगी अभी भी matplotlib 0.99 पर ग्रिडस्पेक के बिना!
दोपहर

3
उन लोगों के लिए उपयोगी जहां ग्रिडस्पीड अपर्याप्त है
dreab

सबसे अच्छा जवाब कभी। यदि आपको अलग-अलग डिमांटेशन (2 डी और 3 डी) के सबप्लॉट करना चाहते हैं तो वास्तव में क्या आवश्यक है और उन्हें अलग-अलग आकार देना चाहते हैं। यह समझना भी बहुत आसान है। धन्यवाद!
MO
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.