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

使用Seaborn tsplot绘制时序图仅显示一条线的问题求助

问题原因及解决方案

首先,你遇到的问题核心在于没有正确让Seaborn区分不同婴儿的时间序列数据,再加上tsplot函数的特性(以及它已经被弃用的现状),导致只显示了其中一个婴儿的折线。

具体原因分析

你的代码里把所有数据的subject都硬设为0:

db['subject'] = 0

而tsplot的设计逻辑是用来展示同一主体(subject/unit)的重复时间测量,或者按分组聚合的时间序列。当所有样本的subject都相同时,它会把所有数据当成同一个主体的观测——哪怕这些数据来自不同的婴儿。

另外,你没有指定unit或hue参数来标识不同的婴儿(也就是infant列),Seaborn无法判断要把数据拆分成多条折线,最终要么聚合所有数据,要么因为数据时间区间不重叠(N1_003的DOL是11、13,S2_018是22、23),只渲染了其中一部分。

还有个重要提醒:sns.tsplot在Seaborn 0.9版本之后就已经被弃用了,官方推荐用更直观的sns.lineplot来绘制多组时间序列。

解决方案

方案1:修复tsplot的用法(不推荐,因为函数已弃用)

去掉硬设subject=0的代码,改用infant作为独立单位(unit)和分组颜色(hue):

import seaborn as sns
import matplotlib.pyplot as plt

def plot_ts(db):
    db = db[['infant', 'shannon', 'DOL']]
    db = db.drop_duplicates()
    db = db.dropna()
    # 不需要设置subject=0,用infant区分不同个体
    sns.tsplot(time='DOL',
               value='shannon',
               data=db,
               unit='infant',  # 指定每个infant是独立观测单位
               hue='infant')   # 用不同颜色区分不同婴儿
    plt.show()

方案2:改用lineplot(推荐,官方替代方案)

lineplot对多组时间序列的支持更清晰,直接通过hue参数按infant分组即可:

import seaborn as sns
import matplotlib.pyplot as plt

def plot_ts(db):
    db = db[['infant', 'shannon', 'DOL']].drop_duplicates().dropna()
    sns.lineplot(x='DOL',
                 y='shannon',
                 data=db,
                 hue='infant',  # 按婴儿分组绘制折线
                 marker='o')    # 显示每个数据点,更直观
    plt.show()

这样修改后,两个婴儿的时间序列折线就会分别显示出来了~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:25:36