PytLab,Python
中文社区专栏作者。主要从事科学计算与高性能计算领域的应用,主要语言为Python,C,C++。熟悉数值算法(最优化方法,蒙特卡洛算法等)与并行化
算法(MPI,OpenMP等多线程以及多进程并行化)以及python优化方法,经常使用C++给python写扩展。
blog:
http://ipytlab.com
github:
https://github.com/PytLab
前言
最近在写文章需要绘制一些一维的能量曲线(energy
profile)和抽象的二维和三维的网格来表示晶体用来描述自己的算法,于是自己在之前的脚本的基础上进行了整改写成了只提供接口的Python库,基
本思想就是封装了matplotlib中相关接口,方便快速搭建和定制自己的能量曲线和网格结构,
代码托管在GitHub上并上传至PyPI。对于研究晶体材料的同学如果想通过python来绘制简单的晶格图像可以参考一下。
正文
首先还是介绍一下这个程序的用途,目前主要是提供三个主要的模块来绘制三方面的内容:
1. 绘制抽象的二维网格结构
catplot提供了丰富的接口用来定制所需要的任何二维网格并进行周期性扩展,如下图是一个通过当个重复单元扩展出来的抽象(100)晶面的二维网格结构:
2. 绘制抽象的三维网格结构
同理只不过这次是在三维画布中进行绘制并进行重复单元的周期性扩展,扩展的效果如下图:
3. 通过插值算法实现绘制”顺滑”的energy profile
实现过程基本是通过对matplotlib提供的绘图组件和接口进一步封装成可以快速搭建上面三个类型图像的组件。
采用二次插值结合样条插值方法绘制 energy profile
energy profile可以理解成在势能面(Potential Energy Surface)上沿着某个特定的方向(反应坐标方向)上能量的变化,
下面我就上一个简单的例子来画一条顺滑的energy profile, 更多具体的例子我都已经jupyter notebook的形式放在的github上(
https://github.com/PytLab/catplot/tree/master/examples
)
插值方法
为了能将能量最高点沿着横坐标任意位置移动,我先将顶点的两边用二次函数进行插值,获取两个不同的二次函数形式,然后根据二次函数的形式在左右两边插上5个点,为了能让分开插值的两部分看起来连续,在将上面的10个新插的点和之前的3个点进行一次spline插值即可。
与插值相关的方法参考:
https://github.com/PytLab/catplot/blob/master/catplot/interpolate.py
丰富的接口
除了上面最简单的例子,catplot还提供了丰富的接口来定制和操作energy profile,比如拼接,合并,平移,添加阴影、改变颜色, 辅助线, 修改画布大小,导出插值数据等等。具体的例子参考: