Как складывать только выбранные столбцы на графике pandas barh

#python #pandas #matplotlib #bar-chart #stacked-chart

Вопрос:

Я пытаюсь построить гистограмму, на которой я хотел бы иметь два бара, один сложенный, а другой не сложенный рядом с другим.

У меня есть первый участок, который представляет собой сложенный участок:

введите описание изображения здесь

И еще один сюжет, с теми же линиями и столбцами:

введите описание изображения здесь

Я хочу построить его рядом со столбцами последнего графика, а не складывать его в стопку:

Это фрагмент кода для репликации моей проблемы:

 d = pd.DataFrame({'DC': {'col0': 257334.0,
  'col1': 0.0,
  'col2': 0.0,
  'col3': 186146.0,
  'col4': 0.0,
  'col5': 366431.0,
  'col6': 461.0,
  'col7': 0.0,

  'col8': 0.0},
 'DC - IDC': {'col0': 32665.0,
  'col1': 0.0,
  'col2': 156598.0,
  'col3': 0.0,
  'col4': 176170.0,
  'col5': 0.0,
  'col6': 0.0,
  'col7': 0.0,
  'col8': 0.0},
 'No Address': {'col0': 292442.0,
  'col1': 227.0,
  'col2': 298513.0,
  'col3': 117167.0,
  'col4': 249.0,
  'col5': 747753.0,
  'col6': 271976.0,
  'col7': 9640.0,
  'col8': 211410.0}})




d[['DC', 'DC - IDC']].plot.barh(stacked=True)
d[['No Address']].plot.barh( stacked=False, color='red')
 

Ответ №1:

Используйте position параметр для рисования 2 столбцов в одном индексе:

 fig, ax = plt.subplots()
d[['DC', 'DC - IDC']].plot.barh(width=0.4, position=0, stacked=True, ax=ax)
d[['No Address']].plot.barh(width=0.4, position=1, stacked=True, ax=ax, color='red')
plt.show()
 

барх

Ответ №2:

Вы можете достичь этого только с помощью библиотеки matplotlib.pyplot. Во-первых, вам нужно импортировать библиотеки NumPy и matplotlib.

 import matplotlib.pyplot as plt
import numpy as np
 

Затем,

 plt.figure(figsize=(15,8))
plt.barh(d.index, d['DC'], 0.4, label='DC', align='edge')
plt.barh(d.index, d['DC - IDC'], 0.4, label='DC - IDC', align='edge')
plt.barh(np.arange(len(d.index))-0.4, d['No Address'], 0.4, color='red', label='No Address', align='edge')
plt.legend();
 

Вот что я сделал:

  • Увеличьте размер рисунка (необязательно)
  • Создайте БарКонтейнер для каждого столбца
  • Уменьшите ширину каждого бруска до 0,4, чтобы они поместились
  • Выровняйте левые края полосок по позициям y
  • Обычно все бары теперь сложены стопкой. Чтобы убрать красные полосы в сторону, вам нужно вычесть каждую координату y на ширину полос (0,4). np.arange(len(d.index))-0.4
  • Наконец, добавьте легенду

Это должно выглядеть так: введите описание изображения здесь