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

如何在多个子图中各自添加固定基准折线实现多组数据对比

你之前的两种方案分别存在核心问题:

  • 第一种遍历绘图时没有对数据做过滤,每个子图都绘制了全部地区的折线,不符合单张子图仅保留基准+1个对比地区的要求
  • 第二种方案做数据透视后year变成了DataFrame的索引,sns.lineplot中x参数传入字符串"year"找不到对应列,同时y值取列的逻辑也有错误。

不需要做数据透视,直接遍历对比地区过滤原数据集绘图即可,完整可运行代码如下:

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

data = {'year': ['1998','1998','1998','1998','1998','1998','1998','1999','1999','1999','1999','1999','1999','1999'],
        'region':['Adygea','Altai Krai','Amur Oblast','Arkhangelsk','Astrakhan','Bashkortostan','Belgorod','Adygea','Altai Krai','Amur Oblast','Arkhangelsk','Astrakhan','Bashkortostan','Belgorod'],
        'sales':[8.8, 19.2,21.2, 10.6,18,17.5,23, 10, 17.8, 20.5, 12.6, 19.9, 16, 21]}

df1 = pd.DataFrame(data)

# 定义基准地区
base_region = 'Arkhangelsk'
# 筛选所有需要对比的非基准地区,共6个刚好匹配2行3列布局
compare_regions = [r for r in df1['region'].unique() if r != base_region]

# 创建2行3列子图
fig, axes = plt.subplots(2, 3, figsize=(18, 10))
# 将二维子图数组展开为一维,方便遍历
axes = axes.ravel()

for idx, cur_region in enumerate(compare_regions):
    ax = axes[idx]
    # 绘制基准地区折线
    sns.lineplot(x='year', y='sales', data=df1[df1['region'] == base_region],
                 ax=ax, linestyle='--', color='grey', label=base_region)
    # 绘制当前对比地区折线
    sns.lineplot(x='year', y='sales', data=df1[df1['region'] == cur_region],
                 ax=ax, color='#079b51', label=cur_region)
    # 设置子图标题
    ax.set_title(f'{cur_region} 与 {base_region} 销售对比')
    # 调整子图图例位置
    ax.legend(loc='upper left')

# 自动调整子图间距,避免重叠
plt.tight_layout()
plt.show()

运行后即可得到2行3列共6张子图,每张子图仅显示Arkhangelsk基准折线和对应单个对比地区的折线。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 13:54:06