РЕДАКТИРОВАТЬ: я нашел лучшее решение, чем то, что я написал оригинально ниже
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")
Оригинальный ответ:
Похоже, что 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")
преобразование в строку кажется недостаточным
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")
это работает
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")