はじめに
久しぶりの投稿となった。
最近また3次元グラフの必要性に迫られて、昔の投稿を見直したり、新しい情報がないかさぐっていたところ、3次元でもアスペクト比を3軸で揃えることができるようになったようなので、自分用のテンプレートとしてコードを載せておく。
テストコード
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d.art3d import Poly3DCollection
def main():
fsz=12
xmin,xmax=-5,20
ymin,ymax=-5,50
zmin,zmax=-10,20
iw,ih=12,10
fig = plt.figure(figsize=(iw,ih))
plt.rcParams['font.size']=fsz
plt.rcParams['font.family']='monospace'
elevs=[30,30,30,30]
azims=[-60,-60,-135,-135]
aspects=['auto','equal','auto','equal']
for iii in range(0,4):
nplt=221+iii
ax = fig.add_subplot(nplt, projection='3d')
ax.set_xlim3d(xmin, xmax)
ax.set_ylim3d(ymin, ymax)
ax.set_zlim3d(zmin, zmax)
ax.set_xlabel('x-axis')
ax.set_ylabel('y-axis')
ax.set_zlabel('z-axis')
ax.set_aspect(aspects[iii])
ax.view_init(elev=elevs[iii], azim=azims[iii])
# plot square shape
x1,y1,z1=np.array([2,7,7,2,2]),np.array([2,2,7,7,2]),np.array([0,0,0,0,0])
x2,y2,z2=np.array([0,0,0,0,0]),np.array([2,7,7,2,2]),np.array([2,2,7,7,2])
x3,y3,z3=np.array([12,17,17,12,12]),np.array([0,0,0,0,0]),np.array([2,2,7,7,2])
ax.plot(x1,y1,z1,'-',color='#ff0000')
ax.plot(x2,y2,z2,'-',color='#0000ff')
ax.plot(x3,y3,z3,'-',color='#00ff00')
ax.plot(x1,y1+20,z1,'-',color='#ff0000')
ax.plot(x2,y2+20,z2,'-',color='#0000ff')
ax.plot(x3,y3+20,z3,'-',color='#00ff00')
# colored polygon
xx=np.array([0,5,5,0,0])
yy=np.array([0,0,5,5,0])
zz=np.array([20,20,20,20,20])
verts = [list(zip(xx,yy,zz))]
ax.add_collection3d(Poly3DCollection(verts,facecolor='#000080',alpha=0.3))
ls1='ax.view_init(elev={0:.0f}, azim={1:.0f})'.format(elevs[iii],azims[iii])
ls2="ax.set_aspect('{0}')".format(aspects[iii])
ls3='xmin,xmax={0:.0f},{1:.0f}'.format(xmin,xmax)
ls4='ymin,ymax={0:.0f},{1:.0f}'.format(ymin,ymax)
ls5='zmin,zmax={0:.0f},{1:.0f}'.format(zmin,zmax)
ls=ls1+'\n'+ls2+'\n'+ls3+'\n'+ls4+'\n'+ls5
ax.text2D(0, 1, ls, va='top',ha='left',transform=ax.transAxes,fontsize=fsz)
plt.tight_layout()
plt.savefig('fig_1.jpg',dpi=100)
#plt.show()
#---------------
# Execute
#---------------
if __name__ == '__main__': main()
上記コードの作図結果
いくつかの正方形を描画しているが、ax.set_aspect('equal')
を指定することで、3軸とも同じスケールで描画してくれている(右上と右下の図)。
応用作図例
簡単な3次元骨組構造解析結果から断面力図を出力したもの。
以 上