При построении гистограммы на python, как я могу сделать так, чтобы она была сложена для 2 столбцов, а не для одного столбца в фрейме данных pandas из 3 столбцов?

#python #pandas #matplotlib #bar-chart #stackedbarseries

Вопрос:

У меня есть фрейм данных с 4 столбцами в нем. скажем, столбец 1, столбец 2, столбец 3, столбец 4. столбец 1 состоит из столбцов 3 и 4. Я хочу построить столбчатую диаграмму со сложенными столбцами 3 и 4, но столбцами 1 и столбцами 2 как одиночные неупакованные. как я могу сделать этот гибридный пакет?

вот рамка даты, как:

 Date column1 column2 column3 column4  2021-08-20 19 30 11 8  2021-08-11 15 25 11 4  2021-08-07 5 10 5 0  2021-08-19 25 36 16 9  2021-08-31 6 6 6 0  

Я хочу, чтобы это выглядело примерно так, за исключением 1 сложенного бара(столбец 3 и столбец 4)

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

Я пытаюсь это сделать:

 ax = final_df[['Date', 'column1', 'column2']].plot(kind = 'bar', x = 'Date', stacked = False, rot = 90, figsize = (20,5)) ax = final_df[['Date', 'column3', 'column4']].plot(kind = 'bar', x = 'Date', stacked = True, rot = 90, figsize = (20,5))  

но это, очевидно, дает мне 2 сюжета

Комментарии:

1. но все равно останутся 2 разные группы, которые будут выглядеть сложенными? как я могу объединить их в одно

Ответ №1:

Вы можете построить график с помощью matplotlib, рассчитав позиции для каждого бара.

В следующем примере кода используется список списков, чтобы указать, какие столбцы идут вместе.

 import matplotlib.pyplot as plt import pandas as pd import numpy as np from io import StringIO  df_str = ''' Date column1 column2 column3 column4  2021-08-20 19 30 11 8  2021-08-11 15 25 11 4  2021-08-07 5 10 5 0  2021-08-19 25 36 16 9  2021-08-31 6 6 6 0''' final_df = pd.read_csv(StringIO(df_str), delim_whitespace=True)  columns_to_plot = ['column1', 'column2', ['column3', 'column4']]  fig, ax = plt.subplots(figsize=(20, 5)) bar_spots = len(columns_to_plot) bar_width = 0.8 / bar_spots pos = np.arange(len(final_df)) dodge_offsets = np.linspace(-bar_spots * bar_width / 2, bar_spots * bar_width / 2, bar_spots, endpoint=False) for columns, offset in zip(columns_to_plot, dodge_offsets):  bottom = 0  for col in ([columns] if isinstance(columns, str) else columns):  ax.bar(pos   offset, final_df[col], bottom=bottom, width=bar_width, align='edge', label=col)  bottom  = final_df[col] ax.set_xticks(pos) ax.set_xticklabels(final_df['Date'], rotation=0) ax.legend() plt.tight_layout() plt.show()  

столбчатая диаграмма с некоторыми столбцами, уложенными друг на друга, другие нет