专栏名称: Python中文社区
致力于成为国内最好的Python开发者学习交流平台,这里有关于Python的国内外最新消息,每日推送有趣有料的技术干货和社区动态。 官方网站:www.python-cn.com
目录
相关文章推荐
Python开发者  ·  强烈建议尽快搞个软考证!(重大利好) ·  昨天  
Python中文社区  ·  用 Python 追踪美国国会参议员股票交易 ·  2 天前  
Crossin的编程教室  ·  用Python制作一个随机抽奖小工具 ·  4 天前  
Crossin的编程教室  ·  用Python制作一个随机抽奖小工具 ·  4 天前  
Python爱好者社区  ·  iPhone 16暴跌,价格崩到离谱。。。 ·  5 天前  
Python爱好者社区  ·  两天私活,5w到手 ·  1 周前  
51好读  ›  专栏  ›  Python中文社区

基于matplotlib的2D/3D抽象网格和能量曲线绘制程序

Python中文社区  · 公众号  · Python  · 2017-05-05 17:34

正文

專 欄

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,比如拼接,合并,平移,添加阴影、改变颜色, 辅助线, 修改画布大小,导出插值数据等等。具体的例子参考: https://github.com/PytLab/catplot/tree/master/examples

绘制二维和三维抽象网格

晶格中的原子和键在catplot中被抽象成图中的node和edge,这样我们就可以通过创建图中的node和edge的方式搭建我们网格的重复单元,之后可以通过重复单元的扩展方法来将其扩展成nxn或者nxnxn的网格。

实现的基本方法就是通过matplotlib提供的Line2D, Arrow和scatter相关的接口来将相应node和edge的数据添加到maptlotlib的二维或者三维画布中然后进行绘制和显示。下面给分别给出两个绘制正交网格的绘制方法:

绘制5x5的二维网格

notebook版可以参见:https://github.com/PytLab/catplot/blob/master/examples/grid_2d_examples/expand_supercell.ipynb

创建nodes和edges

好了,现在我们就创建一个重复单元中的所需的所有元素,可以绘制一下看看效果了

OK, 重复单元已经搭建成功,可以以他为单位进行扩展了, 下面我们将其沿着x和y轴方向各进行5次重复扩展。

来看看效果:

是不是很直观和简单呢?

绘制三维网格

绘制三维网格,catplot中我都写了与二维绘制中相对应的类和接口,这里就不赘述了,可以参考项目中的examples: https://github.com/PytLab/catplot/tree/master/examples/grid_3d_examples/expand_3d_supercell.ipynb

是不是只能画正交的网格?

怎么可能,虽然所有的坐标都是在分数坐标系中定义的,但是在SuperCell类中我添加了分数坐标到笛卡尔坐标的转化,从而可以使得catplot绘制任意的网格。来个例子就知道了:

来我们看看这时候的重复单元是什么样子:

然后我们再将其进行一次3x3的扩展看看

所以基本上现在所有类型的晶格都可以通过CatPlot来绘制了。

总结

本 来catplot这个库最初是自己用matplotlib来绘图的小脚本,由于现在写论文的情况下需要灵活的绘制网格图,所以进行了重写,现在写成了一个 封装了matplotlib的python库方便使用者可以快速搭建自己想要的网格图和绘制漂亮的energy profile。代码和具体使用的notebook格式的例子均开源并放到了github上 (https://github.com/PytLab/catplot ),欢迎有需要的童鞋参考和使用。

PyLive预告:Python数据科学与算法攻略扫描以上二维码即可参加

主讲人:Toby
主讲时间:5月10日(周三)晚21:00-22:00
主讲人简介:国内知名医药大数据平台任职,几十个医药数据库负责人。专注于医药统计,熟悉自然语言处理和机器学习。设计过HBV分析器,乳腺癌分类器和中药性味归经关联分析。


课程中将为大家免费奉送10G最新国内外人工智能与机器学习资料,通过以下两种方式之一可以领取课程优惠券

1、点击阅读原文

2、添加客服微信并注明:“优惠码”,可获取优惠链接


客服微信号:pythonpost

推荐文章
Python中文社区  ·  用 Python 追踪美国国会参议员股票交易
2 天前
Crossin的编程教室  ·  用Python制作一个随机抽奖小工具
4 天前
Crossin的编程教室  ·  用Python制作一个随机抽奖小工具
4 天前
Python爱好者社区  ·  iPhone 16暴跌,价格崩到离谱。。。
5 天前
Python爱好者社区  ·  两天私活,5w到手
1 周前
笑的合不拢嘴  ·  周云鹏磕碜宋小宝,裤衩笑掉了!
7 年前