隐藏xticks标记每个第n个标签或Pandas图上的值/使x轴可读

时间:2018-06-12 14:48:52

标签: python python-3.x pandas matplotlib axis-labels

由于图片问题很长,但现实中的内容并不多。问题在底部。

您好, 我有一系列30000个样本,年龄从21到74不等。 系列负责人:

0    24
1    26
2    34
3    37
4    57
Name: AGE, dtype: int64

我使用内置的Pandas功能.plot绘制它:

age_series = original_df['AGE']
fig = plt.figure()
fig.suptitle('Age distribution')
age_series.value_counts().sort_index().plot(kind='bar')

我的问题是它使x轴不是真正用户友好的: Original plotting

我可以增加条形之间的水平宽度,但我不想这样做。相反,我想只显示可见的x轴标签的子集。 我尝试使用MaxNLocatorMultipleLocator添加此行:

plt.gca().xaxis.set_major_locator(plt.MaxNLocator(10))

但是,它没有实现我的目标,因为它现在错误地标记了条形并删除了刻度(我明白了,因为使用这些函数会改变xticks对象): MaxNLocator(10)

一个丑陋的解决方案是在xticks对象中循环:

xticks = plt.gca().xaxis.get_major_ticks()
for i in range(len(xticks)):
    if i % 10 != 0:
        xticks[i].set_visible(False)

允许此渲染,这接近我想要的: enter image description here

然而,我并不满意,因为循环太天真了。我希望能够从xticks(标签)访问值并对其做出决定,以便只能显示10个标签中的多个。

这有效(基于this answer):

for i, l in enumerate(labels):
    val = int(l.get_text())
    if val % 10 != 0:
        labels[i] = ''
    plt.gca().set_xticklabels(labels)

Ugly workaround

问题:有没有不同的解决方案,感觉更Pythonic /有效?或者您对如何使这些数据可读有建议吗?

3 个答案:

答案 0 :(得分:4)

为了更通用,你可以做类似的事情:

import numpy as np

ax = plt.gca()

max_value = original_df['AGE'].max()
min_value = original_df['AGE'].min()
number_of_steps = 5
l = np.arange(min_value, max_value+1, number_of_steps)

ax.set(xticks=l, xticklabels=l)

答案 1 :(得分:2)

我想你可以尝试这样的事情:

ax = plt.gca()
pos = [9,19,29,39,49]
l = [30,40,50,60,70]
ax.set(xticks=pos, xticklabels=l)

答案 2 :(得分:0)

你可以计算你的年龄范围内的所有10的倍数,并通过xticks kwarg将它放在你的情节命令中:

age_series = original_df['AGE']

xt = np.arange(age_series.min(), age_series.max()+1)
xt = xt[xt%10==0]

fig = plt.figure()
fig.suptitle('Age distribution')
age_series.value_counts().sort_index().plot(kind='bar', xticks=xt)