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
risposta
È 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')
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()
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')
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')
In realtà questa opzione mi piace di più, sono contento di averlo sceso verso il basso :) – astrojuanlu
Grazie per questo; il modo di fare le cose 'plt.subplots 'è molto più pulito. –
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 –
Gridspec funziona con una figura normale. – tillsten