Панель сортировки проблем (в порядке убывания) отображает верхние 30 значений моего информационного кадра, используя Seaborn - PullRequest
0 голосов
/ 12 октября 2018

У меня проблемы с сортировкой (уменьшением) верхних 30 значений гистограммы с использованием Seaborn.Я использую некоторые рекомендации, которые я нашел здесь, но у меня все еще есть проблема.

Мой текущий скрипт выглядит следующим образом:

c_firms_2008a = c_firms_2008.sort_values(['diversity'], ascending=False).reset_index(drop=True).head(n=20)

ax = sns.catplot(x="code_city", y="diversity", kind="bar", data=c_firms_2008a, aspect=16/8, palette="GnBu_d")
ax.set(xlabel='Industries', ylabel='VAT Generated, US Dollars')
ax.set_xticklabels(rotation=30)

мой результирующий график выглядит так ...

enter image description here

что я делаю не так?

1 Ответ

0 голосов
/ 15 октября 2018

РЕДАКТИРОВАТЬ: я нашел лучшее решение, чем то, что я написал оригинально ниже

catplot не учитывает сортировку кадра данных.Поэтому, чтобы обеспечить правильное упорядочение ваших баров, используйте параметр order=:

df = pd.DataFrame({'code': np.arange(10), 'val':np.random.normal(size=(10,))})
df_sorted = df.sort_values(by='val', ascending=False)
ax = sns.catplot(x="code", y="val", kind="bar", data=df_sorted, order=df_sorted.code, aspect=16/8, palette="GnBu_d")

enter code here

Оригинальный ответ:

Похоже, что catplot всегда сортирует ось X, если они числа (или выглядят как числа).(Далеко не идеальное) решение состоит в том, чтобы преобразовать ваши x-категории в нечто, что не может быть приведено к числам:

df = pd.DataFrame({'code': np.arange(10), 'val':np.random.normal(size=(10,))})
df_sorted = df.sort_values(by='val', ascending=False)

это не работает (как вы узнали):

ax = sns.catplot(x="code", y="val", kind="bar", data=df_sorted, aspect=16/8, palette="GnBu_d")

enter image description here

преобразование в строку кажется недостаточным

df_sorted2 = df_sorted.copy()
df_sorted2['code'] = df_sorted2.code.astype(str)
ax = sns.catplot(x="code", y="val", kind="bar", data=df_sorted2, aspect=16/8, palette="GnBu_d")

enter image description here

это работает

df_sorted3 = df_sorted.copy()
df_sorted3['code'] = df_sorted3['code'].map(lambda x: '#{:d}'.format(x))
ax = sns.catplot(x="code", y="val", kind="bar", data=df_sorted3, aspect=16/8, palette="GnBu_d")

enter image description here

...