按像素值移动 matplotlib xticklabels

Tho*_*ger 0 python matplotlib python-3.x

如何将刻度标签移动几个像素?

就我而言,我想将X 轴上的This is class #N -labels 向右移动几个像素。

知道的 horizontalalign/harightcenterleft; 但我想“改善”right对齐的外观。

以下面的例子为例,它将产生如下图所示的图:

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')
Run Code Online (Sandbox Code Playgroud)

结果是:

我主观上认为,如果将标签向右平移以便将勾号放在“#”上,情节会更好看。换句话说,是rightcenter对齐选项之间的“中间地带” 。

旁注

我正在使用熊猫,但我相信这与问题无关,因为它无论如何都使用 matplotlib 进行绘图。

plt.xticks()方法用于简单起见,我也可以使用ax.set_xticklabels(),但我不需要重写标签文本,AFAIK 没有设置水平对齐的快捷方式,而无需将现有标签复制到 with 中ax.set_xticklabels(labels, **more_options),因为ha不是matplotlib 2ax.xaxis.set_tick_params()方法中的有效

我知道熊猫的Series.hist()- 方法,但我认为Series.value_counts().plot(kind='bar')当我的类别很少并且希望条形数量与类别数量相同时,它看起来更漂亮。

Imp*_*est 5

为了将刻度标签移动几个像素,您可以向它们的转换链添加翻译。例如向右移动 20 个像素,使用

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

当然,如果您需要移动以使 # 符号位于刻度线下方的像素数不是先验明确的 - 这需要通过反复试验来找出。或者,您可能对其他单位想要移动多少有不同的暗示。

这是完整的例子,

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()
Run Code Online (Sandbox Code Playgroud)

生产

在此处输入图片说明