Matplotlib barplot, forma genérica de configurar las tags xticklab en medio de la barra

El siguiente código genera una gráfica de barras con las xticklabels centradas para cada barra. Sin embargo, cambiar la escala del eje x, cambiar el número de barras o cambiar el ancho de la barra altera la posición de las tags. ¿Hay una forma genérica de tratar con ese comportamiento?

# This code is a hackish way of setting the proper position by trial # and error. import matplotlib.pyplot as plt import numpy as np y = [1,2,3,4,5] # adding 0.75 did the trick but only if I add a blank position to `xl` x = np.arange(0,len(y)) + 0.75 xl = ['', 'apple', 'orange', 'pear', 'mango', 'peach'] fig = plt.figure() ax = fig.add_subplot(111) ax.bar(x,y,0.5) ax.set_xticklabels(xl) # I cannot change the scaling without changing the position of the tick labels ax.set_xlim(0,5.5) 

La solución sugerida y de trabajo:

 import matplotlib.pyplot as plt import numpy as np y = [1,2,3,4,5] x = np.arange(len(y)) xl = ['apple', 'orange', 'pear', 'mango', 'peach'] fig = plt.figure() ax = fig.add_subplot(111) ax.bar(x,y,0.5, align='center') ax.set_xticks(x) ax.set_xticklabels(xl) 

Entonces el problema es que solo llamas ax.set_xticklabels . Esto corrige las tags, pero las posiciones de ticks aún son manejadas por AutoLocator , que agregará / eliminará ticks al cambiar los límites de los ejes.

Así que también necesitas arreglar las posiciones de tick:

 ax.set_xticks(x) ax.set_xticklabels(xl) 

Al llamar a set_xticks el AutoLocator se reemplaza debajo del capó con un FixedLocator .

Y luego puedes centrar las barras para que se vea mejor (opcional):

 ax.bar(x, y, 0.5, align='center')