У меня проблема. Я хочу показать две самые высокие страны в каждой категории. Но, к сожалению, я получаю только вывод ниже. Тем не менее, я бы хотел, чтобы part
был указан как дополнительная категория.
Есть ли вариант?
import pandas as pd
import seaborn as sns
d = {'count': [50, 20, 30, 100, 3, 40, 5],
'country': ['DE', 'CN', 'CN', 'BG', 'PL', 'BG', 'RU'],
'part': ['b', 'b', 's', 's', 'b', 's', 's']
}
df = pd.DataFrame(data=d)
print(df)
#print(df.sort_values('count', ascending=False).groupby('party').head(2))
ax = sns.barplot(x = "country", y = "count", hue='part',
data=df.sort_values('count', ascending=False).groupby('part').head(2), palette='GnBu')
Что я имею
Что я хочу
Следующий подход создает FacetGrid
для ваших данных. В Seaborn 11.2 появился полезный g.axes_dict
. (В примере данных я изменил вторую запись для «BG» на «b», предполагая, что каждая комбинация страны/части встречается только один раз, как на примерах графиков).
from matplotlib import pyplot as plt
import seaborn as sns
import pandas as pd
d = {'count': [50, 20, 30, 100, 3, 40, 5],
'country': ['DE', 'CN', 'CN', 'BG', 'PL', 'BG', 'RU'],
'part': ['b', 'b', 's', 's', 'b', 'b', 's']
}
df = pd.DataFrame(data=d)
sns.set()
g = sns.FacetGrid(data=df, col='part', col_wrap=2, sharey=True, sharex=False)
for part, df_part in df.groupby('part'):
order = df_part.nlargest(2, 'count')['country']
ax = sns.barplot(data=df_part, x='country', y='count', order=order, palette='summer', ax=g.axes_dict[part])
ax.set(xlabel=f'part = {part}')
g.set_ylabels('count')
plt.tight_layout()
plt.show()
Вы всегда можете не использовать seaborn и напрямую строить все в matplotlib.
from matplotlib import pyplot as plt
import pandas as pd
plt.style.use('seaborn')
df = pd.DataFrame({
'count': [50, 20, 30, 100, 3, 40, 5],
'country': ['DE', 'CN', 'CN', 'BG', 'PL', 'BG', 'RU'],
'part': ['b', 'b', 's', 's', 'b', 'b', 's']
})
fig, ax = plt.subplots()
offset = .2
xticks, xlabels = [], []
handles, labels = [], []
for i, (idx, group) in enumerate(df.groupby('part')):
plot_data = group.nlargest(2, 'count')
x = [i - offset, i + offset]
barcontainer = ax.bar(x=x, height=plot_data['count'], width=.35)
xticks += x
xlabels += plot_data['country'].tolist()
handles.append(barcontainer[0])
labels.append(idx)
ax.set_xticks(xticks)
ax.set_xticklabels(xlabels)
ax.legend(handles=handles, labels=labels, title='Part')
plt.show()
И как можно было изменить номер, чтобы было видно тройку лучших?
Вам нужно будет изменить назначение x
на x = [i - offset, i, i + offset]
, изменить group.n_largest(3)
, а затем поиграть с параметрами width
и offset
, чтобы установить интервал/группировку полос.
Большое спасибо! Я очень ценю это. Есть ли возможность изменить цвет?