如何将刻度标签移动几个像素?
就我而言,我想将X轴上的这是#N - 标签向右移动几个像素。
我是aware of the 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')
结果:
我认为,主观上说,如果标签被翻译到右边,那么情节看起来会更好,以便将标记放在“#”上。换句话说,right
和center
对齐选项之间的“中间地带”。
旁注:
我正在使用熊猫,但我认为这与问题无关,因为无论如何它都使用matplotlib进行绘图。
plt.xticks()
方法用于简单,我也可以使用ax.set_xticklabels()
,但我不需要重写标签文本,而AFAIK没有设置水平对齐的快捷方式不会将现有标签复制到ax.set_xticklabels(labels, **more_options)
,因为ha
不是有效key in matplotlib 2的ax.xaxis.set_tick_params()
方法。
我知道大熊猫'Series.hist()
- 方法,但我认为Series.value_counts().plot(kind='bar')
看起来更漂亮,因为我的类别很少,并希望条形数与类别数相同。< / p>
答案 0 :(得分:2)
为了将滴答标签移动几个像素,您可以在其转换链中添加转换。例如。要向右移动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)
当然,为了让#-sign在勾选标记下而需要移动的像素数不是先验明确的 - 需要通过反复试验找出。或者你可能有不同的提示,你想要在其他单位中转移多少。
这是完整的例子,
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()
制造