如何在pandas groupby场景下绘制多变量subplot子图?
解决方案
方案1:自定义程度高的手动分配子图方案
这种方案可以单独调整每个子图的样式、坐标轴配置,适合需要精细化调整的场景。
import matplotlib.pyplot as plt # 1. 提前计算所有变量按Hour分组的均值,避免重复分组计算 hourly_stats = df.groupby('Hour')[['var1', 'var2', 'var3']].mean() # 2. 创建子图网格,nrows、ncols根据你要绘制的变量数量调整,示例为3个变量3行1列 fig, axes = plt.subplots(nrows=3, ncols=1, figsize=(10, 15)) # 3. 配置每个变量的绘图参数,可按需新增、修改 var_settings = [ ("var1", "red", "o"), ("var2", "green", "^"), ("var3", "blue", "s") ] # 4. 遍历变量和子图,逐个绘制 for ax, (var_name, color, marker) in zip(axes, var_settings): hourly_stats[var_name].plot( ax=ax, color=color, marker=marker ) ax.set_title(var_name) # 可在此处添加更多子图配置,比如ax.set_ylabel("均值")、ax.grid(True)等 # 自动调整子图间距,避免标题、标签重叠 plt.tight_layout() plt.show()
方案2:快速生成的内置参数方案
如果不需要精细化调整每个子图,可以直接用pandas plot的subplots参数一键生成多图:
import matplotlib.pyplot as plt hourly_stats = df.groupby('Hour')[['var1', 'var2', 'var3']].mean() hourly_stats.plot( subplots=True, figsize=(10, 15), color=["red", "green", "blue"], marker=["o", "^", "s"] ) plt.tight_layout() plt.show()
补充说明
核心逻辑是通过plot方法的ax参数指定绘图的子图对象,和你是否使用groupby计算数据没有关联,groupby仅负责提前聚合出需要绘制的数据集。
如果你的变量数量较多,需要使用多列的子图网格(比如2行2列),只需将生成的axes数组扁平化后再循环即可:
# 示例为4个变量,2行2列布局 fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(12, 10)) axes = axes.flatten() # 将二维的axes数组转为一维,方便循环匹配变量 # 后续循环逻辑和方案1完全一致
内容的提问来源于stack exchange,提问作者Julián Ricardo Ángel Palomino
相关产品推荐
相关产品推荐

