Seaborn子图绘制问题:3×2布局箱线图与小提琴图实现
解决3×2子图布局中Seaborn箱线图与小提琴图的结合问题
我看到你想要实现3行2列的子图布局——每行对应一个特征,左侧是箱线图,右侧是小提琴图,x轴固定为survival_status_after_5yrs。你的代码里有几个关键问题需要修正,我来一步步帮你解决:
问题分析
- 你创建子图时写了
ncols=3,但目标是3×2布局,应该改为ncols=2 plt.subplots()返回的是图对象和二维axes数组,需要用fig, axes = plt.subplots(...)来接收,而非单个axis变量- Seaborn的绘图函数(比如
sns.boxplot)不需要用axis[i].plot()包裹,直接通过ax参数指定要绘制的子图即可 - 循环中的索引逻辑有误,会导致数组越界
修正后的代码
import matplotlib.pyplot as plt import seaborn as sns # 取需要可视化的3个变量(根据你的数据结构调整) features = list(df.columns.values)[:3] # 创建3行2列的子图,设置合适的画布尺寸 fig, axes = plt.subplots(nrows=3, ncols=2, figsize=(12, 10)) # 遍历每个特征和对应的行索引 for i, feature in enumerate(features): # 左侧子图:箱线图,指定绘制到第i行第1列的子图 sns.boxplot(data=df, x='survival_status_after_5yrs', y=feature, ax=axes[i, 0]) axes[i, 0].set_title(f'Box Plot: {feature}') # 右侧子图:小提琴图,指定绘制到第i行第2列的子图 sns.violinplot(data=df, x='survival_status_after_5yrs', y=feature, ax=axes[i, 1]) axes[i, 1].set_title(f'Violin Plot: {feature}') # 自动调整子图间距,避免元素重叠 plt.tight_layout() plt.show()
关键说明
axes是一个3×2的二维数组,axes[i, 0]对应第i行第1列的子图,axes[i, 1]对应第i行第2列的子图- 通过Seaborn绘图函数的
ax参数,直接将图绑定到指定子图,这是Seaborn与Matplotlib子图结合的标准用法 plt.tight_layout()会自动优化子图布局,让标题、坐标轴标签都清晰显示
这样就能完美实现你想要的3×2布局,每行对应一个变量的箱线图和小提琴图啦!
内容的提问来源于stack exchange,提问作者Maagalam HARSHA VARDHAN
相关产品推荐
相关产品推荐

