按像素值

时间:2018-01-18 16:36:48

标签: python python-3.x matplotlib

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

就我而言,我想将X轴上的这是#N - 标签向右移动几个像素。

我是aware of the 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')

结果:

我认为,主观上说,如果标签被翻译到右边,那么情节看起来会更好,以便将标记放在“#”上。换句话说,rightcenter对齐选项之间的“中间地带”。

旁注

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

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

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

1 个答案:

答案 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()
制造

enter image description here