如何分组聚合最小值/最大值并绘制分组条形图

How to groupby aggregate min / max and plot grouped bars

我正在尝试在同一张图中绘制 min ()max () 的函数,我已经可以使用 max () 的函数,但是我如何将两者加入相同的图形,它可以正确显示吗? 我的代码和输出示例:

df.groupby('fecha_inicio')['capacidad_base_firme'].max().plot(kind='bar', legend = 'Reverse')
plt.xlabel('Tarifa de Base firme por Zona')

我的数据框输出:

               zona  capacidad_base_firme  ...  fecha_inicio   fecha_fin
0               Sur               1.52306  ...    2016-01-01  2016-03-31
1            Centro               2.84902  ...    2016-01-01  2016-03-31
2         Occidente               1.57302  ...    2016-01-01  2016-03-31
3             Golfo               3.06847  ...    2016-01-01  2016-03-31
4             Norte               4.34706  ...    2016-01-01  2016-03-31
..              ...                   ...  ...           ...         ...
67            Golfo               5.22776  ...    2017-10-01  2017-12-31
68            Norte               6.99284  ...    2017-10-01  2017-12-31
69            Istmo               7.25957  ...    2017-10-01  2017-12-31
70         Nacional               0.21971  ...    2017-10-01  2017-12-31
71  Nacional con AB              -0.72323  ...    2017-10-01  2017-12-31

[72 rows x 10 columns]

步骤 1

创建子图以将数据绘制到

fig, ax = plt.subplots()

步骤 2

将您的 DataFrame 最大值和最小值绘制到特定轴

df.groupby('fecha_inicio')['capacidad_base_firme'].max().plot(ax = ax, kind='bar', legend = 'Reverse', label='Maximum')
df.groupby('fecha_inicio')['capacidad_base_firme'].min().plot(ax = ax, kind='bar', legend = 'Reverse', label='Minimum')

您可能需要调整 zorder 以获得堆积条形图的效果。

  • 正确的方法是用.agg, and then plot directly with pandas.DataFrame.plot同时聚合多个指标
    • 无需为每个指标调用 .groupby。对于非常大的数据集,这可能会占用大量资源。
    • 也不需要通过单独调用 matplotlib 创建图形和轴,因为这由 pandas.DataFrame.plot 处理,它使用 matplotlib 作为默认值后端。
  • 测试于 python 3.9.7pandas 1.3.4matplotlib 3.5.0
import seaborn as sns  # for data
import pandas as pd
import matplotlib.pyplot as plt

# load the test data
df = sns.load_dataset('penguins')

# display(df.head(3))
  species     island  bill_length_mm  bill_depth_mm  flipper_length_mm  body_mass_g     sex
0  Adelie  Torgersen            39.1           18.7              181.0       3750.0    Male
1  Adelie  Torgersen            39.5           17.4              186.0       3800.0  Female
2  Adelie  Torgersen            40.3           18.0              195.0       3250.0  Female

# aggregate metrics on a column
dfg = df.groupby('species').bill_length_mm.agg(['min', 'max'])

# display(dfg)
            min   max
species              
Adelie     32.1  46.0
Chinstrap  40.9  58.0
Gentoo     40.9  59.6

# plot the grouped bar
ax = dfg.plot(kind='bar', figsize=(8, 6), title='Bill Length (mm)', xlabel='Species', ylabel='Length (mm)', rot=0)
plt.show()

  • 对堆叠条使用 stacked=True
ax = dfg.plot(kind='bar', figsize=(8, 6), title='Bill Length (mm)', xlabel='Species', ylabel='Length (mm)', rot=0, stacked=True)