2013-10-10 11 views
17

Dato un set di axes in matplotlib, esiste un modo per determinarne la dimensione in pixel? Ho bisogno di ridimensionare le cose in base all'adattamento per figure più grandi o più piccole.determina la dimensione dell'asse della matrice in pixel

(In particolare desidera cambiare la larghezza di riga quindi è proporzionato alla dimensione assi.)

+0

è possibile utilizzare un'uscita in base vettore? – tacaswell

risposta

30

Questo dà la larghezza e l'altezza in pollici.

bbox = ax.get_window_extent().transformed(fig.dpi_scale_trans.inverted()) 
width, height = bbox.width, bbox.height 

Che probabilmente è sufficiente per il vostro scopo, ma per ottenere pixel, è possibile moltiplicare per fig.dpi:

width *= fig.dpi 
height *= fig.dpi 

Per esempio,

import matplotlib.pyplot as plt 

def get_ax_size(ax): 
    bbox = ax.get_window_extent().transformed(fig.dpi_scale_trans.inverted()) 
    width, height = bbox.width, bbox.height 
    width *= fig.dpi 
    height *= fig.dpi 
    return width, height 

fig, ax = plt.subplots() 
print(get_ax_size(ax)) 
#(496.0, 384.00000000000006) 

ax2 = plt.axes([0.3, 0.3, 0.7, 0.7]) 
print(get_ax_size(ax2)) 
# (448.0, 336.0) 

To make an image of exactly that figure size, devi rimuovere il bianco lo spazio tra la figura e l'asse:

import numpy as np 
import matplotlib.pyplot as plt 

def get_ax_size(ax): 
    bbox = ax.get_window_extent().transformed(fig.dpi_scale_trans.inverted()) 
    width, height = bbox.width, bbox.height 
    width *= fig.dpi 
    height *= fig.dpi 
    return width, height 

data = np.arange(9).reshape((3, 3)) 
fig = plt.figure(figsize=(8,6), dpi=80) 
ax = plt.Axes(fig, [0., 0., 1., 1.]) 
ax.set_axis_off() 
fig.add_axes(ax) 
ax.imshow(data, aspect='normal') 
print(get_ax_size(ax)) 
# (640.0, 480.0) 
plt.savefig('/tmp/test.png', dpi=80) 

% identify /tmp/test.png 
/tmp/test.png PNG 640x480 640x480+0+0 8-bit DirectClass 50.5KB 0.020u 0:00.020 
+0

funziona anche per le sottotrame? –

+0

Sì, lo credo. Ho cambiato l'esempio per mostrare cosa succede su un sub-asse arbitrario. – unutbu

+0

hmm, non sembra perfettamente preciso, ma abbastanza buono per i miei scopi! –

Problemi correlati