动机
写这篇推文,本意是介绍matplotlib的polar plot, 顺便重复一篇文章里的图给读者看一下,有需要的读者可以复制代码用于绘图。
见下面推文
计算2D弹性常数(杨氏模量)的两种方法对比[直接法|Vs|vaspkit]
参照Phys. Rev. B 82, 235414里面的公式:
对于二维材料这里对应的应该
是我们计算得到的, 这篇文章就是这么处理的 (Nanoscale Horiz., 2020, 5, 1386-1393) (这个地方我还不确定是不是对的,至少这篇文章是这么做的,这里如果有问题,我后续推文会更正)
先展示文献中的效果图
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib import rc
import matplotlib.colors as colors
rc('text', usetex=True)
plt.rc('font',family='Times New Roman',size=11)
d = np.arange(0, 1, 0.001)
theta = 2 * np.pi * d
C11 = 36.2
C22 = 6.65
C12 = 5.3
C44 = 7.61
delta = C11*C22 - C12**2
c = np.cos(theta)
s = np.sin(theta)
Y = delta/(C11*s**4 + C22*c**4 + (delta/C44 -2*C12) *c**2*s**2)
fig, ax = plt.subplots(subplot_kw={'projection': 'polar'})
#fig, ax = plt.subplots()
po=ax.scatter(theta, Y,c=Y,cmap=cm.coolwarm)
#ax.set_rmax(2)
#ax.set_rticks([0.5, 1, 1.5, 2]) # Less radial ticks
#ax.set_rlabel_position(-22.5) # Move radial labels away from plotted line
ax.grid(True)
cbar = plt.colorbar(po, ax=ax, pad=0.15)
#cbar.ax.set_title('Young\'s modulus' + r'$N/m^2', pad=20)
cbar.set_label('Young\'s modulus ' + r'$(N/m)$')
#cbar.ax.title.set_rotation(90)
#ax.set_title('Young\'s modulus')
plt.savefig('Young.pdf')
v_a = (C11+C22-delta/C44)*c**2*s**2-C12*(c**4+s**4)
v_b = C11*s**4 + C22 * c**4 + (delta/C44 - 2*C12)*c**2 * s**2
v = -v_a/v_b
fig, ax = plt.subplots(subplot_kw={'projection': 'polar'})
#fig, ax = plt.subplots()
po=ax.scatter(theta, v,c=Y,cmap=cm.coolwarm)
#ax.set_rmax(2)
#ax.set_rticks([0.5, 1, 1.5, 2]) # Less radial ticks
#ax.set_rlabel_position(-22.5) # Move radial labels away from plotted line
ax.grid(True)
cbar = plt.colorbar(po, ax=ax, pad=0.15)
#cbar.ax.set_title('Poisson ratio', pad=20)
cbar.set_label('Poisson ratio')
#cbar.ax.title.set_rotation(90)
#ax.set_title('Young\'s modulus')
plt.savefig('Poisson.pdf')
联系客服