【ABAQUS二次开发手册】【案例3.2】【用matplotlib画示意图】
1. 效果图
![效果图](https://img-blog.csdnimg.cn/5466add4a6a04359bd52e6a1cf9db307.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAbXlnb2RhbGllbg==,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
2. Python源代码
from matplotlib import pyplot as plt
from matplotlib.path import Path
from matplotlib import patches
import numpy as np
def PT(*args): return np.array(args,'d')
def norm(vec): return np.linalg.norm(vec)
def angle(vec):
an = np.rad2deg(np.arctan2(vec[1],vec[0]))
return an if an>=0 else an+360.
def line(*PTs):
'''各个点,连成线路径,LINETO=2'''
v = np.array(PTs)
c = np.ones(len(PTs))*2
return v,c
def arc(O,P1,P2,reverse=False):
'''逆时针方向的圆弧的路径 P1 P2逆时针给出'''
an1 = angle(P1-O)
an2 = angle(P2-O)
R = norm (P1-O)
if an1 == an2:
v = np.array([P1,P2])
c = np.array([2 ,2 ])
elif an1>an2:
p1 = Path.arc(an1,360)
p2 = Path.arc(0,an2)
c1 = np.array(p1.codes)
c1[0] = 2
c2 = np.array(p2.codes)
c2[0] = 2
v = np.concatenate([p1.vertices*R + O, p2.vertices*R + O])
c = np.concatenate([c1, c2])
else:
p = Path.arc(an1,an2)
c = np.array(p.codes)
c[0] = 2
v = p.vertices*R + O
if reverse:
v = v[slice(-1,None,-1)]
return v,c
def join_path(vs,cs,color='gray',lw=1):
'''逆时针连接各路径,有顺序;起始点要与终点重合;终点要保证留个位置'''
cs[0][0] = 1
cs[-1][-1] = 79
v = np.concatenate(vs)
c = np.concatenate(cs)
p = Path(v,c)
patch = patches.PathPatch(p, facecolor=color, lw=lw)
return patch
def demo(R=10,color='#FFFFFF',lw=2):
kp = [
PT( 0 , 0 ), PT( 2*R , 2*R ), PT(-2*R , 2*R ),
PT(-2*R ,-2*R ), PT( 2*R ,-2*R ), PT( 2*R , R ),
PT( R , 2*R ), PT( -R , 2*R ), PT(-2*R , R ),
PT(-2*R , -R ), PT( -R ,-2*R ), PT( R ,-2*R ),
PT( 2*R , -R ),]
v1,c1 = arc(kp[1],kp[5],kp[6])
v2,c2 = arc(kp[2],kp[7],kp[8])
v3,c3 = arc(kp[3],kp[10],kp[9],True)
v4,c4 = arc(kp[4],kp[12],kp[11],True)
v5,c5 = line(kp[12],kp[5])
pat = join_path([v1,v2,v3,v4,v5],[c1,c2,c3,c4,c5],color,lw)
ap1 = patches.FancyArrowPatch(kp[12]-PT(0.1*R,0),kp[5]-PT(0.1*R,0),
arrowstyle='<->' ,linewidth=2,facecolor='k',edgecolor='k',
mutation_scale=20)
ap2 = patches.FancyArrowPatch([-R,2.1*R],[R,2.1*R],
arrowstyle='<|-|>',linewidth=2,facecolor='k',edgecolor='k',
mutation_scale=20)
ap3 = patches.FancyArrowPatch([2*R,2*R],[3*R,2*R], arrowstyle='-|>',
linewidth=2,facecolor='k',edgecolor='k',mutation_scale=20)
fig,ax = plt.subplots(figsize=(6,6))
ax.add_patch(pat)
ax.add_patch(ap1)
ax.add_patch(ap2)
ax.add_patch(ap3)
pR = patches.Rectangle
pE = patches.Ellipse
ax.add_patch(pR([-R-0.6*R,R-0.4*R],1.2*R,0.8*R,color='red',lw=2,ec='k'))
ax.add_patch(pR([R-0.6*R,R-0.4*R],1.2*R,0.8*R,color='red',lw=2,ec='k'))
ax.add_patch(pR([-0.6*R,-R],1.2*R,0.8*R,color='w',lw=2,ec='k'))
ax.add_patch(pE([-R,R],0.6*R,0.4*R,color='black',lw=2,ec='k'))
ax.add_patch(pE([ R,R],0.6*R,0.4*R,color='black',lw=2,ec='k'))
ax.text(2.5*R,2.1*R,'R',fontsize=12,rotation=0,
ha='center',va='center',color='b')
ax.text(1.8*R,0,'2R',fontsize=12,rotation=90,
ha='center',va='center',color='b')
ax.text(0,2.2*R,'2R',fontsize=12,rotation=0,
ha='center',va='center',color='b')
fig.subplots_adjust(top=1,bottom=0,left=0,right=1)
ax.axis('equal')
ax.axis('off')
plt.savefig('demo.png')
plt.show()
if __name__ == '__main__':
demo(R=10,color='orange',lw=2)
3. 原理
- 用matplotlib.path.Path分段绘制线段、圆弧路径Path,路径连接在一起形成轮廓
- 用 patches.FancyArrowPatch 绘制箭头
- 用坐标轴的text绘制文本