如何循环批量生成格式一致、数据源不同的Seaborn热力图
Seaborn批量生成同格式热力图实现方案
你的判断完全正确,原代码报错的核心原因是f-string生成的是变量名字符串,无法直接传入作为DataFrame对象,同时原代码还存在中文引号、f-string语法未闭合的语法问题。
和你循环思路最匹配的实现逻辑是直接遍历DataFrame对象与对应保存标识的配对组合,不要依赖字符串拼接变量名取对象,这种写法稳定性和可维护性都更好。
最优写法:读数据+绘图全流程循环处理
不需要提前单独定义df1到df5五个散变量,把文件路径、输出文件名提前配对,循环内完成读数据、绘图、保存全流程,代码最简洁:
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt # 固定绘图配置抽到循环外,避免重复定义 x_labels = ['apple', 'orange', 'kiwi'] y_labels = ['1', '2', '3'] # 配置组:(Excel数据源路径, 输出文件名称前缀) plot_groups = [ ("c:/temporary/df1.xlsx", "df1"), ("c:/temporary/df2.xlsx", "df2"), ("c:/temporary/df3.xlsx", "df3"), ("c:/temporary/df4.xlsx", "df4"), ("c:/temporary/df5.xlsx", "df5") ] for data_path, save_tag in plot_groups: # 读取当前循环对应的数据源 current_df = pd.read_excel(data_path) fig = plt.figure() ax = fig.add_axes([0.25, 0.25, 0.7, 0.7]) # 直接传入当前DataFrame对象绘图 sns.heatmap(current_df, xticklabels=x_labels, yticklabels=y_labels, ax=ax) fig.savefig(f"c:/temporary/{save_tag}-matrix.png") # 主动关闭画布释放内存,避免多图互相干扰 plt.close(fig)
适配场景:已提前加载好df1-df5变量
如果因为其他业务逻辑需要提前把5个DataFrame加载到内存,直接把对象和对应保存标签打包遍历即可:
# 把已存在的DataFrame对象和保存标签配对 plot_groups = [ (df1, "df1"), (df2, "df2"), (df3, "df3"), (df4, "df4"), (df5, "df5") ] for current_df, save_tag in plot_groups: fig = plt.figure() ax = fig.add_axes([0.25, 0.25, 0.7, 0.7]) sns.heatmap(current_df, xticklabels=x_labels, yticklabels=y_labels, ax=ax) fig.savefig(f"c:/temporary/{save_tag}-matrix.png") plt.close(fig)
注意:不要使用
locals()/globals()通过字符串动态取变量的写法,这类写法调试成本高、可读性差,显式配对遍历是通用的稳妥实现。
内容的提问来源于stack exchange,提问作者Karl
相关产品推荐
相关产品推荐

