2013-04-16 19 views
12

Sto producendo un grafico di qualità di pubblicazione da incorporare in latex e mi piacerebbe essere molto preciso in termini di dimensioni e caratteri (in modo che i caratteri sono della stessa misura nell'articolo come nella trama). Per evitare che la trama si riduca in lattice mi piacerebbe avere la dimensione esatta, ma non posso. Qui è il mio codice:pad_inches = 0 e bbox_inches = "tight" rende la trama più piccola di quanto dichiarato figg.

import matplotlib.pyplot as plt 
from matplotlib import rc, rcParams 
from numpy import sin 

rc('text', usetex=True) 
rc('font', family='serif', serif='Computer Modern Roman', size=8) 
rc('legend', fontsize=10) 

width_in = 5 
fig = plt.figure(1, figsize=(width_in, 2)) 
ax = fig.add_subplot(111) 
ax.plot(range(0,100), sin(range(0,100))) 

fig.tight_layout() 
fig.savefig('test.eps', bbox_inches='tight', pad_inches=0) 
plt.close() 

Il problema è con bbox_inches = 'stretto' e pad_inches = 0. L'aggiunta di queste opzioni rende la mia trama di 4,76 pollici di larghezza invece di 5 pollici dichiarati. Ma voglio che salvino lo spazio. Quindi come risolverlo?

Modifica: Bene, le risposte suggeriscono di rimuovere bbox_inches='tight' e pad_inches=0 e utilizzare solo il tight_layout(). Quindi le immagini hanno le giuste dimensioni, tuttavia ha ancora delle imbottiture bianche intorno. Posso rimuoverlo con fig.tight_layout(pad=0), ma poi il titolo della figura si è spostato all'interno della scatola, che sembra brutto. D'altra parte posso usare tight_layout(rect=[...]) e ottenere il risultato desiderato, ma è un lavoro manuale per ottenere i numeri corretti - Non mi piace. Quindi, al momento non vedo alcuna soluzione facile e generale al mio problema.

risposta

13

Il problema che si sta verificando è che lo bbox_inches='tight' rimuove solo tutto lo spazio bianco extra attorno alla figura, in realtà non riorganizza nulla nella figura, dopo che è stata renderizzata.

Potrebbe essere necessario modificare i parametri passati a tight_layout (tutorial) per ottenere l'effetto desiderato.

Speriamo che questo ti porti nella giusta direzione.

+0

Ho una domanda di follow-up su questo: ho il testo sopra la figura bbox di default, quindi se li salvi direttamente il testo verrà ritagliato. Se uso bbox_inches = 'tight', i margini delle figure vengono tagliati. C'è un modo per fare solo bbox_inches = 'tight' nella direzione verticale? –

+0

Poi fai una nuova domanda – tacaswell

+0

Grazie! Ho fatto ed è qui: http://stackoverflow.com/questions/23532036/showing-text-outside-the-figure-limits –

0

La trama originale deve avere spazi bianchi intorno, altrimenti bbox_inches = tight non rimuoverà alcuna area. Ci sono due soluzioni a questo, che io sappia:

  1. Il metodo semplice è quello di utilizzare tight_layout come detto da tcaswell.

  2. Il più complicato, ma più controllabile metodo è quello di evitare l'uso di fig.add_subplot(111) e di utilizzare invece fig.add_axes(), che ti permette di essere molto più severa in termini di come grandi siano i vostri assi sono quando si definisce l'istanza assi. È quindi possibile modificare le dimensioni degli assi per occupare l'area delle figure necessaria per mantenere un'area di figure da 5 ". Dopo aver fatto ciò, consigliamo semplicemente di non utilizzare bbox_inches o di impostarlo su Nessuno (impostazione predefinita). per evitare ritaglio unnessicary fig.add_axes() richiede un parametro rect come primo parametro che consiste [left_position, bottom_position, width, height] ciascuno dei quali vanno da 0 a 1.

Edit:. Dopo aver attraversato il tight_layout esercitazione di nuovo, ho capito che copre praticamente tutto, non mi ero reso conto che fosse in grado di mantenere facilmente le proporzioni dell'istanza degli assi, anche se le proporzioni della figura sono diverse da quelle dell'istanza degli assi. Tendo ad essere molto esplicito quandoDefinisco le aree dei miei assi perché mi occupo di immagini satellitari e cerco di mantenerle come la risoluzione nativa del sensore o qualche fattore di quella risoluzione del sensore, che richiede un po 'più di controllo.

0

Ho lo stesso problema di creare grafici matplotlib per LaTeX. Poiché i miei grafici non consentivano di utilizzare tight_layout, dando l'avviso this, ho finito con l'utilizzo di fig.subplots_adjust(bottom=bottom_pos, top=top_pos, left=left_pos, right=right_pos). Vedi questo tutorial. Richiede manualmente la ricerca dei valori migliori per bottom_pos ecc. Ma nel mio caso sembra essere l'unica possibilità di ottenere immagini senza molto spazio bianco senza modificare la dimensione della figura dell'output.

Problemi correlati