如何在多个子图中各自添加固定基准折线实现多组数据对比
你之前的两种方案分别存在核心问题:
- 第一种遍历绘图时没有对数据做过滤,每个子图都绘制了全部地区的折线,不符合单张子图仅保留基准+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
相关产品推荐
相关产品推荐

