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

遍历列表提取DataFrame数据绘制seaborn折线图轴映射问题解决

分国家绘制子图折线图代码修复方案

问题背景

  • 待遍历的国家列表定义如下:
selection = ['Argentina', 'Belize', 'Bolivia', 'Brazil', 'Chile', 'Colombia',
'Costa Rica', 'Cuba', 'Dominican Republic', 'Ecuador', 'Guatemala', 'Guyana',
'Honduras', 'Haiti', 'Latin America & Caribbean', 'St. Martin (French part)',
'Mexico', 'Nicaragua', 'Panama', 'Peru', 'Puerto Rico', 'Paraguay', 'El Salvador',
'Suriname', 'Uruguay', 'Venezuela, RB'] 

原列表中Latin America & Caribbean与St. Martin (French part)之间遗漏逗号,会触发字符串自动拼接,已补正。

  • 全量指标数据存储在DataFrame data_selected中,结构参考:
    数据结构示例
  • 目标:输出4行6列的子图网格,每个子图对应一个国家的历年指标折线,效果参考:
    折线图效果示例
  • 原有运行代码:
sns.set(font_scale=5)

nrow=4 ; ncol=6 ;

fig, ax_array = plt.subplots(nrows=nrow, ncols=ncol, 
                            figsize=(100,60),
                            gridspec_kw=
                            {'wspace':0.02,
                                'hspace':0.3,
                                })
 
list_ax=ax_array.flatten()

pal=sns.color_palette('PuOr_r', 15)


for ax, data_selected, p in zip(list_ax.flatten(), selection, pal):
     sns.lineplot(data_selected, cmap=pal,
                annot=True, 
                fmt='.1f',
                annot_kws={
                'multialignment':'center',
                'size':'small'
                },
                cbar_kws={
                'orientation':'horizontal',
                      },
                  ax=ax)
  • 异常表现:代码将国家名称字符串识别为x轴输入,未正确加载对应国家的指标数据绘图。

核心错误点

  1. 循环变量覆盖原始数据集:迭代时把单个国家名赋值给了data_selected变量,覆盖了原本的全量DataFrame,导致绘图接口接收到的输入是国家名字符串。
  2. 接口参数误用:annot、fmt、cmap、cbar_kws是sns.heatmap的专属参数,sns.lineplot不支持这些参数,传入后会干扰参数解析逻辑。
  3. 缺失数据筛选步骤:循环中没有根据当前国家名从全量数据中过滤对应子集,直接传入全量数据无法匹配单国家绘图需求。
  4. 颜色映射逻辑错误:从调色板取出的颜色没有传入折线图的color参数,无法实现分国家配色。

修改后可直接运行代码

import matplotlib.pyplot as plt
import seaborn as sns

sns.set(font_scale=1.2)
nrow, ncol = 4, 6

fig, ax_array = plt.subplots(
    nrows=nrow, ncols=ncol,
    figsize=(24, 16),
    gridspec_kw={'wspace':0.3, 'hspace':0.4}
)
list_ax = ax_array.flatten()
pal = sns.color_palette('PuOr_r', len(selection))

# 注意:请将下方'Country Name'/'Year'/'指标列名'替换为你自己data_selected里的实际列名
for idx, (ax, country, line_color) in enumerate(zip(list_ax, selection, pal)):
    # 筛选当前国家的所有数据
    country_subset = data_selected[data_selected['Country Name'] == country]
    # 绘制折线
    sns.lineplot(
        data=country_subset,
        x='Year',
        y='指标列名', # 替换为你自己的指标字段名
        color=line_color,
        ax=ax,
        linewidth=2
    )
    # 设置子图标题
    ax.set_title(country, fontsize=12)
    # 隐藏重复的轴标签,精简显示
    if idx % ncol != 0:
        ax.set_ylabel('')
    if idx < ncol * (nrow - 1):
        ax.set_xlabel('')

# 关闭网格中多余的空轴
for ax_idx in range(len(selection), len(list_ax)):
    list_ax[ax_idx].axis('off')

plt.tight_layout()
plt.show()

调整说明

  • 修正循环变量命名,避免覆盖原始全量数据集
  • 新增单国家数据筛选逻辑,每次绘图只传入当前国家的子集数据
  • 移除折线图不支持的热力图参数,明确指定x、y轴对应字段
  • 补全颜色映射逻辑,每个国家的折线匹配调色板对应颜色
  • 新增子图优化逻辑:添加国家标题、隐藏冗余轴标签、关闭空轴,适配多子图显示场景;原代码设置的font_scale=5、figsize=(100,60)数值过大,已调整为适合常规屏幕显示的尺寸,可按需修改。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 11:33:15