关键词:atkpython,能带,DOS,matplotlib
使用 QuantumATK 作图时可以在Virtual NanoLab上通过鼠标操作对作图进行定制并导出需要的图片格式。从2017版开始,用户可以将二维数据作图保存成plt脚本(实际为python语言脚本),这样做有很多好处:
目前ATK支持以下几种作图保存plt脚本:
方法:在充分使用作图窗口定制图像后,点击作图窗口下方的“磁盘”按钮即可默认保存plt文件。
plt文件保存了用户设定的全部作图信息,用户随时可以将plt脚本重新作图查看。
方法有如下两种:
atkpython band.plt
,即可重新作图。作图后可以进一步调整图像属性,导出图片格式文件。plt脚本就是matplotlib作图脚本,下面以能带图为例予以说明。
############################################################ # Plot generated using Virtual NanoLab # ############################################################ # Imports import numpy import matplotlib from matplotlib import pyplot from matplotlib import gridspec # ---------------------------------------------------------- # Setup plot # ---------------------------------------------------------- figure = pyplot.figure() grid_spec = gridspec.GridSpec(nrows=1, ncols=1) # 有几幅小图(Subplot),如何排列 #以下逐一定义小图(Subplot) # ---------------------------------------------------------- # Subplot 0 # ---------------------------------------------------------- axes_0 = figure.add_subplot(grid_spec[0:1, 0:1]) axes_0.set_title(u'Bandstructure') # 作图标题 axes_0.set_visible(True) # x-axis 横轴属性 axes_0.set_xlabel(u'') # 横轴标题 axes_0.set_xlim(0.0, 1.0) #横轴的范围 axes_0.set_xscale(u'linear') # 横轴属性 axes_0.set_xticks([0.0, ..., 0.9999999850988388]) # 横轴标识位置 axes_0.set_xticklabels([u'$\\mathrm{\\Gamma}$', ..., u'$\\mathrm{A}$']) # 横轴标识,支持LaTeX # y-axis axes_0.set_ylabel(u'Energy (eV)') # 纵轴名称 axes_0.set_ylim(-18.005308263554813, 10.0) #纵轴范围 axes_0.set_yscale(u'linear') # 纵轴属性 # 以下是所有的数据线 # Line # 第1条线的x轴数据 x = numpy.array([ 0. , 0.008485305964, 0.016970611928, 0.025455917892, ... ... 1. ]) # 第1条线的y轴数据 y = numpy.array([-17.005308263555, -16.997492445781, -16.973663219783, ... ... -15.889060254093]) line = axes_0.plot(x, y) line = line[0] #第1条线的特性 line.set_visible(True) line.set_label(u'Band 00') # 数据线的标识名称 line.set_color((0.0, 0.6666666666666666, 0.0)) # 颜色 line.set_linestyle(u'-') # 线型 line.set_linewidth(1.0) # 粗细 line.set_marker(None) # 数据点标识 line.set_markeredgecolor(u'k') # 数据点标识外缘颜色 line.set_markerfacecolor(u'k') # 数据点标识填充颜色 #第2条线 # Line ... ... ... ... # 第n条线 # Line ... ... # HorizontalLine # 作一条横线,对于能带图是费米能级位置 y = 0.0 # 横线位置 line = axes_0.axhline(y) line.set_visible(True) line.set_label(u'Fermi level') # 横线标识名称 line.set_color(u'green') # 颜色 line.set_linestyle(u':') # 线型 line.set_linewidth(1.0) # 粗细 line.set_marker(None) line.set_markeredgecolor(u'k') line.set_markerfacecolor(u'k') # VerticalLine # 作纵线,对于能带图是布里渊区高对称点间的分隔线 x = 0.0 # 纵线位置 line = axes_0.axvline(x) line.set_visible(True) line.set_label(u'Gamma segment') # 纵线标识名称 line.set_color(u'blue') # 颜色 line.set_linestyle(u'-') # 线型 line.set_linewidth(1.0) # 粗细 line.set_marker(None) line.set_markeredgecolor(u'k') line.set_markerfacecolor(u'k') # VerticalLine ... ... # VerticalLine ... ... ... ... # ---------------------------------------------------------- # Show the plot # ---------------------------------------------------------- pyplot.show()
常见的颜色定义方法有:
matplotlib使用dictionary定义字体,例如可以将下面定义添加于脚本开头的部分的imports之后,setup plot之前,以供后面使用。
fontdd = {'family' : 'serif', 'color' : 'red', 'weight' : 'normal', 'variant': 'normal', 'size' : 20, }
可选项:
图片标题可以在保存plt脚本前在作图上直接修改。也可以在脚本中找到如下语句:
axes_0.set_title(u'Bandstructure')
修改引号内的文字即可自定义标题。还可以增加字体、定位等,例如:
axes_0.set_title(u'Bandstructure of Silicon', fontdict=fontdd, loc='right')
找到开头的pyplot一句,可控制绘图尺寸、精度和颜色。这个选项仅影响图形显示,最后导出时,依赖于实际的缩放。
figure = pyplot.figure(figsize=(4,3), dpi=150, facecolor="yellow")
以y轴为例,找到
axes_0.set_ylabel(u'Energy (eV)') axes_0.set_ylim(-12.969271600563211, 10.0) axes_0.set_yscale(u'linear')
修改其中的相关选项,即可定制y轴特性。例如:
axes_0.set_ylabel(u'E/eV',fontdict=fontdd) axes_0.set_ylim(-13, 5.0) axes_0.set_yscale(u'linear')
line.set_visible(True) line.set_label(u'Band 00') line.set_color(u'red') line.set_linestyle(u'--') line.set_linewidth(2.0) line.set_marker("v") line.set_markeredgecolor(u'g') line.set_markerfacecolor(u'g')
'-' or 'solid' | solid line |
'–'(双短线) or 'dashed' | dashed line |
'-.' or 'dashdot' | dash-dotted line |
':' or 'dotted' | dotted line |
'None' | draw nothing |
' ' | draw nothing |
'' | draw nothing |
marker description
“.” | point |
“,” | pixel |
“o” | circle |
“v” | triangle_down |
“$^$” | triangle_up |
“<” | triangle_left |
“>” | triangle_right |
“1” | tri_down |
“2” | tri_up |
“3” | tri_left |
“4” | tri_right |
“8” | octagon |
“s” | square |
“p” | pentagon |
“P” | plus (filled) |
“*” | star |
“h” | hexagon1 |
“H” | hexagon2 |
“+” | plus |
“x” | x |
“X” | x (filled) |
“D” | diamond |
“d” | thin_diamond |
“$|$” | vline |
“_” | hline |
TICKLEFT | tickleft |
TICKRIGHT | tickright |
TICKUP | tickup |
TICKDOWN | tickdown |
CARETLEFT | caretleft (centered at tip) |
CARETRIGHT | caretright (centered at tip) |
CARETUP | caretup (centered at tip) |
CARETDOWN | caretdown (centered at tip) |
CARETLEFTBASE | caretleft (centered at base) |
CARETRIGHTBASE | caretright (centered at base) |
CARETUPBASE | caretup (centered at base) |
“None”, “ ” or “” | nothing |
与数据线定义方法相同。
# HorizontalLine y = 0.0 line = axes_0.axhline(y) line.set_visible(True) line.set_label(u'Fermi level') line.set_color(u'red') line.set_linestyle(u'-') line.set_linewidth(2.0)