├── README.md ├── _config.yml ├── output_11_0.png ├── output_13_0.png ├── output_15_0.png ├── output_17_0.png ├── output_19_0.png ├── output_22_0.png ├── output_24_1.png ├── output_26_1.png ├── output_28_0.png ├── output_29_0.png ├── output_30_0.png ├── output_32_0.png ├── output_34_0.png ├── output_5_0.png ├── output_7_0.png ├── output_9_0.png └── pymatgen_bs_dos_plot.md /README.md: -------------------------------------------------------------------------------- 1 | **此教程写于2018年,pymatgen已经更新过很多次,所以强烈建议大家阅读官方教程,此教程仅作为参考!** 2 | 3 | pymatgen是Materials Project开发的一个python库,主要用于高通量计算的输入文件设置与输出文件处理,相关软件还有Fireworks,custodian,atomate,matminer,这些软件为高通量计算提供了一个完整的解决方案。pymatgen功能强大,针对Vasp的功能最为完善,利用pymatgen可以完成大部分Vasp计算的自动化处理,优势明显,大家可以自己去进一步学习,这里只为大家简单介绍一下pymatgen在能带结构与电子态密度画图方面的简单应用。 4 | 5 | 官方文档:[http://pymatgen.org/](http://pymatgen.org/) 6 | 7 | github:[https://github.com/materialsproject/pymatgen](https://github.com/materialsproject/pymatgen) 8 | 9 | 10 | 对于python小白,请直接看文末**python小白指南**。 11 | 12 | 我们正式开始。我们计算的结构是ZrBrN,二维结构,POSCAR中只有三个原子。当前目录下有四个文件夹,so是优化计算,scf是自恰计算,bs是能带计算,dos是态密度计算,计算已经完成。注意:以!开头的是shell命令 13 | 14 | 15 | ```python 16 | !ls 17 | ``` 18 | 19 | bs plt_12.png plt_16.png plt_4.png plt_8.png so 20 | dos plt_13.png plt_1.png plt_5.png plt_9.png 21 | plt_10.png plt_14.png plt_2.png plt_6.png pymatgen_bs_dos_plot.ipynb 22 | plt_11.png plt_15.png plt_3.png plt_7.png scf 23 | 24 | 25 | pymatgen是面向对象编程,发挥了python的长处,因此我们首先需要创建要处理的对象。调用pymatgen.io.vasp.outputs模块,通过处理对应的vasprun.xml文件,得到两个对象dos_data与bs_data,包含了能带和态密度的所有信息。得到这两个对象以后,我们就可以根据自己的需求来画各种图,相应的模块是pymatgen.electronic_structure.plotter。 26 | 27 | 28 | ```python 29 | import matplotlib.pyplot 30 | from pymatgen.io.vasp.outputs import Vasprun 31 | from pymatgen.electronic_structure.plotter import BSDOSPlotter,\ 32 | BSPlotter,BSPlotterProjected,DosPlotter 33 | dos_vasprun=Vasprun("./dos/vasprun.xml") 34 | dos_data=dos_vasprun.complete_dos 35 | bs_vasprun=Vasprun("./bs/vasprun.xml",parse_projected_eigen=True) 36 | bs_data=bs_vasprun.get_band_structure(line_mode=1) 37 | ``` 38 | 39 | # 能带与态密度图 40 | 有时我们需要将能带与态密度放在一起作比较,BSDOSPlotter可以实现这一功能。 41 | 42 | ## 原始的能带与态密度图 43 | 44 | 将BSDOSPlotte的参数bs_projection与dos_projection的值均设置为None,表示不读取能带和态密度的投影信息,然后通过get_plot调用bs_data与dos_data画图。 45 | 46 | 47 | ```python 48 | plt_1=BSDOSPlotter(bs_projection=None, dos_projection=None) 49 | plt_1.get_plot(bs=bs_data,dos=dos_data) 50 | matplotlib.pyplot.savefig('plt_1.png',img_format='png') 51 | ``` 52 | 53 | 54 | ![png](output_5_0.png) 55 | 56 | 57 | ## 将能带与态密度投影到元素 58 | 将BSDOSPlotte参数bs_projection与dos_projection的值均设置为’elements‘,表示读取能带和态密度的投影到元素的信息。 59 | 60 | 61 | ```python 62 | plt_2=BSDOSPlotter(bs_projection='elements', dos_projection='elements') 63 | plt_2.get_plot(bs=bs_data,dos=dos_data) 64 | matplotlib.pyplot.savefig('plt_2.png',img_format='png') 65 | ``` 66 | 67 | 68 | ![png](output_7_0.png) 69 | 70 | 71 | ## 将能带投影到元素,态密度投影到轨道 72 | 将参数bs_projection设置为’element‘,dos_projection的值设置为‘orbitals’。 73 | 74 | 75 | ```python 76 | plt_3=BSDOSPlotter(bs_projection='elements', dos_projection='orbitals') 77 | plt_3.get_plot(bs=bs_data,dos=dos_data) 78 | matplotlib.pyplot.savefig('plt_3.png',img_format='png') 79 | ``` 80 | 81 | 82 | ![png](output_9_0.png) 83 | 84 | 85 | # 能带图 86 | pymatgen中BSPlotter与BSPlotterProjected可以满足我们关于能带画图的绝大部分需求。 87 | 88 | ## 原始能带图 89 | 使用BSPlotter调用bs_data即可。 90 | 91 | 92 | ```python 93 | plt_4=BSPlotter(bs=bs_data) 94 | plt_4.get_plot() 95 | plt_4.save_plot("plt_4.png",img_format='png') 96 | ``` 97 | 98 | 99 | ![png](output_11_0.png) 100 | 101 | 102 | BSDOSPlotter也可以实现这一功能,我们需将BSDOSPlotter中的bs_projection与dos_projection设置为None,表示不读取投影信息,将get_plot的dos参数设置为None,表示不画态密度图。 103 | 104 | 105 | ```python 106 | plt_5=BSDOSPlotter(bs_projection=None, dos_projection=None) 107 | plt_5.get_plot(bs=bs_data,dos=None) 108 | matplotlib.pyplot.savefig('plt_5.png',img_format='png') 109 | ``` 110 | 111 | 112 | ![png](output_13_0.png) 113 | 114 | 115 | 116 | ## 投影到元素的能带 117 | 118 | BSPlotterProjected的get_elt_projected_plots可以将能带投影到每一种元素然后分别作图,通过线条的粗细来表示该元素对该轨道的贡献。 119 | 120 | 121 | ```python 122 | plt_6=BSPlotterProjected(bs=bs_data) 123 | fig_6=plt_6.get_elt_projected_plots() 124 | matplotlib.pyplot.savefig('plt_6.png',img_format='png') 125 | ``` 126 | 127 | 128 | ![png](output_15_0.png) 129 | 130 | 131 | BSPlotterProjected的get_elt_projected_plots_color可以将能带投影到每一种元素作一张图,每一种元素对应一种颜色,通过不同的颜色来表示该元素对该轨道的贡献。 132 | 133 | 134 | ```python 135 | plt_7=BSPlotterProjected(bs=bs_data) 136 | fig_7=plt_7.get_elt_projected_plots_color() 137 | matplotlib.pyplot.savefig('plt_7.png',img_format='png') 138 | ``` 139 | 140 | 141 | ![png](output_17_0.png) 142 | 143 | 144 | BSDOSPlotter也可以实现这一功能,我们只需将第一行的dos_projection与第二行的dos参数均设置为None即可。 145 | 146 | 147 | ```python 148 | plt_8=BSDOSPlotter(bs_projection='elements', dos_projection=None) 149 | plt_8.get_plot(bs=bs_data,dos=None) 150 | matplotlib.pyplot.savefig('plt_8.png',img_format='png') 151 | ``` 152 | 153 | 154 | ![png](output_19_0.png) 155 | 156 | 157 | ## 投影到轨道的能带 158 | 159 | BSPlotterProjected中的get_projected_plots_dots可以将能带投影到不同元素的不同轨道,即角量子数,参数设置格式如下,大家将感兴趣的元素的轨道设置成如下格式即可,对于每一条轨道都将作图。 160 | 161 | 162 | ```python 163 | plt_9=BSPlotterProjected(bs=bs_data) 164 | plt_9.get_projected_plots_dots({'Zr':['d'],'Br':['p'],'N':['p']}) 165 | plt_9.save_plot('plt_9.png', img_format=u'png') 166 | ``` 167 | 168 | 169 | ![png](output_22_0.png) 170 | 171 | 172 | BSPlotterProjected中的get_projected_plots_dots_patom_pmorb的功能更加强大,可以将能带投影到不同原子的不同轨道,可以具体到磁量子数。dictio设置原子的磁量子数对应的轨道,dictpa表示原子信息,{'Br':[2]}代表在POSCAR中原子坐标在第二行的Br原子,由此我们可以看到,该方法支持将能带投影到结构中每一个原子的每一个轨道。 173 | 174 | 175 | ```python 176 | plt_10=BSPlotterProjected(bs=bs_data) 177 | plt_10.get_projected_plots_dots_patom_pmorb(dictio={'Br':['px','py','pz']}, \ 178 | dictpa={'Br':[2]}) 179 | plt_10.save_plot('plt_10.png', img_format=u'png') 180 | ``` 181 | 182 | You do not want to sum projection over orbitals. 183 | You do not want to sum projection over atoms. 184 | Number of subfigures: 3 185 | {'start_index': 0, 'end_index': 21, 'name': '\\Gamma-M'} 186 | {'start_index': 22, 'end_index': 41, 'name': 'M-K'} 187 | {'start_index': 42, 'end_index': 79, 'name': 'K-\\Gamma'} 188 | dictio_d: {'Br': ['px', 'py', 'pz']} 189 | dictpa_d: {'Br': ['2']} 190 | 191 | 192 | 193 | ![png](output_24_1.png) 194 | 195 | 196 | 除此之外,get_projected_plots_dots_patom_pmorb还有两个重要的参数,sum_atoms可以画同种原子的总投影,sum_morbs可以画同种原子的不同轨道的总投影。下图展示了第一个原子Zr的d轨道投影与第二个原子Br的p轨道投影。这里的原子序号代表该原子在POSCAR中的位置。由于我的结构中每一种元素只有一个原子,所以无法展示sum_atoms相关功能,大家可自行查阅。 197 | 198 | 199 | ```python 200 | plt_11=BSPlotterProjected(bs=bs_data) 201 | plt_11.get_projected_plots_dots_patom_pmorb(dictio={'Zr':['d'],\ 202 | 'Br':['px', 'py','pz']},\ 203 | dictpa={'Zr':[1],'Br':[2]},\ 204 | sum_morbs={'Br':['px','py','pz'],\ 205 | 'Zr':['d']}) 206 | plt_11.save_plot('plt_11.png', img_format=u'png') 207 | ``` 208 | 209 | You do not want to sum projection over atoms. 210 | Number of subfigures: 2 211 | {'start_index': 0, 'end_index': 21, 'name': '\\Gamma-M'} 212 | {'start_index': 22, 'end_index': 41, 'name': 'M-K'} 213 | {'start_index': 42, 'end_index': 79, 'name': 'K-\\Gamma'} 214 | dictio_d: {'Zr': ['d'], 'Br': ['p']} 215 | dictpa_d: {'Zr': ['1'], 'Br': ['2']} 216 | 217 | 218 | 219 | ![png](output_26_1.png) 220 | 221 | 222 | # 态密度图 223 | 224 | 我们可以利用DosPlotter来画各种态密度图。DosPlotter有两个重要的参数,一是sigma,与INCAR中的SIGMA对应,我们可以通过调节sigma值的大小来调节态密度图的光滑程度。二是stack,可以决定作图方式是曲线还是面积,具体如下。 225 | 226 | ## 总态密度 227 | 228 | DosPlotter中的add_dos用来定义要处理的对象dos,我们调用前边定义好的dos对象dos_data。我们取stack=False或False,sigma=0.5或初始值,来对比这两个参数的意义,结果如下。 229 | 230 | 231 | ```python 232 | plt_12=DosPlotter(stack=False,sigma=0.5) 233 | plt_12.add_dos('total dos',dos=dos_data) 234 | plt_12.save_plot('plt_12.png', img_format=u'png') 235 | ``` 236 | 237 | 238 | ![png](output_28_0.png) 239 | 240 | 241 | 242 | ```python 243 | plt_13=DosPlotter(stack=False) 244 | plt_13.add_dos('total dos',dos=dos_data) 245 | plt_13.save_plot('plt_13.png', img_format=u'png') 246 | ``` 247 | 248 | 249 | ![png](output_29_0.png) 250 | 251 | 252 | 253 | ```python 254 | plt_14=DosPlotter(stack=True,sigma=0.5) 255 | plt_14.add_dos('total dos',dos=dos_data) 256 | plt_14.save_plot('plt_14.png', img_format=u'png') 257 | ``` 258 | 259 | 260 | ![png](output_30_0.png) 261 | 262 | 263 | ## 投影到轨道的态密度 264 | 利用add_dos_dict获取投影信息,对dos_data进行get_spd_dos操作,获得投影到轨道的信息。 265 | 266 | 267 | ```python 268 | plt_15=DosPlotter(stack=False,sigma=0.5) 269 | plt_15.add_dos('total dos',dos=dos_data) 270 | plt_15.add_dos_dict(dos_data.get_spd_dos()) 271 | plt_15.save_plot('plt_15.png', img_format=u'png') 272 | ``` 273 | 274 | 275 | ![png](output_32_0.png) 276 | 277 | 278 | ## 投影到元素的态密度 279 | 280 | 利用add_dos_dict获取投影信息,对dos_data进行get_element_dos操作,获得投影到元素的信息。 281 | 282 | 283 | ```python 284 | plt_16=DosPlotter(stack=False,sigma=0.5) 285 | plt_16.add_dos('total dos',dos=dos_data) 286 | plt_16.add_dos_dict(dos_data.get_element_dos()) 287 | plt_16.save_plot('plt_16.png', img_format=u'png') 288 | ``` 289 | 290 | 291 | ![png](output_34_0.png) 292 | 293 | 294 | 以上就是全部内容,我在上边提到的各种方法还有许多参数,值得大家去仔细研究,大家也可以通过matplotlib设置图的字体和颜色等信息,定制各种高质量的能带与态密度图。pymatgen除了画图还在许多其他方面有强大的功能,有兴趣的可以自己去研究。接下来是针对python小白的简单粗暴的操作指南。 295 | 296 | 297 | # python小白指南 298 | 299 | 首先,你的计算机应当已经安装好了pymatgen,才可以进行如下步骤。pymatgen支持pip安装。 300 | 301 | 其次,确定你的计算文件的位置,将 In[2] 中vasprun.xml的路径做相应的更改。 302 | 303 | 最后,按如下方法复制成python脚本,加号代表将两块代码复制在一个文件,并更改最后一行输出图片的名字和格式,运行脚本即可。 304 | 305 | |要求|方法| 306 | |:------ |:------ | 307 | | 原始的能带与态密度图 | In[2] + In[3] | 308 | | 将能带与态密度投影到元素 | In[2] + In[4] | 309 | | 将能带投影到元素,态密度投影到轨道 | In[2] + In[5] | 310 | | 原始能带图 | In[2] + In[6] 或 In[2] + In[7] | 311 | | 投影到元素的能带 | In[2] + In[8] 或 In[2] + In[9]或 In[2] + In[10]| 312 | | 总态密度| In[2] + In[15]| 313 | | 投影到轨道的态密度 | In[2] + In[17]| 314 | | 投影到元素的态密度 | In[2] + In[18] | 315 | 316 | 最后说两句:第一次写东西,经验不足,希望对大家有用,谢谢大家! 317 | -------------------------------------------------------------------------------- /_config.yml: -------------------------------------------------------------------------------- 1 | theme: jekyll-theme-slate -------------------------------------------------------------------------------- /output_11_0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yjzhang97/pymatgen_bs_dos_plot/1556e52647b209c8779c71130a35dfc22fa7521d/output_11_0.png -------------------------------------------------------------------------------- /output_13_0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yjzhang97/pymatgen_bs_dos_plot/1556e52647b209c8779c71130a35dfc22fa7521d/output_13_0.png -------------------------------------------------------------------------------- /output_15_0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yjzhang97/pymatgen_bs_dos_plot/1556e52647b209c8779c71130a35dfc22fa7521d/output_15_0.png -------------------------------------------------------------------------------- /output_17_0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yjzhang97/pymatgen_bs_dos_plot/1556e52647b209c8779c71130a35dfc22fa7521d/output_17_0.png -------------------------------------------------------------------------------- /output_19_0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yjzhang97/pymatgen_bs_dos_plot/1556e52647b209c8779c71130a35dfc22fa7521d/output_19_0.png -------------------------------------------------------------------------------- /output_22_0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yjzhang97/pymatgen_bs_dos_plot/1556e52647b209c8779c71130a35dfc22fa7521d/output_22_0.png -------------------------------------------------------------------------------- /output_24_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yjzhang97/pymatgen_bs_dos_plot/1556e52647b209c8779c71130a35dfc22fa7521d/output_24_1.png -------------------------------------------------------------------------------- /output_26_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yjzhang97/pymatgen_bs_dos_plot/1556e52647b209c8779c71130a35dfc22fa7521d/output_26_1.png -------------------------------------------------------------------------------- /output_28_0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yjzhang97/pymatgen_bs_dos_plot/1556e52647b209c8779c71130a35dfc22fa7521d/output_28_0.png -------------------------------------------------------------------------------- /output_29_0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yjzhang97/pymatgen_bs_dos_plot/1556e52647b209c8779c71130a35dfc22fa7521d/output_29_0.png -------------------------------------------------------------------------------- /output_30_0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yjzhang97/pymatgen_bs_dos_plot/1556e52647b209c8779c71130a35dfc22fa7521d/output_30_0.png -------------------------------------------------------------------------------- /output_32_0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yjzhang97/pymatgen_bs_dos_plot/1556e52647b209c8779c71130a35dfc22fa7521d/output_32_0.png -------------------------------------------------------------------------------- /output_34_0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yjzhang97/pymatgen_bs_dos_plot/1556e52647b209c8779c71130a35dfc22fa7521d/output_34_0.png -------------------------------------------------------------------------------- /output_5_0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yjzhang97/pymatgen_bs_dos_plot/1556e52647b209c8779c71130a35dfc22fa7521d/output_5_0.png -------------------------------------------------------------------------------- /output_7_0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yjzhang97/pymatgen_bs_dos_plot/1556e52647b209c8779c71130a35dfc22fa7521d/output_7_0.png -------------------------------------------------------------------------------- /output_9_0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yjzhang97/pymatgen_bs_dos_plot/1556e52647b209c8779c71130a35dfc22fa7521d/output_9_0.png -------------------------------------------------------------------------------- /pymatgen_bs_dos_plot.md: -------------------------------------------------------------------------------- 1 | 2 | pymatgen是Materials Project开发的一个python库,主要用于高通量计算的输入文件设置与输出文件处理,相关软件还有Fireworks,custodian,atomate,matminer,这些软件为高通量计算提供了一个完整的解决方案。pymatgen功能强大,针对Vasp的功能最为完善,利用pymatgen可以完成大部分Vasp计算的自动化处理,优势明显,大家可以自己去进一步学习,这里只为大家简单介绍一下pymatgen在能带结构与电子态密度画图方面的简单应用。 3 | 4 | 官方文档:[http://pymatgen.org/](http://pymatgen.org/) 5 | 6 | github:[https://github.com/materialsproject/pymatgen](https://github.com/materialsproject/pymatgen) 7 | 8 | 9 | 对于python小白,请直接看文末**python小白指南**。 10 | 11 | 我们正式开始。我们计算的结构是ZrBrN,二维结构,POSCAR中只有三个原子。当前目录下有四个文件夹,so是优化计算,scf是自恰计算,bs是能带计算,dos是态密度计算,计算已经完成。注意:以!开头的是shell命令 12 | 13 | 14 | ```python 15 | !ls 16 | ``` 17 | 18 | bs plt_12.png plt_16.png plt_4.png plt_8.png so 19 | dos plt_13.png plt_1.png plt_5.png plt_9.png 20 | plt_10.png plt_14.png plt_2.png plt_6.png pymatgen_bs_dos_plot.ipynb 21 | plt_11.png plt_15.png plt_3.png plt_7.png scf 22 | 23 | 24 | pymatgen是面向对象编程,发挥了python的长处,因此我们首先需要创建要处理的对象。调用pymatgen.io.vasp.outputs模块,通过处理对应的vasprun.xml文件,得到两个对象dos_data与bs_data,包含了能带和态密度的所有信息。得到这两个对象以后,我们就可以根据自己的需求来画各种图,相应的模块是pymatgen.electronic_structure.plotter。 25 | 26 | 27 | ```python 28 | import matplotlib.pyplot 29 | from pymatgen.io.vasp.outputs import Vasprun 30 | from pymatgen.electronic_structure.plotter import BSDOSPlotter,\ 31 | BSPlotter,BSPlotterProjected,DosPlotter 32 | dos_vasprun=Vasprun("./dos/vasprun.xml") 33 | dos_data=dos_vasprun.complete_dos 34 | bs_vasprun=Vasprun("./bs/vasprun.xml",parse_projected_eigen=True) 35 | bs_data=bs_vasprun.get_band_structure(line_mode=1) 36 | ``` 37 | 38 | # 能带与态密度图 39 | 有时我们需要将能带与态密度放在一起作比较,BSDOSPlotter可以实现这一功能。 40 | 41 | ## 原始的能带与态密度图 42 | 43 | 将BSDOSPlotte的参数bs_projection与dos_projection的值均设置为None,表示不读取能带和态密度的投影信息,然后通过get_plot调用bs_data与dos_data画图。 44 | 45 | 46 | ```python 47 | plt_1=BSDOSPlotter(bs_projection=None, dos_projection=None) 48 | plt_1.get_plot(bs=bs_data,dos=dos_data) 49 | matplotlib.pyplot.savefig('plt_1.png',img_format='png') 50 | ``` 51 | 52 | 53 | ![png](output_5_0.png) 54 | 55 | 56 | ## 将能带与态密度投影到元素 57 | 将BSDOSPlotte参数bs_projection与dos_projection的值均设置为’elements‘,表示读取能带和态密度的投影到元素的信息。 58 | 59 | 60 | ```python 61 | plt_2=BSDOSPlotter(bs_projection='elements', dos_projection='elements') 62 | plt_2.get_plot(bs=bs_data,dos=dos_data) 63 | matplotlib.pyplot.savefig('plt_2.png',img_format='png') 64 | ``` 65 | 66 | 67 | ![png](output_7_0.png) 68 | 69 | 70 | ## 将能带投影到元素,态密度投影到轨道 71 | 将参数bs_projection设置为’element‘,dos_projection的值设置为‘orbitals’。 72 | 73 | 74 | ```python 75 | plt_3=BSDOSPlotter(bs_projection='elements', dos_projection='orbitals') 76 | plt_3.get_plot(bs=bs_data,dos=dos_data) 77 | matplotlib.pyplot.savefig('plt_3.png',img_format='png') 78 | ``` 79 | 80 | 81 | ![png](output_9_0.png) 82 | 83 | 84 | # 能带图 85 | pymatgen中BSPlotter与BSPlotterProjected可以满足我们关于能带画图的绝大部分需求。 86 | 87 | ## 原始能带图 88 | 使用BSPlotter调用bs_data即可。 89 | 90 | 91 | ```python 92 | plt_4=BSPlotter(bs=bs_data) 93 | plt_4.get_plot() 94 | plt_4.save_plot("plt_4.png",img_format='png') 95 | ``` 96 | 97 | 98 | ![png](output_11_0.png) 99 | 100 | 101 | BSDOSPlotter也可以实现这一功能,我们需将BSDOSPlotter中的bs_projection与dos_projection设置为None,表示不读取投影信息,将get_plot的dos参数设置为None,表示不画态密度图。 102 | 103 | 104 | ```python 105 | plt_5=BSDOSPlotter(bs_projection=None, dos_projection=None) 106 | plt_5.get_plot(bs=bs_data,dos=None) 107 | matplotlib.pyplot.savefig('plt_5.png',img_format='png') 108 | ``` 109 | 110 | 111 | ![png](output_13_0.png) 112 | 113 | 114 | 115 | ## 投影到元素的能带 116 | 117 | BSPlotterProjected的get_elt_projected_plots可以将能带投影到每一种元素然后分别作图,通过线条的粗细来表示该元素对该轨道的贡献。 118 | 119 | 120 | ```python 121 | plt_6=BSPlotterProjected(bs=bs_data) 122 | fig_6=plt_6.get_elt_projected_plots() 123 | matplotlib.pyplot.savefig('plt_6.png',img_format='png') 124 | ``` 125 | 126 | 127 | ![png](output_15_0.png) 128 | 129 | 130 | BSPlotterProjected的get_elt_projected_plots_color可以将能带投影到每一种元素作一张图,每一种元素对应一种颜色,通过不同的颜色来表示该元素对该轨道的贡献。 131 | 132 | 133 | ```python 134 | plt_7=BSPlotterProjected(bs=bs_data) 135 | fig_7=plt_7.get_elt_projected_plots_color() 136 | matplotlib.pyplot.savefig('plt_7.png',img_format='png') 137 | ``` 138 | 139 | 140 | ![png](output_17_0.png) 141 | 142 | 143 | BSDOSPlotter也可以实现这一功能,我们只需将第一行的dos_projection与第二行的dos参数均设置为None即可。 144 | 145 | 146 | ```python 147 | plt_8=BSDOSPlotter(bs_projection='elements', dos_projection=None) 148 | plt_8.get_plot(bs=bs_data,dos=None) 149 | matplotlib.pyplot.savefig('plt_8.png',img_format='png') 150 | ``` 151 | 152 | 153 | ![png](output_19_0.png) 154 | 155 | 156 | ## 投影到轨道的能带 157 | 158 | BSPlotterProjected中的get_projected_plots_dots可以将能带投影到不同元素的不同轨道,即角量子数,参数设置格式如下,大家将感兴趣的元素的轨道设置成如下格式即可,对于每一条轨道都将作图。 159 | 160 | 161 | ```python 162 | plt_9=BSPlotterProjected(bs=bs_data) 163 | plt_9.get_projected_plots_dots({'Zr':['d'],'Br':['p'],'N':['p']}) 164 | plt_9.save_plot('plt_9.png', img_format=u'png') 165 | ``` 166 | 167 | 168 | ![png](output_22_0.png) 169 | 170 | 171 | BSPlotterProjected中的get_projected_plots_dots_patom_pmorb的功能更加强大,可以将能带投影到不同原子的不同轨道,可以具体到磁量子数。dictio设置原子的磁量子数对应的轨道,dictpa表示原子信息,{'Br':[2]}代表在POSCAR中原子坐标在第二行的Br原子,由此我们可以看到,该方法支持将能带投影到结构中每一个原子的每一个轨道。 172 | 173 | 174 | ```python 175 | plt_10=BSPlotterProjected(bs=bs_data) 176 | plt_10.get_projected_plots_dots_patom_pmorb(dictio={'Br':['px','py','pz']}, \ 177 | dictpa={'Br':[2]}) 178 | plt_10.save_plot('plt_10.png', img_format=u'png') 179 | ``` 180 | 181 | You do not want to sum projection over orbitals. 182 | You do not want to sum projection over atoms. 183 | Number of subfigures: 3 184 | {'start_index': 0, 'end_index': 21, 'name': '\\Gamma-M'} 185 | {'start_index': 22, 'end_index': 41, 'name': 'M-K'} 186 | {'start_index': 42, 'end_index': 79, 'name': 'K-\\Gamma'} 187 | dictio_d: {'Br': ['px', 'py', 'pz']} 188 | dictpa_d: {'Br': ['2']} 189 | 190 | 191 | 192 | ![png](output_24_1.png) 193 | 194 | 195 | 除此之外,get_projected_plots_dots_patom_pmorb还有两个重要的参数,sum_atoms可以画同种原子的总投影,sum_morbs可以画同种原子的不同轨道的总投影。下图展示了第一个原子Zr的d轨道投影与第二个原子Br的p轨道投影。这里的原子序号代表该原子在POSCAR中的位置。由于我的结构中每一种元素只有一个原子,所以无法展示sum_atoms相关功能,大家可自行查阅。 196 | 197 | 198 | ```python 199 | plt_11=BSPlotterProjected(bs=bs_data) 200 | plt_11.get_projected_plots_dots_patom_pmorb(dictio={'Zr':['d'],\ 201 | 'Br':['px', 'py','pz']},\ 202 | dictpa={'Zr':[1],'Br':[2]},\ 203 | sum_morbs={'Br':['px','py','pz'],\ 204 | 'Zr':['d']}) 205 | plt_11.save_plot('plt_11.png', img_format=u'png') 206 | ``` 207 | 208 | You do not want to sum projection over atoms. 209 | Number of subfigures: 2 210 | {'start_index': 0, 'end_index': 21, 'name': '\\Gamma-M'} 211 | {'start_index': 22, 'end_index': 41, 'name': 'M-K'} 212 | {'start_index': 42, 'end_index': 79, 'name': 'K-\\Gamma'} 213 | dictio_d: {'Zr': ['d'], 'Br': ['p']} 214 | dictpa_d: {'Zr': ['1'], 'Br': ['2']} 215 | 216 | 217 | 218 | ![png](output_26_1.png) 219 | 220 | 221 | # 态密度图 222 | 223 | 我们可以利用DosPlotter来画各种态密度图。DosPlotter有两个重要的参数,一是sigma,与INCAR中的SIGMA对应,我们可以通过调节sigma值的大小来调节态密度图的光滑程度。二是stack,可以决定作图方式是曲线还是面积,具体如下。 224 | 225 | ## 总态密度 226 | 227 | DosPlotter中的add_dos用来定义要处理的对象dos,我们调用前边定义好的dos对象dos_data。我们取stack=False或False,sigma=0.5或初始值,来对比这两个参数的意义,结果如下。 228 | 229 | 230 | ```python 231 | plt_12=DosPlotter(stack=False,sigma=0.5) 232 | plt_12.add_dos('total dos',dos=dos_data) 233 | plt_12.save_plot('plt_12.png', img_format=u'png') 234 | ``` 235 | 236 | 237 | ![png](output_28_0.png) 238 | 239 | 240 | 241 | ```python 242 | plt_13=DosPlotter(stack=False) 243 | plt_13.add_dos('total dos',dos=dos_data) 244 | plt_13.save_plot('plt_13.png', img_format=u'png') 245 | ``` 246 | 247 | 248 | ![png](output_29_0.png) 249 | 250 | 251 | 252 | ```python 253 | plt_14=DosPlotter(stack=True,sigma=0.5) 254 | plt_14.add_dos('total dos',dos=dos_data) 255 | plt_14.save_plot('plt_14.png', img_format=u'png') 256 | ``` 257 | 258 | 259 | ![png](output_30_0.png) 260 | 261 | 262 | ## 投影到轨道的态密度 263 | 利用add_dos_dict获取投影信息,对dos_data进行get_spd_dos操作,获得投影到轨道的信息。 264 | 265 | 266 | ```python 267 | plt_15=DosPlotter(stack=False,sigma=0.5) 268 | plt_15.add_dos('total dos',dos=dos_data) 269 | plt_15.add_dos_dict(dos_data.get_spd_dos()) 270 | plt_15.save_plot('plt_15.png', img_format=u'png') 271 | ``` 272 | 273 | 274 | ![png](output_32_0.png) 275 | 276 | 277 | ## 投影到元素的态密度 278 | 279 | 利用add_dos_dict获取投影信息,对dos_data进行get_element_dos操作,获得投影到元素的信息。 280 | 281 | 282 | ```python 283 | plt_16=DosPlotter(stack=False,sigma=0.5) 284 | plt_16.add_dos('total dos',dos=dos_data) 285 | plt_16.add_dos_dict(dos_data.get_element_dos()) 286 | plt_16.save_plot('plt_16.png', img_format=u'png') 287 | ``` 288 | 289 | 290 | ![png](output_34_0.png) 291 | 292 | 293 | 以上就是全部内容,我在上边提到的各种方法还有许多参数,值得大家去仔细研究,大家也可以通过matplotlib设置图的字体和颜色等信息,定制各种高质量的能带与态密度图。pymatgen除了画图还在许多其他方面有强大的功能,有兴趣的可以自己去研究。接下来是针对python小白的简单粗暴的操作指南。 294 | 295 | 296 | # python小白指南 297 | 298 | 首先,你的计算机应当已经安装好了pymatgen,才可以进行如下步骤。pymatgen支持pip安装。 299 | 300 | 其次,确定你的计算文件的位置,将 In[2] 中vasprun.xml的路径做相应的更改。 301 | 302 | 最后,按如下方法复制成python脚本,加号代表将两块代码复制在一个文件,并更改最后一行输出图片的名字和格式,运行脚本即可。 303 | 304 | |要求|方法| 305 | |:------ |:------ | 306 | | 原始的能带与态密度图 | In[2] + In[3] | 307 | | 将能带与态密度投影到元素 | In[2] + In[4] | 308 | | 将能带投影到元素,态密度投影到轨道 | In[2] + In[5] | 309 | | 原始能带图 | In[2] + In[6] 或 In[2] + In[7] | 310 | | 投影到元素的能带 | In[2] + In[8] 或 In[2] + In[9]或 In[2] + In[10]| 311 | | 总态密度| In[2] + In[15]| 312 | | 投影到轨道的态密度 | In[2] + In[17]| 313 | | 投影到元素的态密度 | In[2] + In[18] | 314 | 315 | 最后说两句:第一次写东西,经验不足,希望对大家有用,谢谢大家! 316 | --------------------------------------------------------------------------------