Tho*_*ger 0 python matplotlib python-3.x
如何将刻度标签移动几个像素?
就我而言,我想将X 轴上的This is class #N -labels 向右移动几个像素。
我知道的 horizontalalign/ha值right,center和left; 但我想“改善”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)
结果是:

我主观上认为,如果将标签向右平移以便将勾号放在“#”上,情节会更好看。换句话说,是right和center对齐选项之间的“中间地带” 。
旁注:
我正在使用熊猫,但我相信这与问题无关,因为它无论如何都使用 matplotlib 进行绘图。
该plt.xticks()方法用于简单起见,我也可以使用ax.set_xticklabels(),但我不需要重写标签文本,AFAIK 没有设置水平对齐的快捷方式,而无需将现有标签复制到 with 中ax.set_xticklabels(labels, **more_options),因为ha不是matplotlib 2的ax.xaxis.set_tick_params()方法中的有效键。
我知道熊猫的Series.hist()- 方法,但我认为Series.value_counts().plot(kind='bar')当我的类别很少并且希望条形数量与类别数量相同时,它看起来更漂亮。
为了将刻度标签移动几个像素,您可以向它们的转换链添加翻译。例如向右移动 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)
生产
| 归档时间: |
|
| 查看次数: |
972 次 |
| 最近记录: |