如何将列表名称转为字符串以批量命名热力图?
解决方法
要实现给每张热力图用对应列表的名称命名,核心是要把「列表数据」和「它的名称字符串」绑定在一起——直接把列表存入元组的方式无法直接获取变量名,这里提供两种可行方案:
方案1:显式绑定名称与数据(推荐)
直接将列表和对应的名称字符串配对存储,循环时可同时拿到名称和数据,代码清晰且不易出错:
import seaborn as sns import matplotlib.pyplot as plt # 定义数据列表 list1 = [[1,2,3], [4,5,6], [4,5,6], [4,5,6]] list2 = [[2,2,3], [1,5,1], [4,2,3], [3,3,6]] # 存储「名称字符串」与「列表数据」的配对 data_with_names = [("list1", list1), ("list2", list2)] def generate_heatmap(data, list_name): sns.set_style("whitegrid") # 指定颜色映射(避免原代码中cmap未定义的错误) ax = sns.heatmap(data, cmap='viridis') # 用传入的名称设置标题 plt.title(f"Heatmap of {list_name}") # 保存图片到本地(可选) plt.savefig(f"{list_name}_heatmap.png") # 显示热力图 plt.show() # 关闭画布,避免后续图重叠 plt.close() # 循环生成每张热力图 for name, lst in data_with_names: generate_heatmap(lst, name)
方案2:通过全局变量反向查找变量名(不推荐)
如果不想手动编写名称字符串,可以通过globals()字典(存储全局变量的映射关系)反向查找列表对应的变量名,但这种方法依赖全局变量命名规则,容易出现重复或误匹配:
import seaborn as sns import matplotlib.pyplot as plt list1 = [[1,2,3], [4,5,6], [4,5,6], [4,5,6]] list2 = [[2,2,3], [1,5,1], [4,2,3], [3,3,6]] data = [list1, list2] def get_list_name(lst): # 遍历全局变量,匹配列表对应的变量名 for name, value in globals().items(): if value is lst and not name.startswith('_'): return name return "Unknown" def generate_heatmap(data): sns.set_style("whitegrid") ax = sns.heatmap(data, cmap='viridis') # 获取列表名称并设置标题 list_name = get_list_name(data) plt.title(f"Heatmap of {list_name}") plt.savefig(f"{list_name}_heatmap.png") plt.show() plt.close() # 循环生成热力图 for lst in data: generate_heatmap(lst)
原代码问题修正说明
- 原函数
hm中cmap未定义,需指定具体颜色映射(如'viridis') - 标题写死为
'df',需动态传入列表名称 - 循环中调用
hm(1)是错误的,应传入循环变量l - 未处理画布关闭,易导致多张图重叠
内容的提问来源于stack exchange,提问作者Hao Nguyen
相关产品推荐
相关产品推荐

