Python中结合折线图与面积图:将B-A折线替换为填充面积图
问题:将副轴折线图改为填充面积图
我有一个DataFrame,每日记录Index A、Index B两个指数的指标值,以及两者的差值B minus A(示例数据如下)。目前已通过seaborn绘制Index A和Index B的折线图,并在副轴以折线图展示B-A。现希望将副轴的B-A折线图改为填充面积图(可选择隐藏折线),原代码如下,请问如何实现?
示例DataFrame
| eff_date | Index A | Index B | B minus A |
|---|---|---|---|
| 2024-10-01 | 91 | 111 | 20 |
| 2024-10-02 | 88 | 110 | 22 |
| 2024-10-03 | 87 | 109 | 22 |
| 2024-10-04 | 84 | 107 | 23 |
| 2024-10-07 | 82 | 106 | 24 |
原代码
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
相关产品推荐
相关产品推荐

