[matplotlib] 3D plot 앵글 바꾸기(view_init)

반응형
    반응형

    matplotlib를 이용해 3D plot의 앵글을 바꾸는 방법입니다.

    3D는 입체라서 여러면이 존재하는데 회전을 시켜가며 보는게 가장 정확하게 그림을 보는거지만

    matplotlib는 정적인 그림이라 한면만 보여줍니다. 

    그래서 앵글을 바꿔서 보여주는 방식으로 되어 있습니다.

    view_init()를 쓰면 간단히 되어서 이번 포스팅은 굉장히 짧지 않을까 싶습니다.

    이전 포스팅에서 3D plot을 그려보았는데 이번엔 다른 면을 보기 위해 각도를 바꾸겠습니다.

     

    view_init의 파라미터부터 보면 다음과 같습니다.

    view_init(elev=None , azim=None)

    • elev : elevation을 약자로 쓴것으로 z plane의 각도를 의미. 입력한 각도대로 위 아래로 변화함.
    • azim : azimuth angle 로 x,y plane의 각도를 의미. 

    실제로 각도가 진짜로 어떻게 변하는지 비교해보겠습니다.

    x = np.linspace(50,150,24)
    y = np.linspace(0.5,2.5,24)
    x,y = np.meshgrid(x,y)
    z = (x-100)**2/y

    임의로 x,y,z를 만들고 원본과 angle변경된 것을 비교하겠습니다.

     

    import matplotlib.pyplot as plt
    from mpl_toolkits.mplot3d import Axes3D
    fig = plt.figure(figsize=(10,6))
    ax = fig.gca(projection='3d')
    surf = ax.plot_surface(x,y,z,rstride=2,cstride=2,cmap=plt.cm.coolwarm,linewidth=0.5,antialiased=False)
    ax.set_xlabel('x axis')
    ax.set_ylabel('y axis')
    ax.set_zlabel('z axis')
    plt.title('3D')
    fig.colorbar(surf,shrink=0.5,aspect=5)

     

     

    이번엔 (30,60)으로 변경해서 보겠습니다.

    import matplotlib.pyplot as plt
    from mpl_toolkits.mplot3d import Axes3D
    fig = plt.figure(figsize=(10,6))
    ax = fig.gca(projection='3d')
    surf = ax.plot_surface(x,y,z,rstride=2,cstride=2,cmap=plt.cm.coolwarm,linewidth=0.5,antialiased=True)
    ax.view_init(30,60)   #각 변경
    ax.set_xlabel('x axis')
    ax.set_ylabel('y axis')
    ax.set_zlabel('z axis')
    plt.title('3D')
    fig.colorbar(surf,shrink=0.5,aspect=5)

    x,y축이 60도만큼 회전하였고 30도만큼 높낮이가 바뀌었습니다.

     

    확실한 비교를 위해 elve=0 으로 놓겠습니다.

    import matplotlib.pyplot as plt
    from mpl_toolkits.mplot3d import Axes3D
    fig = plt.figure(figsize=(10,6))
    ax = fig.gca(projection='3d')
    surf = ax.plot_surface(x,y,z,rstride=2,cstride=2,cmap=plt.cm.coolwarm,linewidth=0.5,antialiased=True)
    ax.view_init(0,60)
    ax.set_xlabel('x axis')
    ax.set_ylabel('y axis')
    ax.set_zlabel('z axis')
    plt.title('3D')
    fig.colorbar(surf,shrink=0.5,aspect=5)

     

    높낮이가 낮아져서 옆면을 보는것처럼 바뀌게 되었습니다. azim=0 으로 놓으면 완벽하게 옆면만 보게 됩니다.

     

    import matplotlib.pyplot as plt
    from mpl_toolkits.mplot3d import Axes3D
    fig = plt.figure(figsize=(10,6))
    ax = fig.gca(projection='3d')
    surf = ax.plot_surface(x,y,z,rstride=2,cstride=2,cmap=plt.cm.coolwarm,linewidth=0.5,antialiased=True)
    ax.view_init(0,0)
    ax.set_xlabel('x axis')
    ax.set_ylabel('y axis')
    ax.set_zlabel('z axis')
    plt.title('3D')
    fig.colorbar(surf,shrink=0.5,aspect=5)

    matplotlib가 정적이지만 다른 면들을 볼 수 있는 기능은 있어서 내가 원하는 면을 볼 수는 있습니다.

    하지만 동적인 모듈이면 한번에 모든 면을 볼 수 있을텐데 그러지 못해서 개인적으로 약간 아쉬움이 있네요.

     

    Axes3D에 대해 더 많이 알고 싶으면 관련 포스팅란에 Axes3D 가이드 사이트 링크에 들어가셔서 참고하면 좋을 것 같습니다.

     

    관련 포스팅

    [Python/matplotlib] - [matplotlib] 3D plot

    Axes3D 가이드 사이트

     

    댓글

    Designed by JB FACTORY

    ....