如何在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
相关产品推荐
相关产品推荐

