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

如何用Seaborn创建按y值区间过滤的带线性回归子图?

解决方案:创建垂直堆叠的分区间线性回归子图

问题核心

你需要将原有的带线性回归的散点图拆分为垂直堆叠的4个子图,每个子图对应特定的风暴强度(y轴)区间:0-40、40-80、80-120、120-160。之前使用FacetGrid时的问题在于:

  • 误用col参数导致子图水平排列
  • 未给每个子图绑定对应的y轴区间范围

解决步骤与完整代码

1. 先给数据添加区间分组标签

通过pd.cut()将vmax值按目标区间分组,为后续FacetGrid生成子图提供依据:

2. 配置垂直堆叠的FacetGrid

替换col为row参数实现垂直排列,关闭sharey以支持每个子图独立设置y轴范围,最后循环为每个子图绑定对应区间:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import pydove as dv

# 读取数据
intensity = pd.read_csv('filtered_storm_vmax_real.csv', sep=',', header=0)

# 生成区间分组列:按vmax划分4个目标区间
bins = [0, 40, 80, 120, 160]
labels = ['0-40', '40-80', '80-120', '120-160']
intensity['vmax_bin'] = pd.cut(intensity['vmax'], bins=bins, labels=labels, include_lowest=True)

# 保持与原主图一致的样式
sns.set_theme(style="darkgrid", color_codes="ch:start=.2,rot=-.3")
sns.color_palette("ch:start=.2,rot=-.3", as_cmap=True)

# 创建垂直堆叠的FacetGrid:用row参数替代col,关闭共享y轴
g = sns.FacetGrid(data=intensity, row='vmax_bin', row_order=labels, 
                  sharex=True, sharey=False, height=2, aspect=3)

# 在每个子图绘制与原样式一致的回归散点图
g.map(dv.regplot, 'season', 'vmax', scatter=True, scatter_kws={'alpha':0.25})

# 为每个子图设置对应y轴区间,并调整标签
for ax, bin_label in zip(g.axes.flat, labels):
    y_min, y_max = map(int, bin_label.split('-'))
    ax.set_ylim(y_min, y_max)
    ax.set_ylabel('Intensity (knots)')
    ax.set_title(f'Storm Intensity: {bin_label} knots')

# 统一设置x轴标签
g.set_xlabels('Season')

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

关键细节说明

  • 垂直堆叠实现:用row参数替代col,让子图按垂直方向排列
  • 区间精准控制:通过pd.cut()给数据打分组标签,再循环设置每个子图的ylim,确保只显示目标区间
  • 样式一致性:完全沿用原代码的seaborn主题配置,保证子图与主图风格统一
  • 回归散点复用:通过g.map()调用dv.regplot,保留原有的散点透明度、回归线样式

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 02:25:17