web-dev-qa-db-fra.com

Matplotlib sous-parcelles de taille différente

Je dois ajouter deux sous-parcelles à une figure. Une sous-parcelle doit être environ trois fois plus large que la seconde (même hauteur). J'ai accompli ceci en utilisant GridSpec et l'argument colspan mais j'aimerais le faire en utilisant figure afin de pouvoir enregistrer au format PDF. Je peux ajuster le premier chiffre à l'aide de l'argument figsize du constructeur, mais comment puis-je modifier la taille du deuxième tracé?

193
Jason Strimpel

Une autre méthode consiste à utiliser la fonction subplots et à transmettre le rapport de largeur avec 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')
301
Hagne

Vous pouvez utiliser gridspec et 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')

resulting plot

202
bmu

Le moyen le plus simple est probablement d'utiliser subplot2grid, décrit dans la section Personnalisation de l'emplacement de la sous-parcelle à l'aide de GridSpec .

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

est égal à

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

ainsi, l'exemple de bmu devient:

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

J'ai utilisé l'objet pyplot de axes pour ajuster manuellement les tailles sans utiliser 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()
26
Jason Strimpel