由于图片问题很长,但现实中的内容并不多。问题在底部。
您好, 我有一系列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轴标签的子集。
我尝试使用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 /有效?或者您对如何使这些数据可读有建议吗?
答案 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)