#python #database #pandas #dataframe #matplotlib
#python #База данных #pandas #фрейм данных #matplotlib
Вопрос:
Рассмотрим следующий фрейм данных:
index count sum
0 4 3372 230
1 4 68855 343
2 2 17948 232
3 5 708 788
4 5 9117 558
Я хочу построить гистограмму, сначала сгруппировав по столбцу «индекс», и для каждого «индекса» построить среднее значение «count». Я могу сделать это двумя способами:
Метод 1:
groups = df.groupby('index')
for name,group in groups:
print(name)
print(group)
plt.bar(name, group['count'].median(), label=name, align='center')
plt.legend()
plt.show()
Приведенный выше код приводит к:
Способ 2:
df.groupby('index')['count'].median().plot.bar()
plt.xlabel('index')
plt.ylabel('count')
plt.title('index')
plt.show()
Что приводит к:
1. Как я могу получить уникальный цвет для каждой панели при использовании 2-го метода?
2. Как я могу получить непрерывный график при использовании 1-го метода (существует разрыв между 1-м и 2-м)?
Комментарии:
1. Если вы хотите, чтобы первый график был категориальным, а не числовым, используйте `plt.bar (str (name), …)`
2.
df.loc[:,['index','count']].groupby('index').mean().T.plot.bar()
?
Ответ №1:
Стандартная линейчатая диаграмма matplotlib рассматривает ось x как числовую, когда значения x являются числовыми. Просто измените их на string, если вы хотите, чтобы они были категориальными:
groups = df.groupby('index')
for name, group in groups:
plt.bar(str(name), group['count'].median(), label=name, align='center')
plt.legend()
Столбцы pandas будут иметь категориальную ось x, также когда значения являются числовыми. Для раскрашивания полос color=
можно использовать параметр (цвета по умолчанию имеют имена ‘C0’, ‘C1’ и т.д.):
df.groupby('index')['count'].median().plot.bar(color=['C0', 'C1', 'C2'])
Комментарии:
1. Это работает, когда я знаю количество баров. В конкретном случае, над которым я работаю, я не знаю количество баров (количество уникальных значений), которые там есть. Как мне тогда получить другой цвет для каждой панели?
2. Если вы задаете слишком много цветов, pandas просто берет первые. Например
df.groupby('index')['count'].median().plot.bar(color=[f'C{i}' for i in range(20)])
. Илиdf.groupby('index')['count'].median().plot.bar(color=[plt.cm.tab20(i/20) for i in range(20)])
.3. Это сработало @JohanC. вместо 20 используется ‘len(df[‘index’].unique())’ . Можете ли вы сказать, что означает f’C{i}’. Как я это понимаю!!
4.
f'C{i}'
является f-строкой . Значениеi % 10
преобразуется в строку и объединяется с остальными. Итак, для i, переходящего от 0 к 20, создается['C0', 'C1', 'C2', 'C3', 'C4', 'C5', 'C6', 'C7', 'C8', 'C9', 'C0', 'C1', 'C2', ...]
Ответ №2:
Просто укажите список цветов в качестве аргумента для plot.bar()
df.groupby('index')['count'].median().plot.bar(color=['red', 'green', 'blue'])