日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2025/4/16 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于 matplotlib 的抽象网格和能量曲线绘制程序 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

最近在寫文章需要繪制一些一維的能量曲線(energy profile)和抽象的二維和三維的網格來表示晶體用來描述自己的算法,于是自己在之前的腳本的基礎上進行了整改寫成了只提供接口的Python庫,基本思想就是封裝了matplotlib中相關接口,方便快速搭建和定制自己的能量曲線和網格結構, 代碼托管在GitHub上并上傳至PyPI。對于研究晶體材料的同學如果想通過python來繪制簡單的晶格圖像可以參考一下。

GitHub地址:https://github.com/PytLab/catplot/

PyPI地址:https://pypi.python.org/pypi/catplot/

正文

首先還是介紹一下這個程序的用途,目前主要是提供三個主要的模塊來繪制三方面的內容:

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)

# 從catplot中導入繪制所需的組件: 畫布 和 線

from catplot.ep_components.ep_canvas import EPCanvas

from catplot.ep_components.ep_lines import ElementaryLine

# 創建一個用于繪制energy profile的畫布

canvas = EPCanvas()

# 創建一條能量曲線,提供的三個值分別是三個狀態下的能量數值

line = ElementaryLine([0.0, 1.2, 0.8])

# 將這條線添加到畫布中

canvas.add_line(line)

# 繪制

canvas.draw()

canvas.figure.show()

插值方法

為了能將能量最高點沿著橫坐標任意位置移動,我先將頂點的兩邊用二次函數進行插值,獲取兩個不同的二次函數形式,然后根據二次函數的形式在左右兩邊插上5個點,為了能讓分開插值的兩部分看起來連續,在將上面的10個新插的點和之前的3個點進行一次spline插值即可。

# 頂點兩側進行二次插值的算法

def quadratic_connect_interp(x1, y1, x2, y2):

????A = np.matrix([[x1**2, x1, 1],

?????????????????? [x2**2, x2, 1],

?????????????????? [2*x2, 1, 0]])

????b = np.matrix([[y1], [y2], [0]])

????x = A.I * b

????x.shape = (1, -1)

????a, b, c = x.tolist()[0]

????poly_func = lambda x: a*x**2 + b*x + c

????return poly_func

?


與插值相關的方法參考: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的二維或者三維畫布中然后進行繪制和顯示。下面給分別給出兩個繪制正交網格的繪制方法:

繪制5×5的二維網格

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

創建nodes和edges

from catplot.grid_components.nodes import Node2D

from catplot.grid_components.edges import Edge2D

nodes, edges = [], []

# 創建重復單元中的nodes和edge

top = Node2D([0.0, 0.0], size=800, color="#2A6A9C")

t1 = Node2D([0.0, 1.0])

t2 = Node2D([1.0, 0.0])

nodes.append(top)

# 鏈接這三個node的edges

e1 = Edge2D(top, t1, width=4)

e2 = Edge2D(top, t2, width=4)

edges.extend([e1, e2])

# 中間的nodes

bridge1 = Node2D([0.0, 0.5], style="s", size=600, color="#5A5A5A", alpha=0.6)

bridge2 = Node2D([0.5, 0.0], style="s", size=600, color="#5A5A5A", alpha=0.6)

b1 = bridge1.clone([0.5, 0.5])

b2 = bridge2.clone([0.5, 0.5])

nodes.extend([bridge1, bridge2])

# 連接他們的edges

e1 = Edge2D(bridge1, b1)

e2 = Edge2D(bridge1, bridge2)

e3 = Edge2D(bridge2, b2)

e4 = Edge2D(b1, b2)

edges.extend([e1, e2, e3, e4])

# 正中間的node

h = Node2D([0.5, 0.5], style="h", size=700, color="#5A5A5A", alpha=0.3)

nodes.append(h)

好了,現在我們就創建一個重復單元中的所需的所有元素,可以繪制一下看看效果了

from catplot.grid_components.grid_canvas import Grid2DCanvas

from catplot.grid_components.supercell import SuperCell2D

canvas = Grid2DCanvas()

# 將上面的元素放到supercell中,后面我們將一supercell為單位進行展開

supercell = SuperCell2D(nodes, edges)

# 繪制效果

canvas.add_supercell(supercell)

canvas.draw()

canvas.figure

?


OK, 重復單元已經搭建成功,可以以他為單位進行擴展了, 下面我們將其沿著x和y軸方向各進行5次重復擴展。

# 很簡單,就一行代碼

expanded_supercell = supercell.expand(5, 5)

來看看效果:

canvas_big = Grid2DCanvas(figsize=(30, 20), dpi=60)??# 定制畫布大小

canvas_big.add_supercell(expanded_supercell)

canvas_big.draw()

canvas_big.figure

?


是不是很直觀和簡單呢?

繪制三維網格

繪制三維網格,catplot中我都寫了與二維繪制中相對應的類和接口,這里就不贅述了,可以參考項目中的examples:https://github.com/PytLab/catplot/tree/master/examples/grid_3d_examples/expand_3d_supercell.ipynb

是不是只能畫正交的網格?

怎么可能,雖然所有的坐標都是在分數坐標系中定義的,但是在SuperCell類中我添加了分數坐標到笛卡爾坐標的轉化,從而可以使得catplot繪制任意的網格。來個例子就知道了:

# 創建nodes和edges的代碼與上面的部分完全相同

...

# 但是我們在定義supercell的時候可以修改cell_vectors參數來是重復單元發生形變

supercell = SuperCell2D(nodes, edges, cell_vectors=[[1.0, 0.0],

????????????????????????????????????????????????????[0.5, 1.0]])

canvas.add_supercell(supercell)

canvas.draw()

canvas.figure.show()

來我們看看這時候的重復單元是什么樣子:

?


然后我們再將其進行一次3×3的擴展看看

expanded_supercell = supercell.expand(3, 3)

canvas_big = Grid2DCanvas(figsize=(30, 20), dpi=60)

canvas_big.add_supercell(expanded_supercell)

canvas_big.draw()

canvas_big.figure.show()

?


所以基本上現在所有類型的晶格都可以通過CatPlot來繪制了。

總結

本來catplot這個庫最初是自己用matplotlib來繪圖的小腳本,由于現在寫論文的情況下需要靈活的繪制網格圖,所以進行了重寫,現在寫成了一個封裝了matplotlib的python庫方便使用者可以快速搭建自己想要的網格圖和繪制漂亮的energy profile。代碼和具體使用的notebook格式的例子均開源并放到了github上 (https://github.com/PytLab/catplot),歡迎有需要的童鞋參考和使用。

轉載于:https://www.cnblogs.com/paisenpython/p/10320073.html

總結

以上是生活随笔為你收集整理的基于 matplotlib 的抽象网格和能量曲线绘制程序的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 性综艺节目av在线播放 | 国产毛片毛片毛片毛片 | 午夜影院美女 | 久久久久五月天 | 亚洲视频91 | 在线免费中文字幕 | 天堂网2020| 国产在线观看不卡 | 二区国产| 久久精品波多野结衣 | 浮生影视在线观看免费 | 欧美久久一区二区三区 | 男男gay动漫 | 最近中文字幕av | 国产精品天天干 | 国产精品亚洲欧美在线播放 | 亚洲国产高清在线 | 99视频免费看 | 最近中文字幕在线观看 | 国产1级片| 亚洲涩涩网 | 爱爱短视频 | 色哟哟无码精品一区二区三区 | 四虎影院新网址 | 国产精品一区二区无线 | 午夜网站在线观看 | 一级黄色视屏 | 日韩欧美精品在线视频 | 成人精品视频网站 | 欧美日韩一区在线观看 | 国产成人精品在线观看 | 爱吃波客今天最新视频 | 亚洲天堂偷拍 | 国产偷人妻精品一区 | 国产精品一区二三区 | 带aaa级的网名 | 欧美电影一区二区三区 | 一区国产精品 | 欧美第二区 | 99精品网站| 好吊操这里只有精品 | 深夜在线 | 国产女主播在线观看 | www在线播放 | 日本久久久久久久久 | 亚洲系列在线观看 | 最新av不卡 | 视频精品久久 | 亚洲中文字幕无码不卡电影 | 色哟哟免费在线观看 | 日本免费在线播放 | 免费涩涩 | 青青国产在线观看 | 少妇精品 | 男操女视频网站 | 欧洲亚洲女同hd | www.999热| 午夜激情影视 | 少妇精品亚洲一区二区成人 | 国产传媒国产传媒 | 奇米影视一区二区三区 | 99热这里只有精品久久 | 一级特黄aa大片免费播放 | 欧美特级特黄aaaaaa在线看 | 那里有毛片看 | 日韩一片| 精品无码一区二区三区蜜臀 | 欧洲成人在线观看 | 自拍视频在线播放 | 韩国美女毛片 | 古装做爰无遮挡三级聊斋艳谭 | 99re在线播放 | 国语对白做受按摩的注意事项 | 成人在线高清 | 中国videosex高潮hd | 操屁股视频 | 国产精品区一区二 | 色爱综合 | 精产国品一二三产品蜜桃 | yy色综合| 在线观看一二三区 | 亚洲 欧美 激情 另类 校园 | 久一视频在线 | 天堂av在线中文 | 欧美日韩电影一区 | 奇米影视第四色777 波多野结衣一区二区三区免费视频 | 免费激情小视频 | 驯服少爷漫画免费观看下拉式漫画 | 韩国午夜av | 天天看av| 日韩精彩视频在线观看 | 密桃成熟时在线观看 | 97爱爱爱 | 免费在线a | 久久92 | 日韩视频一区二区在线观看 | 色欲狠狠躁天天躁无码中文字幕 | 亚洲精品少妇一区二区 | 日韩毛片网 |