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

如何用Seaborn relplot在分面子图中展示多类别带标记折线并修改Y轴名

Seaborn绘图问题解决:双指标同子图展示+Y轴名称修改

你想要用Seaborn绘制每个VISIT子图中同时包含SBP和DBP的带标记折线图,但当前代码两次调用relplot覆盖了绘图对象,导致无法同时显示两组数据,且Y轴名称不符合需求。以下是针对性解决方案:

问题1:让每个VISIT子图同时显示SBP和DBP的带标记折线

核心问题是两次调用relplot会覆盖之前的绘图对象,且未在同一子图中叠加两组数据。推荐两种解决方案:

方案1:转长格式数据(符合Seaborn设计逻辑)

Seaborn更适配长格式数据,先通过pd.melt将SBP、DBP合并为分类列,再一次性绘制两组数据:

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

plt.style.use('ggplot')
# 将宽格式转长格式:保留DATE_TIME、VISIT,拆分SBP/DBP为分类和数值列
r_29_long = pd.melt(r_29, id_vars=["DATE_TIME", "VISIT"], 
                    value_vars=["SBP", "DBP"], 
                    var_name="血压类型", value_name="血压值")

# 绘制分面子图,用hue区分两组数据,指定标记和样式
g = sns.relplot(data=r_29_long, x="DATE_TIME", y="血压值", 
                col="VISIT", col_wrap=2, 
                hue="血压类型", style="血压类型",
                marker=["o", "+"], linewidth=3,
                facet_kws={'sharey': False, 'sharex': False}, aspect=2)
# 手动指定颜色匹配需求
g.map_dataframe(sns.lineplot, x="DATE_TIME", y="血压值", hue="血压类型", 
                palette={"SBP": "r", "DBP": "b"}, ci=None, lw=3)

方案2:在同一Facet网格上叠加绘图

若不想转换数据格式,可先创建空分面网格,再逐个子图叠加两组数据:

plt.style.use('ggplot')
# 创建空分面网格
g = sns.FacetGrid(data=r_29, col="VISIT", col_wrap=2, 
                  facet_kws={'sharey': False, 'sharex': False}, aspect=2)
# 绘制SBP的折线+标记
g.map(sns.lineplot, "DATE_TIME", "SBP", color="r", ci=None, lw=3)
g.map(sns.scatterplot, "DATE_TIME", "SBP", color="r", marker="o")
# 绘制DBP的折线+标记
g.map(sns.lineplot, "DATE_TIME", "DBP", color="b", ci=None, lw=3)
g.map(sns.scatterplot, "DATE_TIME", "DBP", color="b", marker="+")

问题2:修改Y轴名称

两种方案都可通过以下方式修改Y轴名称:

  • 统一修改所有子图:
g.set_axis_labels(x_var="日期时间", y_var="你的自定义Y轴名称")
  • 遍历子图单独修改(适用于需差异化Y轴名称的场景):
for ax in g.axes.flat:
    ax.set_ylabel("自定义Y轴名称")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 18:50:28