You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中如何将非Seaborn对象(如Describe结果)作为子图插入?

在Pandas DataFrame中展示变量的图表与描述性统计表格

这个问题我之前也遇到过!确实,Matplotlib默认的子图是为可视化图表设计的,要把describe()返回的统计表格嵌入到第三个子图位置,得用点小技巧,我来给你详细说下实现方法:

核心思路

我们可以利用Matplotlib的table()方法,在空白的第三个子图区域绘制统计表格,同时隐藏子图的坐标轴,让表格看起来就像一个“子图”一样和前两个图表保持统一布局。

完整代码示例

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

# 加载示例数据(你可以替换成自己的DataFrame)
df = sns.load_dataset('iris')
target_var = 'sepal_length'  # 你要分析的目标变量

# 创建1行3列的子图布局,设置合适的画布大小
fig, (ax_dist, ax_box, ax_table) = plt.subplots(1, 3, figsize=(18, 6))

# 绘制第一个子图:分布直方图+密度曲线
sns.histplot(data=df, x=target_var, kde=True, ax=ax_dist)
ax_dist.set_title(f'Distribution Plot of {target_var}', fontsize=12)

# 绘制第二个子图:箱线图
sns.boxplot(data=df, x=target_var, ax=ax_box)
ax_box.set_title(f'Box Plot of {target_var}', fontsize=12)

# 处理第三个子图:嵌入描述性统计表格
# 1. 获取目标变量的描述性统计,转成DataFrame方便表格展示
desc_stats = df[target_var].describe().to_frame().T  # 转成单行DataFrame,行是变量名,列是统计量

# 2. 隐藏子图的坐标轴(避免显示空白的坐标轴框架)
ax_table.axis('off')

# 3. 在子图区域绘制表格
stats_table = ax_table.table(
    cellText=desc_stats.values,
    colLabels=desc_stats.columns,
    rowLabels=desc_stats.index,
    cellLoc='center',  # 单元格内容居中
    loc='center'       # 表格在子图中居中
)

# 4. 调整表格样式,提升可读性
stats_table.auto_set_font_size(False)
stats_table.set_fontsize(10)
stats_table.scale(1.2, 1.5)  # 缩放表格的宽和高,让内容更清晰
ax_table.set_title(f'Descriptive Statistics of {target_var}', fontsize=12)

# 调整子图间距,避免内容重叠
plt.tight_layout()
plt.show()

关键细节说明

  1. 统计结果格式转换:把describe()返回的Series转成单行DataFrame(.to_frame().T),这样表格的行是变量名,列是统计量,展示更直观。如果你喜欢统计量作为行、变量作为列,直接用.to_frame()即可。
  2. 隐藏坐标轴:通过ax_table.axis('off')去掉空白子图的坐标轴框架,让表格成为视觉焦点。
  3. 表格样式调整:利用table()方法的参数和后续的缩放、字体设置,让表格内容清晰易读,和前两个图表风格统一。

批量处理多个变量

如果你想遍历DataFrame的所有数值型变量,批量生成这样的组合展示,可以用循环实现:

numeric_cols = df.select_dtypes(include=['float64', 'int64']).columns

for var in numeric_cols:
    fig, (ax_dist, ax_box, ax_table) = plt.subplots(1, 3, figsize=(18, 6))
    
    # 绘制分布直方图
    sns.histplot(data=df, x=var, kde=True, ax=ax_dist)
    ax_dist.set_title(f'Distribution Plot of {var}', fontsize=12)
    
    # 绘制箱线图
    sns.boxplot(data=df, x=var, ax=ax_box)
    ax_box.set_title(f'Box Plot of {var}', fontsize=12)
    
    # 嵌入统计表格
    desc_stats = df[var].describe().to_frame().T
    ax_table.axis('off')
    stats_table = ax_table.table(
        cellText=desc_stats.values,
        colLabels=desc_stats.columns,
        rowLabels=desc_stats.index,
        cellLoc='center',
        loc='center'
    )
    stats_table.auto_set_font_size(False)
    stats_table.set_fontsize(10)
    stats_table.scale(1.2, 1.5)
    ax_table.set_title(f'Descriptive Statistics of {var}', fontsize=12)
    
    plt.tight_layout()
    plt.show()

内容的提问来源于stack exchange,提问作者Carlos Fabbri

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:40:22