Moviendo matplotlib xticklabels por valor de píxel

¿Cómo puedo mover las tags de tick por unos pocos píxeles?

En mi caso, quiero mover la etiqueta Esta es la clase #N en el eje X a la derecha unos pocos píxeles.

Estoy al tanto de los valores de alanta de horizontalalign / ha right , center e left ; pero quiero “mejorar” el aspecto de la alineación right .

Tomemos el siguiente ejemplo que producirá la gráfica que se muestra a continuación:

 import pandas as pd import numpy as np categories = ['This is class #{}'.format(n) for n in range(10)] data = { 'Value': [categories[np.random.randint(10)] for _ in range(100)], 'id': [1000+i for i in range(100)] } df = pd.DataFrame(data) ax = df.Value.value_counts().sort_index().plot(kind='bar', rot=45) plt.xticks(ha='right') 

Resultados en:

Creo, subjetivamente, que la ttwig se vería mejor si las tags se tradujeran a la derecha para que la marca se colocara sobre el “#”. En otras palabras, un “punto medio” entre las opciones de alineación right y center .

Notas al margen :

Estoy usando pandas, pero creo que eso es irrelevante para el problema, ya que está usando matplotlib para hacer su trazado de todos modos.

El método plt.xticks() se usa por simplicidad, yo podría usar ax.set_xticklabels() , pero no necesito reescribir los textos de las tags, y AFAIK no hay un atajo para establecer la alineación horizontal sin copiar también las tags existentes en con ax.set_xticklabels(labels, **more_options) , ya que ha no es una clave válida en el método ax.xaxis.set_tick_params() matplotlib 2 .

Soy consciente del método Series.hist() de pandas, pero creo que Series.value_counts().plot(kind='bar') ve más bonito cuando tengo pocas categorías y quiero que el número de barras sea el mismo como numero de categorias.

Para mover los ticklabels unos pocos píxeles, puede agregar una traducción a su cadena de transformación. Por ejemplo, para mover 20 píxeles a la derecha, use

 import matplotlib.transforms as mtrans # ... trans = mtrans.Affine2D().translate(20, 0) for t in ax.get_xticklabels(): t.set_transform(t.get_transform()+trans) 

Si la cantidad de píxeles que necesita cambiar para que el signo # esté debajo de la marca de verificación no está clara a priori, debe averiguarse mediante prueba y error. O tal vez tenga una sugerencia diferente de cuánto quiere cambiar en qué otras unidades.

Aquí está el ejemplo completo,

 import matplotlib.pyplot as plt import pandas as pd import numpy as np import matplotlib.transforms as mtrans categories = ['This is class #{}'.format(n) for n in range(10)] data = { 'Value': [categories[np.random.randint(10)] for _ in range(100)], 'id': [1000+i for i in range(100)] } df = pd.DataFrame(data) ax = df.Value.value_counts().sort_index().plot(kind='bar', rot=45) plt.xticks(ha='right') trans = mtrans.Affine2D().translate(20, 0) for t in ax.get_xticklabels(): t.set_transform(t.get_transform()+trans) plt.tight_layout() plt.show() 

productor

introduzca la descripción de la imagen aquí