当前位置: 首页 > news >正文

脚本分享:快速作图对比wannier拟合能带python脚本

本脚本通过Python实现电子能带结构数据的快速作图,能够从两个不同的数据文件(BAND.dat 和 wannier90_band.dat)中提取有效数据,并在同一坐标系下绘制对比图。

准备工作:使用VASPKIT处理获得能带数据BAND.dat,通过wannier90.x拟合获得紧束缚模型的电子能带 数据wannier90_band.dat。

注:BAND.dat中能量修改为未减去费米能级的绝对能量,如文件夹中保存有KLINES.dat文件,则用于绘制能带高对称点。

图片

运行效果如下,

import numpy as np
import matplotlib.pyplot as plt
import osplt.rcParams['font.size'] = 14  # 基础字体大小
plt.rcParams['axes.labelsize'] = 16  # 轴标签字体大小
plt.rcParams['xtick.labelsize'] = 12  # x轴刻度字体大小
plt.rcParams['ytick.labelsize'] = 12  # y轴刻度字体大小
plt.rcParams['legend.fontsize'] = 14  # 图例字体大小def read_data(filename):"""从文件中读取数据,跳过以#开头的行"""data = []with open(filename, 'r') as f:for line in f:if not line.startswith('#'):parts = line.strip().split()if len(parts) >= 2:try:x = float(parts[0])y = float(parts[1])data.append((x, y))except ValueError:pass  # 跳过无法转换为浮点数的行return np.array(data)def find_discontinuities(data, threshold=0.5):"""识别k点的不连续位置"""discontinuities = []x_diff = np.diff(data[:, 0])for i, dx in enumerate(x_diff):if abs(dx) > threshold:discontinuities.append(i + 1)  # 添加断点索引return discontinuitiesdef read_klines(filename):"""从KLINES.dat文件中读取k点位置"""k_points = []with open(filename, 'r') as f:for line in f:if not line.startswith('#'):parts = line.strip().split()try:x = float(parts[0])k_points.append(x)except (ValueError, IndexError):passreturn np.unique(k_points)  # 返回唯一的k点位置# 读取两个数据文件
band_data = read_data('BAND.dat')
wannier_data = read_data('wannier90_band.dat')# 创建图形
plt.figure(figsize=(10, 7))  # 增大图表尺寸# 如果存在KLINES.dat文件,则绘制背景网格线
if os.path.exists('KLINES.dat'):k_points = read_klines('KLINES.dat')for k in k_points:plt.axvline(k, color='lightgray', linestyle='-', linewidth=1.0, alpha=0.5)plt.xlim(min(k_points), max(k_points))# 绘制BAND.dat的数据
discontinuities_band = find_discontinuities(band_data)
prev_idx = 0
for idx in discontinuities_band:plt.plot(band_data[prev_idx:idx, 0], band_data[prev_idx:idx, 1], label='BAND.dat' if prev_idx == 0 else "", color='#45B7D1', linewidth=2.0, alpha=0.8)  # 柔和的蓝色prev_idx = idx# 绘制最后一段
plt.plot(band_data[prev_idx:, 0], band_data[prev_idx:, 1], color='#45B7D1', linewidth=2.0, alpha=0.8)# 绘制wannier90_band.dat的数据
discontinuities_wannier = find_discontinuities(wannier_data)
prev_idx = 0
for idx in discontinuities_wannier:plt.plot(wannier_data[prev_idx:idx, 0], wannier_data[prev_idx:idx, 1], label='wannier90_band.dat' if prev_idx == 0 else "", color='#FC8D62', linewidth=2.0, linestyle='--', alpha=0.8)  # 柔和的红色prev_idx = idx# 绘制最后一段
plt.plot(wannier_data[prev_idx:, 0], wannier_data[prev_idx:, 1], color='#FC8D62', linewidth=2.0, linestyle='--', alpha=0.8)# 设置图表属性
plt.xlabel('k-point')
plt.ylabel('Energy (eV)')
plt.title('Electronic Band Structure Comparison')
plt.legend()
plt.grid(True, axis='y', linestyle='--', alpha=0.3)# 设置纵坐标范围在0附近
plt.ylim(-10, 10)  # 根据需要调整范围# 保存图形
plt.tight_layout()
plt.savefig('band_structure_comparison.png', dpi=300, bbox_inches='tight')
plt.show()

相关文章:

  • 深入理解C语言变量:从基础到实践
  • 《深入浅出ProtoBuf:从环境搭建到高效数据序列化》​
  • 三串口进行试验
  • 如何将 sNp 文件导入并绘制到 AEDT (HFSS)
  • Vue多地址代理端口调用
  • version `GLIBCXX_3.4.32‘ not found 解决方法
  • Coding Practice,48天强训(23)
  • BIOS主板(非UEFI)安装fedora42的方法
  • How to haggle over salary with HR
  • 从LLM到AI Agent的技术演进路径:架构解析与实现逻辑
  • 软考【网络工程师】2023年5月上午题答案解析
  • 截至2025年4月,AI硬件已深度融入各自场景!!
  • OCR定制识别:解锁文字识别的无限可能
  • Python3:文件操作
  • Lesar: 面向 Lustre/Scade 语言的形式化模型检测工具
  • vue前端SSE工具库|EventSource 替代方案推荐|PUSDN平行宇宙软件开发者网
  • Linux上安装Mysql、Redis、Nginx
  • Android 14 修改侧滑手势动画效果
  • C语言面试高频题——strcat、strncat、strcmp、strcpy 哪些函数会导致内存溢出?
  • Android ActivityManagerService(AMS)深度解析
  • 从中央政治局会议看经济工作着力点:以高质量发展的确定性应对外部不确定性
  • 四川:全省统一取消普通住宅和非普通住宅标准
  • 珠海市香洲区原区长刘齐英落马,此前已被终止省人大代表资格
  • 传媒湃︱《金陵晚报》副刊“雨花石”5月起改为免费刊登
  • “80后”王建浩履新三沙市委常委、组织部部长、秘书长
  • 文昌市委原书记龙卫东已任海南省人社厅党组书记