You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何高效将多个(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 20:12:40