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

脚本分享:快速作图对比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()

http://www.xdnf.cn/news/1938.html

相关文章:

  • 产品动态|千眼狼sCMOS科学相机捕获单分子荧光信号
  • Java代理讲解
  • 常见网络安全攻击类型深度剖析(三):DDoS攻击——分类、攻击机制及企业级防御策略
  • AI编程:[体验]从 0 到 1 开发一个项目的初体验
  • 利用车联网中的 V2V 通信技术传播公平的紧急信息
  • 【深度强化学习 DRL 快速实践】异步优势演员评论员算法 (A3C)
  • PCIe具体解释分析
  • 【基础IO上】复习C语言文件接口 | 学习系统文件接口 | 认识文件描述符 | Linux系统下,一切皆文件 | 重定向原理
  • 【kafka初学】启动执行命令
  • c#操作excel表格
  • Java与Kotlin在Android开发中的全面对比分析
  • 【Luogu】动态规划四
  • Hot100方法及易错点总结2
  • firewalld 详解
  • 微信小程序蓝牙连接打印机打印单据完整Demo【蓝牙小票打印】
  • 【prompt是什么?有哪些技巧?】
  • Linux操作系统复习
  • 3D模型文件格式之《STL格式介绍》
  • SSH服务介绍
  • string的基本使用
  • uniapp自定义封装tabbar
  • 探索亚马逊云科技:开启您的云计算之旅
  • Safety Estimands与Efficacy Estimands的差异剖析
  • 模式设计简介
  • 北斗导航 | 北斗卫星导航单点定位精度提升方法总结,原理,公式,关键代码
  • 架构师面试(三十六):广播消息
  • websheet 之 sheet操作
  • c++11新特性随笔
  • 使用开源免费雷池WAF防火墙,接入保护你的网站
  • Shell 脚本入门:从零开始写自动化脚本