Questa è una delle mie più grandi frustrazioni con Matplotlib. Lavoro spesso con dati raster dove ad esempio voglio aggiungere una mappa colori, una legenda e un titolo. Qualsiasi semplice esempio tratto dalla galleria matplotlib comporterà una diversa risoluzione e quindi dati ricampionati. Soprattutto quando si esegue l'analisi delle immagini non si desidera ricampionare (indesiderato).
Ecco cosa faccio di solito, anche se mi piacerebbe sapere se ci sono modi più semplici o migliori.
lascia l'inizio con il caricamento di un'immagine ed emetterlo così come è con la stessa risoluzione:
import matplotlib.pyplot as plt
import urllib2
# load the image
img = plt.imread(urllib2.urlopen('http://upload.wikimedia.org/wikipedia/en/thumb/5/56/Matplotlib_logo.svg/500px-Matplotlib_logo.svg.png'))
# get the dimensions
ypixels, xpixels, bands = img.shape
# get the size in inches
dpi = 72.
xinch = xpixels/dpi
yinch = ypixels/dpi
# plot and save in the same size as the original
fig = plt.figure(figsize=(xinch,yinch))
ax = plt.axes([0., 0., 1., 1.], frameon=False, xticks=[],yticks=[])
ax.imshow(img, interpolation='none')
plt.savefig('D:\\mpl_logo.png', dpi=dpi, transparent=True)
noti che i definita manualmente la posizione degli assi in modo che abbraccia l'intera figura.
In modo simile a quanto sopra si potrebbe aggiungere un certo margine intorno all'immagine per consentire etichette o colorbars ecc
questo esempio viene aggiunto un margine del 20% sopra l'immagine, che viene poi utilizzato per il tracciato di un titolo:
fig = plt.figure(figsize=(xinch,yinch/.8))
ax = plt.axes([0., 0., 1., .8], frameon=False, xticks=[],yticks=[])
ax.imshow(img, interpolation='none')
ax.set_title('Matplotlib is fun!', size=16, weight='bold')
plt.savefig('D:\\mpl_logo_with_title.png', dpi=dpi)
Così la figura y-size (altezza) viene aumentata e la dimensione y degli assi è diminuita in modo uguale. Ciò fornisce un'immagine di output (generale) più ampia, ma l'area degli assi avrà ancora le stesse dimensioni.
Potrebbe essere bello avere una proprietà di figura o di assi come .set_scale() per forzare un vero output 1-su-x.
È possibile che 'gridspec' ti permetta di controllare ciò che vuoi (vedi gli ultimi 3 [esempi qui] (http://matplotlib.org/examples/pylab_examples/demo_tight_layout.html)). Potresti aggiungere alcuni esempi che mostrano differenti descrizioni degli assi che causano problemi? – Bonlenfum
Questo è un costo del modo in cui MPL decompila la descrizione di cosa disegnare e _how_ per disegnarlo. Abbastanza sicuro di farlo a mano, evitando accuratamente "tight_layout", è il modo migliore per farlo. – tacaswell