388 Stimmen

Matplotlib unterschiedliche Größe subplots

Ich muss einer Figur zwei Nebenhandlungen hinzufügen. Eine Teilfläche muss etwa dreimal so breit sein wie die zweite (gleiche Höhe). Ich habe dies erreicht mit GridSpec und die colspan Argument, aber ich würde dies gerne mit figure damit ich sie im PDF-Format speichern kann. Ich kann die erste Zahl mit der Funktion figsize Argument im Konstruktor, aber wie kann ich die Größe des zweiten Plots ändern?

612voto

Hagne Punkte 7760

f, (a0, a1) = plt.subplots(1, 2, width_ratios=[3, 1])

f, (a0, a1, a2) = plt.subplots(3, 1, height_ratios=[1, 1, 3])


enter image description here

  • Da es sich um eine kanonische Frage handelt, hier ein Beispiel mit vertikalen Teilbildern.

    plot it

    f, (a0, a1, a2) = plt.subplots(3, 1, gridspec_kw={'height_ratios': [1, 1, 3]})

    a0.plot(x, y) a1.plot(x, y) a2.plot(x, y)

    f.tight_layout()

enter image description here

268voto

bmu Punkte 32819

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

enter image description here

40voto

Jason Strimpel Punkte 13496

Ich habe pyplot 's axes Objekt, um die Größen manuell anzupassen, 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()

enter image description here

39voto

Sohail Ahmed Punkte 367

Auf einfache Art und Weise können auch unterschiedlich große Teilplots erstellt werden, ohne gridspec :

plt.figure(figsize=(12, 6))
ax1 = plt.subplot(2,3,1)
ax2 = plt.subplot(2,3,2)
ax3 = plt.subplot(2,3,3)
ax4 = plt.subplot(2,1,2)
axes = [ax1, ax2, ax3, ax4]

Output

38voto

endolith Punkte 23212

Der einfachste Weg ist wahrscheinlich die Verwendung von subplot2grid , beschrieben in Anpassen der Position von Teilplots mit GridSpec .

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

ist gleich

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

so wird das Beispiel der 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')

enter image description here

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X