使用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
相关产品推荐
相关产品推荐

