LoginSignup
0
1

matplotlib 3次元グラフ(アスペクト比調整と多角形塗りつぶし−2)

Last updated at Posted at 2023-12-11

はじめに

久しぶりの投稿となった。

最近また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軸とも同じスケールで描画してくれている(右上と右下の図)。

fig_1.jpg

応用作図例

簡単な3次元骨組構造解析結果から断面力図を出力したもの。

fig_ds_secf.jpg

以 上

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1