2012-04-30 8 views
116

Devo aggiungere due sottotrame a una figura. Una sottotrama deve essere circa tre volte più ampia della seconda (stessa altezza). Ho realizzato questo utilizzando GridSpec e l'argomento colspan ma vorrei farlo utilizzando figure così posso salvare in PDF. Posso regolare la prima cifra usando l'argomento nel costruttore, ma come posso cambiare la dimensione del secondo grafico?Sottotrammi di diversa dimensione Matlotlib

+2

Gridspec funziona con una figura normale. – tillsten

risposta

165

È possibile utilizzare gridspec e 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

20

ho usato pyplot s' axes oggetto di regolare manualmente le dimensioni senza utilizzare 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

Utile per quelli di noi ancora su matplotlib 0.99 senza gridspec! – timday

+1

Utile per quelli dove gridspec è inadeguato – dreab

21

Probabilmente il modo più semplice utilizza subplot2grid, descritto i n Customizing Location of Subplot Using GridSpec.

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

è uguale

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

così l'esempio di BMU diventa:

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

Un altro modo è quello di utilizzare la funzione subplots e passare il rapporto larghezza con 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') 
+20

In realtà questa opzione mi piace di più, sono contento di averlo sceso verso il basso :) – astrojuanlu

+1

Grazie per questo; il modo di fare le cose 'plt.subplots 'è molto più pulito. –

+2

Mi piacciono le sottotrame meglio di gridspec in quanto non devi più occuparti delle impostazioni dell'elenco per gli assi (con gridspec devi ancora rendere l'asse e i grafici uno per uno). Quindi le sottotrame sono più pulite e più veloci da utilizzare –