Seaborn figure-level绘图适配子图:解决ECDF图并排展示问题
解决Seaborn ECDF图子图布局与x轴统一问题
核心问题原因
seaborn.displot()是Figure级绘图函数,它会自动创建新画布,直接传入plt.subplots()生成的ax参数不会生效,这就是你之前尝试失败的原因。要实现子图布局,应改用Axes级的seaborn.ecdfplot()函数,它可以直接绑定到指定的子图坐标轴上。
实现代码示例
假设你的DataFrame名为df,行程时长列是duration,分组列是travelmode,代码如下:
import seaborn as sns import matplotlib.pyplot as plt # 创建1行2列的子图布局,设置画布大小 fig, (ax_left, ax_right) = plt.subplots(nrows=1, ncols=2, figsize=(14, 6)) # 绘制整体行程时长的ECDF图 sns.ecdfplot(data=df, x="duration", ax=ax_left) ax_left.set_title("整体行程时长ECDF") ax_left.set_xlabel("行程时长") ax_left.set_ylabel("累积概率") # 绘制按travelmode分组的ECDF图 sns.ecdfplot(data=df, x="duration", hue="travelmode", ax=ax_right) ax_right.set_title("按出行方式分组的ECDF") ax_right.set_xlabel("行程时长") ax_right.set_ylabel("累积概率") # 统一两张图的x轴范围,确保刻度完全一致 x_min = df["duration"].min() x_max = df["duration"].max() ax_left.set_xlim(x_min, x_max) ax_right.set_xlim(x_min, x_max) # 可选:手动设置相同的x轴刻度(如需更精细控制) # shared_ticks = [0, 10, 20, 30, 40, 50] # ax_left.set_xticks(shared_ticks) # ax_right.set_xticks(shared_ticks) # 调整布局,避免标签重叠 plt.tight_layout() plt.show()
关键说明
- Axes级函数适配子图:
ecdfplot是针对坐标轴的绘图函数,通过ax参数可指定绘制的子图,完美适配plt.subplots()创建的布局。 - 统一x轴的两种方式:
- 用数据的最小/最大值设置
xlim,确保两张图的x轴范围完全一致; - 手动指定相同的
xticks,让刻度点完全对应,对比更直观。
- 用数据的最小/最大值设置
- 布局优化:
plt.tight_layout()会自动调整子图间距,避免标题、标签互相遮挡。
内容的提问来源于stack exchange,提问作者arilwan
相关产品推荐
相关产品推荐

