目录

plt 作图脚本与应用实践

关键词:atkpython,能带,DOS,matplotlib

使用 QuantumATK 作图时可以在Virtual NanoLab上通过鼠标操作对作图进行定制并导出需要的图片格式。从2017版开始,用户可以将二维数据作图保存成plt脚本(实际为python语言脚本),这样做有很多好处:

保存plt脚本

目前ATK支持以下几种作图保存plt脚本:

方法:在充分使用作图窗口定制图像后,点击作图窗口下方的“磁盘”按钮即可默认保存plt文件。

将plt文件重新作图

plt文件保存了用户设定的全部作图信息,用户随时可以将plt脚本重新作图查看。

方法有如下两种:

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()
 

使用plt脚本定制图像

定义颜色

常见的颜色定义方法有:

定义字体

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')

线型(line style)定义

'-' 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形状定义

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

更多定义请参考:https://matplotlib.org/api/markers_api.html

横线和纵线

与数据线定义方法相同。

# 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)

进一步加工和导出

经过如上设置,plt脚本可能无法在VNL的2D plot editor里作图,但仍然可以用上述第二种方法在cmd命令行作图。示例如下:

此时,仍然可以进一步使用作图工具调整一些性质(点击绿色“对号”),以便导出。

点击“磁盘”图标,导出png(像素受限)或pdf(任意缩放)。