2012-01-03 12 views
7

He sido la generación de gráficos de barras que se ven así:barh matplotlib produce poco firme espaciamiento entre barras

enter image description here

en cuenta que el espacio vertical en las etiquetas es desigual por alguna razón; No estoy seguro de si esto tiene que ver con la forma en que he asignado los tics o el mecanismo que está colocando el texto. código relevante:

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]) 

Mi datos se almacenan en sorted_composite y ind son los valores que estoy usando para colocar las barras (las localizaciones Ytick). Estoy usando linspace para producir barras espaciadas uniformemente, y esto solo funciona y no estoy seguro exactamente por qué.

+0

Estaba pensando que su problema puede estar relacionado con tener todas esas barras en vez encajados, pero yo he estado tratando su código de 5 a ~ 50 bares y no hay problema aquí. –

+0

Sí, tengo la sensación de que se trata de un problema de redondeo de colocación de píxeles.es decir, si tiene una imagen de 8 píxeles de altura y desea dibujar una línea a través del centro, la dibuja a lo largo de la fila de píxeles 4 o de la fila de píxeles 5; De cualquier manera se ve mal – user1127062

+0

En una nota consigo malos resultados, incluso con un caso de prueba trivial: 'de importación numpy *' de pylab importación de datos * = ceros (50) 10 ind = arange (10) barh (ind, data) show() ' Parece bastante malo – user1127062

Respuesta

1

como user1127062 sugiere, podría ser que su código esté bien.

Si usted no necesita la trama para ser interactivo, guardarlo como un SVG

Si ejecuta:

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

verá el aliasing de píxeles (en los anchos de las barras) en la ventana de figura, pero se ha ido en el archivo svg.

El backend "cairo" parece hacer el mejor trabajo al guardar archivos png, si svg no es compatible con lo que está haciendo. Se ven tan bien como una captura de pantalla de la svg.

Puede cambiar el motor ejecutando.

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

prima "El Cairo" no soporta show(), por lo que no se puede utilizar en modo interactivo, o para mostrar un gráfico directamente desde un programa.

El backend "GTKCairo" tiene lo mejor de ambos mundos, pero no está habilitado en la instalación por defecto (al menos no en la que me dieron con sudo apt-get install matplotlib)

Si utilizas Ubuntu creo que todo lo que necesita hacer para conseguir que funcione es instalar GTK, y recompilar 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 

se puede comprobar que base es activa con:

matplotlib.get_backend() 

Haces c Una carga automáticamente su base de favorito por la caza de su archivo matplotlibrc, encontré mina en:

/usr/local/lib/python2.7/dist-packages/matplotlib/mpl-data/matplotlibrc 
Cuestiones relacionadas