【问题标题】:Hiding xticks labels every n-th label or on value on Pandas plot / make x-axis readable隐藏 xticks 标签每个第 n 个标签或 Pandas 图上的值/使 x 轴可读
【发布时间】:2018-11-22 00:30:27
【问题描述】:

因为图片问题比较长,实际内容不多。问题在底部。

嗨, 我有一系列 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 轴不是真正的用户友好:

我可以增加条之间的水平宽度,但我不想这样做。相反,我只想让 x 轴标签的一个子集可见。 我尝试使用MaxNLocator 和MultipleLocator 添加这一行:

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

但是,它没有达到我的目标,因为它现在错误地标记了条形图并删除了刻度(我理解,因为使用这些函数会更改 xticks 对象):

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

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

允许这种渲染,这接近我想要的:

但是我不满意,因为循环太天真了。我希望能够访问 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)

问题:是否有任何不同的解决方案,感觉更 Pythonic/高效?或者您对如何使这些数据具有可读性有什么建议?

【问题讨论】:

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


【解决方案1】:

我想你可以试试这样的:

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

【讨论】:

  • 我修改了它,现在检查一下@JeanRostan 在我没有注意到这些值是从 21 开始而不是从 0 开始之前
  • 谢谢,它确实有效,而且比丑陋的循环更干净。我接受了你下面的答案,因为它更通用,但非常感谢。
【解决方案2】:

您可以计算年龄范围内的所有十的倍数,并通过 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)

【讨论】:

    【解决方案3】:

    为了更通用,你可以这样做:

    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)
    

    【讨论】:

    • 谢谢,这就是我要找的东西,它比随机循环要干净得多。但是,它需要稍微调整位置:使用 xticks=l 将使刻度向右移动,因为我的起始数据点是 21。这是我添加的修复:ax.set(xticks=[x - l[0] for x in l], xticklabels=l)
    • 不,我保留它们,但我使用我的第一个实际值重新定位它们,因此它们被正确放置。如果省略 xticks,则所有值都是 1 间隔的,这会导致标签错误。
    • 啊,是的,我没有看到你的解决方案,也许你可以这样做:plt.xticks(l) 而不是:ax = plt.gca() ax.set(xticks=l, xticklabels=l) 但我没有什么可尝试的
    • 不行,labels 是 5-spaced,但是 labels 值是 1-spaced(标签 21 和 22 之间有 5 个空格),并且它们向右移动。尽管如此,谢谢,您的初始解决方案正是我想要的。
    猜你喜欢
    • 2015-12-26
    • 1970-01-01
    • 2020-07-08
    • 2017-04-03
    • 2011-05-04
    • 1970-01-01
    • 1970-01-01
    • 2020-07-10
    相关资源
    最近更新 更多