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

Python中结合折线图与面积图:将B-A折线替换为填充面积图

问题:将副轴折线图改为填充面积图

我有一个DataFrame,每日记录Index A、Index B两个指数的指标值,以及两者的差值B minus A(示例数据如下)。目前已通过seaborn绘制Index A和Index B的折线图,并在副轴以折线图展示B-A。现希望将副轴的B-A折线图改为填充面积图(可选择隐藏折线),原代码如下,请问如何实现?

示例DataFrame

eff_dateIndex AIndex BB minus A
2024-10-019111120
2024-10-028811022
2024-10-038710922
2024-10-048410723
2024-10-078210624

原代码

df = df.rename(columns={"eff_date":"Date"})
plt.figure(figsize = (12,6))
plot = sns.lineplot(x = 'Date', y = 'Index A', data = df, label = 'Index A')
sns.lineplot(x = 'Date', y = 'Index B', data = df, label = 'Index B')
ax2 = plt.twinx()
sns.lineplot(x = 'Date', y = 'B-A', data = df, color='r', ax=ax2)

plt.xticks(rotation=45)

plot.set(xlabel = 'Date', ylabel = 'Measure')
解决方案

要把副轴的B-A折线改成填充面积图,直接用matplotlib的fill_between()方法就能实现,不需要依赖seaborn。如果想隐藏折线只留填充区域,直接调用这个方法就行;要是想保留折线同时加填充,先画折线再叠加填充层。

修改后的代码(仅显示填充面积,隐藏折线)

import matplotlib.pyplot as plt
import seaborn as sns

# 统一列名:原DataFrame差值列是"B minus A",原代码用了"B-A",避免报错
df = df.rename(columns={"eff_date":"Date", "B minus A":"B-A"})
plt.figure(figsize=(12,6))

# 绘制主轴的两个指数折线图
plot = sns.lineplot(x='Date', y='Index A', data=df, label='Index A')
sns.lineplot(x='Date', y='Index B', data=df, label='Index B')

# 初始化副轴
ax2 = plt.twinx()

# 绘制填充面积图,填充从y=0到B-A的区域,设置透明度避免遮挡主轴
ax2.fill_between(df['Date'], 0, df['B-A'], color='r', alpha=0.3, label='B-A')

# 设置刻度和标签
plt.xticks(rotation=45)
plot.set(xlabel='Date', ylabel='Measure')
ax2.set_ylabel('B minus A')

# 合并主副轴的图例,提升可读性
lines1, labels1 = plot.get_legend_handles_labels()
lines2, labels2 = ax2.get_legend_handles_labels()
plot.legend(lines1 + lines2, labels1 + labels2, loc='upper left')

plt.tight_layout()
plt.show()

关键细节说明

  • 列名统一:原DataFrame中差值列名为B minus A,但原代码里使用了B-A,因此先重命名列,防止运行时出现列不存在的错误
  • fill_between参数解析:
    • 第一个参数:x轴数据(这里是日期列)
    • 第二个参数:填充区域的下限(示例中设为0,可根据需求调整为其他数值)
    • 第三个参数:填充区域的上限(即B-A的数值)
    • alpha:控制填充区域的透明度,数值越小越透明,避免遮挡主轴的折线
  • 两种显示模式:
    • 仅填充:直接调用fill_between,无需绘制折线
    • 折线+填充:先绘制seaborn折线,再叠加填充层,代码示例:
      # 先画折线
      sns.lineplot(x='Date', y='B-A', data=df, color='r', ax=ax2)
      # 再叠加填充
      ax2.fill_between(df['Date'], 0, df['B-A'], color='r', alpha=0.3)
      
  • 图例合并:主副轴的图例默认分开显示,通过get_legend_handles_labels()获取两个轴的图例元素,合并后展示更直观

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 14:20:55