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()
关键细节说明
- 统计结果格式转换:把
describe()返回的Series转成单行DataFrame(.to_frame().T),这样表格的行是变量名,列是统计量,展示更直观。如果你喜欢统计量作为行、变量作为列,直接用.to_frame()即可。 - 隐藏坐标轴:通过
ax_table.axis('off')去掉空白子图的坐标轴框架,让表格成为视觉焦点。 - 表格样式调整:利用
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
相关产品推荐
相关产品推荐

