遍历列表提取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轴输入,未正确加载对应国家的指标数据绘图。
核心错误点
- 循环变量覆盖原始数据集:迭代时把单个国家名赋值给了
data_selected变量,覆盖了原本的全量DataFrame,导致绘图接口接收到的输入是国家名字符串。 - 接口参数误用:
annot、fmt、cmap、cbar_kws是sns.heatmap的专属参数,sns.lineplot不支持这些参数,传入后会干扰参数解析逻辑。 - 缺失数据筛选步骤:循环中没有根据当前国家名从全量数据中过滤对应子集,直接传入全量数据无法匹配单国家绘图需求。
- 颜色映射逻辑错误:从调色板取出的颜色没有传入折线图的
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
相关产品推荐
相关产品推荐

