Вопрос довольно длинный из-за картинок, но в действительности не так много контента.Вопрос внизу.
Привет, у меня есть серия из 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ответ ):
for i, l in enumerate(labels):
val = int(l.get_text())
if val % 10 != 0:
labels[i] = ''
plt.gca().set_xticklabels(labels)
Вопрос: есть ли другое решение, которое кажется более питонским / эффективным?Или у вас есть предложения, как сделать эти данные читаемыми?