Скрытие xticks помечает каждую n-ю метку или значение на графике Панд / делает ось X читаемой - PullRequest
0 голосов
/ 12 июня 2018

Вопрос довольно длинный из-за картинок, но в действительности не так много контента.Вопрос внизу.

Привет, у меня есть серия из 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.Я попытался использовать MaxNLocator и MultipleLocator, добавив эту строку:

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ответ ):

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

Ugly workaround

Вопрос: есть ли другое решение, которое кажется более питонским / эффективным?Или у вас есть предложения, как сделать эти данные читаемыми?

Ответы [ 3 ]

0 голосов
/ 12 июня 2018

Чтобы быть более общим, вы можете сделать что-то вроде этого:

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)
0 голосов
/ 13 июня 2018

Вы можете вычислить все кратные десяти в пределах вашего диапазона Эпох и поместить их в команду заговора через 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)
0 голосов
/ 12 июня 2018

Я думаю, вы можете попробовать что-то вроде этого:

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