- Данные необходимо преобразовать в длинный формат, используя
.stack
- Из-за шкалы значений
'log'
используется для yscale
- В пример включены все категории в
'cats'
. - Выберите только нужные столбцы перед объединением или используйте
dfl = dfl[dfl.cats.isin(['sub', 'vc'])
, чтобы отфильтровать желаемый 'cats'
.
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# setup dataframe
data = {'vc': [76, 47, 140, 106, 246], 'tv': [29645400, 28770702, 50234486, 30704017, 272551386], 'sub': [66100, 15900, 44500, 37000, 76700], 'name': ['a', 'b', 'c', 'd', 'e']}
df = pd.DataFrame(data)
# convert to long
dfl = df.set_index('name').stack().reset_index().rename(columns={'level_1': 'cats', 0: 'values'}).sort_values('values', ascending=False).reset_index(drop=True)
# plot
chart = sns.barplot(x='name', y='values', data=dfl, hue='cats')
chart.set_xticklabels(chart.get_xticklabels(), rotation=90)
plt.yscale('log')
for p in chart.patches:
chart.annotate("{:,.2f}".format(p.get_height(), '.2f'), (p.get_x() + p.get_width() / 2., p.get_height()), ha = 'center', va = 'center', xytext = (0, 10), textcoords = 'offset points')
введите описание изображения здесь