Matplotlib unterschiedliche Größe subplots

Ich muss zwei Teilflächen zu einer Figur hinzufügen. Eine Teilfläche muss etwa dreimal so breit sein wie die zweite (gleiche Höhe). Ich habe dies mit GridSpec und dem Argument colspan erreicht, aber ich würde dies gerne mit figure machen, damit ich in PDF speichern kann. Die erste Abbildung kann ich mit dem Argument figsize im Konstruktor anpassen, aber wie kann ich die Größe der zweiten Darstellung ändern?

Sie können gridspec und figure verwenden:

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')

Kommentare (0)

Der einfachste Weg ist wahrscheinlich die Verwendung von subplot2grid, beschrieben in Customizing Location of Subplot Using GridSpec.

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

ist gleichbedeutend mit

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

also wird bmu's Beispiel zu:

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')
Kommentare (0)

Ich habe pyplot's axes Objekt benutzt, um die Größen manuell anzupassen, ohne GridSpec zu benutzen:

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()
Kommentare (2)