如何高效将多个(21,166)形状Numpy数组绘制到同一图表
高效批量绘制多组能带图
问题背景
需要将多个能带数据文件(每个文件处理后均为(21,166)的Numpy数组)叠加绘制到同一张图中,当前逐个引用数组的方式效率极低,需更简洁的批量处理方案。
优化实现方案
通过列表整合文件路径与绘图样式,配合循环完成批量数据加载、重塑与绘图,彻底避免逐个引用bands数组的冗余操作:
1. 整理文件与样式配置
把所有数据文件路径集中到列表,同时为每个文件指定对应的绘图样式(颜色、线宽、线型等),方便区分不同组数据:
import numpy as np import matplotlib.pyplot as plt # 批量存储所有数据文件路径 file_paths = [ '/some/user/directory/file1.gnu', '/some/user/directory/file2.gnu', # 按需继续添加更多文件路径 ] # 对应每个文件的绘图样式,顺序需与file_paths严格匹配 plot_styles = [ {'color': 'g', 'linestyle': '--', 'linewidth': 1, 'alpha': 1}, {'color': 'y', 'linewidth': 1.5, 'alpha': 1}, # 按需继续添加对应文件的样式参数 ]
2. 批量处理与绘图
先从第一个文件提取共用的k值(所有文件k值一致),再循环处理每个文件完成绘图:
# 初始化绘图画布 fig, ax = plt.subplots() # 获取共用的k轴数据(从第一个文件提取即可) first_data = np.loadtxt(file_paths[0]) k = np.unique(first_data[:, 0]) # 循环遍历每个文件与对应样式 for file_path, style in zip(file_paths, plot_styles): # 加载并处理数据 data = np.loadtxt(file_path) bands = np.reshape(data[:, 1], (21, 166)) # 遍历每个能带完成绘制 for band in bands: ax.plot(k, band, **style) # 按需添加坐标轴标签、图例等 ax.set_xlabel('k') ax.set_ylabel('Energy') plt.show()
额外优化:样式自动循环
若多组数据的绘图样式有规律,可借助自动样式循环简化配置,无需手动逐个定义样式:
from cycler import cycler # 设置自动循环的样式组合(颜色、线型可按需调整) ax.set_prop_cycle(cycler('color', ['g', 'y', 'b', 'r']) + cycler('linestyle', ['--', '-', '--', '-'])) # 循环处理所有文件,自动应用循环样式 for file_path in file_paths: data = np.loadtxt(file_path) bands = np.reshape(data[:, 1], (21, 166)) for band in bands: ax.plot(k, band, linewidth=1, alpha=1)
内容的提问来源于stack exchange,提问作者Austin
相关产品推荐
相关产品推荐

