[matplotlib] 3D plot

반응형
    반응형

    matplotlib를 이용해 3D 그래프를 그려보겠습니다.

    분야에 따라서 많이 쓰이는 곳도 있고 아닌 곳도 있지만 여러모로 유용하게 쓸 수 있는 툴입니다. 

    더 좋은 모듈이 있지만 파이썬의 기본 모듈로 그릴 수 있는 것도 좋을 것 같아서 공유의 의미로 포스팅을 할까 합니다.

     

    3차원 그래프를 그리는 것이니 3차원 좌표가 필요합니다.

    3차원 좌표를 바로 만들어서 할 수도 있고

    함수에 의해 데이터가 이루어진다면 $ z = f(x,y) $ 으로 여기고 그에 맞게 데이터를 맞춰주면 됩니다. 

     

    함수에 의해 움직이는 데이터를 가지고 해보겠습니다.

    import numpy as np
    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 = f(x,y) $  만들어야 하는데 (x,y)의 좌표로써 z를 움직여야 하므로 meshgrid를 이용해 좌표를 

    만들었습니다.

    meshgrid 없이 z를 정의 하면 z가 1차원 배열로 이루어져 3D 그래프를 만들 때 오류가 발생합니다.

    항상 z자리는 2차원 배열로 이루어지게 해주어야 정상적으로 작동하니 주의해주셔야겠습니다.

     

    이제 그래프를 그려봅시다.

    이번엔 3D 그래프를 그리기로 해서 Axes3D 라는 모듈을 씁니다.  

     

    그래프를 그리기 위해 fig를 만들고 축을 세우고 그 축 위에 그리면 되는데요.

    gca()를 활용해서 축을 2D로 할건지 3D로 할건지 정합니다.

    3D를 쓸거니 fig.gca(projection='3d') 로 씁니다. 

    그리고 plot_surface 로 그립니다. 

    필수적인 건 아니지만 라벨과 colorbar도 넣겠습니다.

    gca() 는 편의상 ax라 하고 plot_surface는 surf라 하겠습니다.

    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.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의 동작방식을 이해하면 좋은데요.

    matplotlib는 프레임 위에 축 위에 그래프를 그리는 방식입니다.

    그래서 프레임(fig)을 제일 먼저 만들고 축(ax), 그리고 그래프(surf) 순서로 채우게 됩니다.

    2차원 그래프에서는 단순한 구조라서 따로 표기를 하지 않아도 무엇을 의미하는지 다 알아서 넘어갔지만 3차원에서는 보다 복잡한 구조라 순서대로 입력을 해줘야 오류가 안 생깁니다.

     

    또한, 부가적인 부분(라벨, colorbar, title)을 어디에 그리는 것을 명시해주어야 합니다.

    라벨을 붙일 때 축에다 붙여야 하니 ax.set_xlabel로 쓰게 되는 것이고 colorbar는 그래프 밖에 있어야 하니 fig.colorbar로 넣습니다. 

    title을 붙일 때는 fig 전체에 대한 title이니 plt.title이 됩니다.

     

     

    plot_surface의 파라미터를 설명하고 마치겠습니다.

    • x,y,z : 데이터값
    • rstride : 행 배열 스텝 사이즈
    • cstride : 열 배열 스텝 사이즈
    • color : surface pathes 의 색깔
    • cmap : surface pathes의 color map
    • norm : Normalize
    • vmin : 최소값
    • vmax : 최대값
    • antialiased : 위신호 제거(높은 해상도의 신호를 낮은 해상도에서 나타낼때 생기는 계단현상)

     

     

    관련 포스팅

    [Python/Numpy] - [Numpy]격자 그리드 만들기(meshgrid)

    [Python/Numpy] - ndarray 데이터로 그래프 그리기(matplotlib)

    댓글

    Designed by JB FACTORY

    ....