2012-06-29 7 views
14

A menudo, quiero hacer un gráfico de barras de recuentos. Si los recuentos son bajos, a menudo obtengo localizaciones mayores y/o menores que no son enteros. ¿Cómo puedo prevenir esto? No tiene sentido tener un tic en 1.5 cuando los datos son recuentos.matplotlib de Python restringir a ubicaciones de tilde enteras

Este es mi primer intento:

import pylab 
pylab.figure() 
ax = pylab.subplot(2, 2, 1) 
pylab.bar(range(1,4), range(1,4), align='center') 
major_tick_locs = ax.yaxis.get_majorticklocs() 
if len(major_tick_locs) < 2 or major_tick_locs[1] - major_tick_locs[0] < 1: 
    ax.yaxis.set_major_locator(pylab.MultipleLocator(1)) 
minor_tick_locs = ax.yaxis.get_minorticklocs() 
if len(minor_tick_locs) < 2 or minor_tick_locs[1] - minor_tick_locs[0] < 1: 
    ax.yaxis.set_minor_locator(pylab.MultipleLocator(1)) 

que funciona bien cuando los conteos son pequeñas pero cuando son grandes, consigo muchas marcas menores:

import pylab 
ax = pylab.subplot(2, 2, 2) 
pylab.bar(range(1,4), range(100,400,100), align='center') 
major_tick_locs = ax.yaxis.get_majorticklocs() 
if len(major_tick_locs) < 2 or major_tick_locs[1] - major_tick_locs[0] < 1: 
    ax.yaxis.set_major_locator(pylab.MultipleLocator(1)) 
minor_tick_locs = ax.yaxis.get_minorticklocs() 
if len(minor_tick_locs) < 2 or minor_tick_locs[1] - minor_tick_locs[0] < 1: 
    ax.yaxis.set_minor_locator(pylab.MultipleLocator(1)) 

¿Cómo puedo obtener el comportamiento deseado del primer ejemplo con conteos pequeños mientras se evita lo que sucede en el segundo?

+0

Esto está incorrectamente marcado como duplicado. Fue preguntado antes de la otra pregunta. La otra pregunta debe ser la marcada como duplicada. – John

Respuesta

24

Usted puede utilizar el método MaxNLocator, así:

from pylab import MaxNLocator 

    ya = axes.get_yaxis() 
    ya.set_major_locator(MaxNLocator(integer=True)) 
+1

Creo que 'pylab.MaxNLocator()' es una notación mejor. – FooBar

+2

o si no está importando pylab, 'matplotlib.ticker.MaxNLocator()'. (de [esta respuesta] (http://stackoverflow.com/a/27496811/2452770)) –

0

Creo que puedo ignorar los tics menores. Voy a dar a este un ir y ver si se pone de pie en todos los casos de uso:

def ticks_restrict_to_integer(axis): 
    """Restrict the ticks on the given axis to be at least integer, 
    that is no half ticks at 1.5 for example. 
    """ 
    from matplotlib.ticker import MultipleLocator 
    major_tick_locs = axis.get_majorticklocs() 
    if len(major_tick_locs) < 2 or major_tick_locs[1] - major_tick_locs[0] < 1: 
     axis.set_major_locator(MultipleLocator(1)) 

def _test_restrict_to_integer(): 
    pylab.figure() 
    ax = pylab.subplot(1, 2, 1) 
    pylab.bar(range(1,4), range(1,4), align='center') 
    ticks_restrict_to_integer(ax.xaxis) 
    ticks_restrict_to_integer(ax.yaxis) 

    ax = pylab.subplot(1, 2, 2) 
    pylab.bar(range(1,4), range(100,400,100), align='center') 
    ticks_restrict_to_integer(ax.xaxis) 
    ticks_restrict_to_integer(ax.yaxis) 

_test_restrict_to_integer() 
pylab.show() 
2
pylab.bar(range(1,4), range(1,4), align='center') 

y

xticks(range(1,40),range(1,40)) 

ha trabajado en mi código. Simplemente use el parámetro opcional align y xticks hace la magia.

+0

¿Este método no da demasiados tics para grandes rangos? – John

Cuestiones relacionadas