2012-01-03 15 views
7

Ho la generazione di grafici a barre che assomigliano a questo:Barh matplotlib produce la spaziatura tra le barre traballante

enter image description here

Si noti che la spaziatura verticale sulle etichette non è uniforme per qualche ragione; Non sono sicuro che questo abbia a che fare con il modo in cui ho assegnato i tick o qualunque meccanismo stia effettivamente posizionando il testo. codice rilevante:

height_factor = 40.0 
ind = np.linspace(0,len(sorted_totals)*height_factor,num=len(sorted_totals)) 
width = 0.25 
fig = plt.figure(figsize=(15.5, 8.75),dpi=300) 
p1 = plt.barh(ind,map(int,sorted_composite[:,0]),color='blue',align='center',height=height_factor) 
p1 = plt.barh(ind,map(int,sorted_composite[:,2]),color=(0.75,0.1,0.1),align='center',height=height_factor) 
plt.ylabel('# of Picks (blue) + # of Bans (red)') 
plt.yticks(ind, sorted_totals[:,0]) 
plt.subplots_adjust(bottom=0.05, left=0.14,right=0.95,top=0.95) 
plt.ylim([ind.min() - height_factor, ind.max() + height_factor]) 

mio dati sono memorizzati in sorted_composite e ind sono i valori che sto usando per posizionare le barre (Le posizioni Ytick). Sto usando linspace per produrre barre distanziate uniformemente e questo è solo un tipo di lavoro e non sono sicuro del perché.

+0

Stavo pensando che il problema può essere correlato ad avere tutti quei bar piuttosto stipati, ma ho cercato il codice da Da 5 a ~ 50 bar e nessun problema qui. –

+0

Sì, ho la sensazione che sia un problema di arrotondamento del posizionamento dei pixel ..cioè se hai un'immagine alta 8 pixel e vuoi disegnare una linea attraverso il centro la disegna lungo la riga di pixel 4 o la riga di pixel 5; in entrambi i casi sembra male – user1127062

+0

Su un lato nota ottengo risultati male anche con un banco di prova banale: 'da NumPy import *' da pylab import * Dati = zeri (50) 10 ind = arange (10) barh (ind, data) show() ' Sembra piuttosto male – user1127062

risposta

1

come suggerisce l'utente1127062, potrebbe essere che il codice sia corretto.

Se non è necessario il complotto per essere interattivo, salvarlo come SVG

Se si esegue:

data = numpy.random.randn(10000) 
pylab.hist(data,300) 
pylab.savefig(fileName+'.svg',format='svg') 

vedrete l'aliasing pixel (nelle larghezze bar) la finestra di figura, ma è andata nel file SVG.

Il backend "cairo" sembra fare il miglior lavoro di salvataggio dei file PNG, se svg non sono compatibili con quello che stai facendo. Sembrano buoni come uno screenshot del SVG.

È possibile attivare il back-end.

import matplotlib 
# you have to change the backend before importing pylab 
matplotlib.use('cairo') 
import pylab 

raw "cairo" non supporta show(), quindi non è possibile utilizzarlo in modalità interattiva, o per mostrare una trama direttamente da un programma.

Il backend "GTKCairo" ha il meglio dei due mondi, ma non è abilitato nell'installazione predefinita (almeno non in quella che ho avuto con sudo apt-get install matplotlib)

Se stai usando Ubuntu Penso che tutti voi bisogno di fare per farlo funzionare è quello di installare gtk, e ricompilare matplotlib:

sudo apt-get install git-core python-gtk2-dev 
git clone git://github.com/matplotlib/matplotlib.git 
cd matplotlib 
sudo python setup.py install 

è possibile verificare quale backend è attiva con:

matplotlib.get_backend() 

è c Un carico automaticamente il back-end preferito di caccia ai file matplotlibrc, ho trovato il mio in:

/usr/local/lib/python2.7/dist-packages/matplotlib/mpl-data/matplotlibrc 
Problemi correlati