2013-02-25 9 views
9

Ho un problema simile a quello pubblicato here. La differenza è che ottengo spazi bianchi indesiderati all'interno dell'area del grafico quando tracciai due sottotrame che condividono gli assi tramite gli attributi sharex e sharey. Gli spazi bianchi rimangono attivi anche dopo aver impostato autoscale(False). Ad esempio, utilizzando il codice simile come nella risposta al post di cui sopra:matplotlib.pyplot.imshow: rimozione dello spazio bianco nei grafici quando si utilizzano gli attributi "sharex" e "sharey"

import matplotlib.pyplot as plt 
import numpy as np 

fig = plt.figure() 
ax = fig.add_subplot(2, 1, 1) 
ax.imshow(np.random.random((10,10))) 
ax.autoscale(False) 
ax2 = fig.add_subplot(2, 1, 2, sharex=ax, sharey=ax) # adding sharex and sharey 
ax2.imshow(np.random.random((10,10))) 
ax2.autoscale(False) 
plt.show() 

risultati in immagine this.

Ho anche provato ax.set_xlim(0, 10) e ax.set_xbound(0, 10) come da suggerimenti here, ma senza successo. Come posso liberarmi degli spazi bianchi extra? Qualsiasi idea sarebbe apprezzata.

risposta

14

Come suggerito here, aggiungendo:

ax.set_adjustable('box-forced') 
ax2.set_adjustable('box-forced') 

risolve il problema.

(documentation)

+0

Questo è utile, ma vorrei aggiungere un altro modo, se non ti dispiace perdere le proporzioni e vuoi riempire tutto lo spazio degli assi disponibile: usa 'aspect = 'auto'' in' imshow() '. – PlasmaBinturong

1

Il problema è il macchinario utile dall'uso di add_subplot. Si noti che la quantità di spazio bianco cambia se si ridimensiona la figura.

Quanto segue sembra funzionare (finché si ri-size figura)

import matplotlib.pyplot as plt 
import numpy as np 

fig = plt.figure(figsize=(5, 5)) 
ax = fig.add_axes([.3, .55, .35, .35]) 
ax.imshow(np.random.random((10,10))) 
ax.autoscale(False) 
ax2 = fig.add_axes([.3, .05, .35, .35], sharex=ax, sharey=ax) 
ax2.imshow(np.random.random((10,10))) 
ax2.autoscale(False) 

plt.show() 

Questo appare come un brutto rapporto tra la dimensione/posizione dell'oggetto axes, gli assi comuni, e il rapporto uguale aspetto da imshow.

Se si può vivere con le zecche, si può fare

ax.set_axis_off() 
ax2.set_axis_off() 

penso che vale la pena di aprire un problema sul github matplotlib per questo.

+1

impostazione 'aspetto = auto' sarebbe sbarazzarsi degli spazi bianchi in questo caso, ma questo non è sempre l'ideale. Ho aperto un problema sul github matplotlib come suggerito - grazie. – mlynn

3

Utilizzando plt.subplots come:

fig, ax = plt.subplots(nrows=2, ncols=1, sharex=True, sharey=False) 
ax[0].imshow(np.random.random((10,10))) 
ax[0].autoscale(False) 
ax[1].imshow(np.random.random((10,10))) 
ax[1].autoscale(False) 

ottengo this figure senza spazi bianchi all'interno di assi. Utilizzando all'interno di plt.subplots o fig.subplots_adjust è possibile ottenere rapporti assi migliori.

+0

Grazie. Tuttavia, mi piacerebbe una soluzione in cui gli intervalli degli assi non cambiano con il ridimensionamento della figura. – mlynn

+0

@mlynn: cosa intendi? vuoi che le tue asce abbiano sempre le stesse dimensioni assolute (come 5x5 cm)? oppure vuoi che mantengano lo stesso rapporto aspetto indipendentemente dalla dimensione della figura? –

+0

Quello che vorrei è che ogni sottotrama visualizzi le dimensioni complete dell'immagine (in questo caso 10x10 pixel), mantenendo lo stesso rapporto aspetto indipendentemente dalla dimensione della figura. Fondamentalmente, se non aggiungo le opzioni 'sharex' e' sharey' nel mio codice originale sopra, ottengo le trame che voglio. Posso ridimensionare la figura e ogni sottotrama si ridimensionerà di conseguenza. La ragione per cui vorrei che gli assi fossero condivisi è che quando eseguo lo zoom su una sottotrama, vorrei che l'altra sottotrama aumentasse di conseguenza. – mlynn

Problemi correlati