Matplotlib-Untergrundstücke unterschiedlicher Größe

235

Ich muss einer Figur zwei Nebenhandlungen hinzufügen. Ein Teilplot muss ungefähr dreimal so breit sein wie der zweite (gleiche Höhe). Ich habe dies mit GridSpecund dem colspanArgument erreicht, aber ich möchte dies mit verwenden, figuredamit ich es als PDF speichern kann. Ich kann die erste Zahl mithilfe des figsizeArguments im Konstruktor anpassen , aber wie ändere ich die Größe des zweiten Diagramms?

Jason Strimpel
quelle
2
Gridspec arbeitet mit einer normalen Figur.
Tillsten

Antworten:

369

Eine andere Möglichkeit besteht darin, die subplotsFunktion zu verwenden und das Breitenverhältnis zu übergeben mit 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')
Hagne
quelle
1
Danke dafür; Die plt.subplotsArt und Weise, Dinge zu tun, ist imo viel sauberer.
Luke Davis
2
Ich mag Unterplots besser als Gridspec, da Sie sich nicht mehr mit Einstellungen in der Liste für die Achse befassen müssen (mit Gridspec müssen Sie die Achse und die Plots immer noch einzeln erstellen). Nebenhandlungen sind also sauberer und schneller zu verwenden
Eelco van Vliet
3
Was ist, wenn ich möchte, dass sich die beiden Grundstücke in einer Reihe auch in der Höhe unterscheiden? Das Ändern height_ratioscheint sich auf die gesamte Zeile im Vergleich zu anderen Zeilen auszuwirken.
Mitchell van Zuylen
Dies ist über die Subplots-Funktion nicht möglich. Sie können dem obigen Code jedoch Folgendes hinzufügen: aus mpl_toolkits.axes_grid1 import make_axes_locatable divider = make_axes_locatable (a0) a_empty = divider.append_axes ("bottom", size = "50%") a_empty.axis ('off')
Hagne
2
Ich erhalte diesen Fehler ValueError: Expected the given number of height ratios to match the number of rows of the grid. Ich löste es, indem ich {'width_ratios':[1]}für 1 Reihe usw. sagte
Markus Weber
223

Sie können verwenden gridspecund 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')

resultierende Handlung

bmu
quelle
31

Der wahrscheinlich einfachste Weg ist die Verwendung subplot2grid, beschrieben unter Anpassen des Speicherorts des Unterplots mithilfe von GridSpec .

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

entspricht

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

so wird bmus beispiel:

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')
Endolith
quelle
29

Früher habe ich pyplot‚s axesObjekt manuell die Größen einstellen , ohne 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()
Jason Strimpel
quelle
2
Nützlich für diejenigen von uns, die noch auf Matplotlib 0.99 ohne Gridspec sind!
Tag
3
Nützlich für diejenigen, bei denen die Gitterspezifikation nicht ausreicht
träumen Sie vom
Beste Antwort aller Zeiten. Genau das, was benötigt wird, wenn Sie Unterzeichnungen mit unterschiedlichen Abmessungen (2D und 3D) erstellen möchten und möchten, dass diese unterschiedliche Größen haben. Es ist auch ziemlich leicht zu verstehen. Danke dir!
MO