В чем разница между matplotlib bar() и функцией pandas bar()?

#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()
  

категориальный график в matplotlib

Столбцы 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'])