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

如何在seaborn绘制的两条折线之间填充半透明区域?

问题原因

之前的fill_between调用无法生效,是因为传入参数错误:sns.lineplot返回的是matplotlib坐标轴对象,其get_data()方法返回的不是绘图用的原始坐标数组,不符合fill_between的参数要求。

正确实现方案

plt.fill_between要求传入三个核心参数:和y值长度匹配的x轴序列、填充区域的下边界y值、填充区域的上边界y值,直接传入你已经提前计算好的原始x、上下置信界数组即可,不需要从已绘制的折线对象中提取数据。
建议调整绘图图层顺序:先绘制半透明填充区域(放在最底层),再绘制均值折线、置信边界线、观测散点,避免填充色块遮挡核心数据元素。

修正后的可运行代码如下:

import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

# 已有的贝叶斯计算结果
mean = np.array([861.98525 , 705.23875 , 640.14575 , 658.727625, 728.23775 ,
       792.4645  , 803.045375, 763.425875, 721.785375, 713.182375,
       740.543375, 781.466875])
confidence_lower = np.array([788.   , 607.   , 493.   , 443.975, 435.975, 412.   , 366.975,
       295.   , 243.   , 207.   , 181.   , 161.   ])
confidence_upper = np.array([ 938.   ,  811.   ,  815.   ,  935.025, 1150.025, 1391.05 ,
       1556.05 , 1624.05 , 1689.025, 1829.   , 2078.125, 2390.025])

# 替换为实际使用的日期序列,示例用等长序列模拟
date = np.arange(len(mean))

fig = plt.figure(figsize=(15,4))
ax = plt.gca()

# 最底层先画半透明填充区
plt.fill_between(
    x=date,
    y1=confidence_lower,
    y2=confidence_upper,
    color='lightcoral',
    alpha=0.3,
    label='Credible Interval'
)
# 依次绘制上层元素
sns.lineplot(x=date, y=mean, label='Posterior Predictive', linewidth=2, color='navy', ax=ax)
sns.lineplot(x=date, y=confidence_lower, color='r', linewidth=1, ax=ax)
sns.lineplot(x=date, y=confidence_upper, color='r', linewidth=1, ax=ax)
# 原有真实值散点代码保留即可
# sns.scatterplot(x=df_sat_test['t'], y=np.array(test_ppc.observed_data.obs), label='True Value', ax=ax)

plt.legend()
plt.show()
效果优化建议
  • 填充色选择和置信边界同色系的浅色调,透明度设置在0.2~0.4之间,既可以清晰标识区间范围,也不会遮挡上层的均值折线
  • 上下两条置信边界线不需要单独添加图例标签,直接给填充区域设置图例即可,避免图例项重复冗余
  • 可以适当加粗均值折线的线宽,和细的置信边界线形成视觉层级差,进一步突出均值趋势

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 16:09:19