如何将字符串转为已存在数组名?批量绘制数组数据的实现方案
批量绘制多场景多区域pCO₂时间序列图的解决方案
问题背景
已生成分场景(e、calc、p)和分区域(hilat、lolat、deep)的pCO₂数组(如e_hilat['pCO2']、calc_lolat['pCO2']),以及对应场景的时间数组(e_time、calc_time、p_time)。需要批量绘制每个区域+场景组合的时间-pCO₂关系图,避免重复编写绘图代码;同时要求每个区域对应固定颜色,每个场景对应固定线型。此前尝试通过字符串拼接生成数组名的方式失败,因为拼接结果是字符串而非实际数组对象。
解决方案:用字典映射替代字符串拼接
直接通过字符串解析变量名(如eval)存在安全风险且代码可读性差,推荐用字典映射的方式管理场景和区域数据,实现批量绘图:
步骤1:构建数据映射字典
先把所有场景的区域数据和时间数据整理到字典中,方便循环调用:
# 构建场景-区域数据映射 scenario_data = { 'e': {'hilat': e_hilat, 'lolat': e_lolat, 'deep': e_deep, 'time': e_time}, 'calc': {'hilat': calc_hilat, 'lolat': calc_lolat, 'deep': calc_deep, 'time': calc_time}, 'p': {'hilat': p_hilat, 'lolat': p_lolat, 'deep': p_deep, 'time': p_time} } # 定义区域-颜色映射(固定每个区域的颜色) region_color_map = { 'hilat': 'C0', 'lolat': 'C1', 'deep': 'C2' } # 定义场景-线型映射(固定每个场景的线型) scenario_ls_map = { 'e': '-', 'calc': '--', 'p': ':' }
步骤2:批量绘图循环
利用嵌套循环遍历场景和区域,从字典中直接取出对应的时间数组和pCO₂数据,完成绘图:
import matplotlib.pyplot as plt fig, axS = plt.subplot_mosaic([['a)', 'a)'], ['b)', 'b)']], figsize=(10, 10), sharex=True) # 遍历每个场景 for scenario_name, scenario_content in scenario_data.items(): # 遍历每个区域 for region_name, region_data in scenario_content.items(): # 跳过time字段,只处理区域数据 if region_name == 'time': continue # 获取当前场景的时间数组、当前区域的pCO₂数据 time_data = scenario_content['time'] pco2_data = region_data['pCO2'] # 绘制曲线 axS['a)'].plot( time_data, pco2_data, ls=scenario_ls_map[scenario_name], c=region_color_map[region_name], label=f'{scenario_name} - {region_name}' ) # 添加图例和标签 axS['a)'].legend() axS['a)'].set_ylabel('pCO₂') axS['a)'].set_xlabel('Time') plt.show()
补充说明
- 如果所有场景共用同一组时间数组(而非每个场景单独的
e_time等),直接把time_data替换成统一的time变量即可。 - 代码中
label字段用于区分不同场景和区域的曲线,可根据需求调整格式。
内容的提问来源于stack exchange,提问作者Ismail Chishti
相关产品推荐
相关产品推荐

