ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [plotly, Matplotlib] 파이썬으로 3차원 산점도 (3D Scatter Plot) 그려보기
    Python/시각화 2023. 8. 8. 09:54
    반응형

    파이썬으로 3차원 산점도 (3D Scatter Plot) 그려보기


    다변량 분석 (Multivariate analysis)를 하다보면 고차원 데이터를 표현해야 할 경우가 생깁니다. 고차원이라고 해 봤자, 우리가 볼 수 있는 차원은 3차원이 한계이므로 시각화를 할 때는 필연적으로 3차원 이하의 세계에서 표현할 수 있어야 한다는 제약이 생깁니다. 게다가, 컴퓨터 모니터나 인쇄물은 2차원이므로 실질적으로 표현 가능한 차원의 한계는 2차원이라고 해도 좋습니다. 시각화 분야에서는 2차원 이상의 고차원 데이터를 보여주는 방법으로는 아래 기술을 이용합니다.

     

     

    1. 2차원 데이터: x, y축을 가진 좌표계 위에 표시한다.
    2. 3차원 데이터: 3차원 좌표계를 2차원에 투사해 표시한다.
    3. 4차원 데이터: 3차원 데이터 시각화에 더해, 그라데이션을 통해 하나의 요소를 추가로 보여준다.

     

     

    이외에도 다양한 방법이 있지만, 우리가 흔히 사용하는 방법은 이정도입니다. 물론 복잡한 그래프의 경우 고차원을 표시할 수 있도록 특별히 고안된 것이 있지만, 그정도 그래프가 필요한 경우라면 전문서적을 읽고 있을테니 논외로 합시다.

     

     

    플로틀리로 3D 산점도 그려보기


    파이썬(Python)에서는 그래프를 그리는 시각화 패키지가 몇 있는데, 대부분 2차원 표현이 한계인 것들이 많습니다. 하지만, 그중에서 플로틀리(plotly)라는 시각화 패키지는 3차원 그래프를 기본 지원하고 있는데요, 파이썬으로 간단하게 3차원 그래프를 그리기 위해서는 이것만큼 쉬운 선택이 없습니다. 이번에는 3차원 산점도를 그려보는 과정을 코드로 보여드리겠습니다.

     

     

    이 코드는 plotly 공식 문서의 3D Scatter Plots in Python을 기반으로 작성했습니다.

     

     

    # 패키지 및 샘플 데이터 불러오기
    import plotly.express as px
    
    df = px.data.iris()
    
    # 그래프 그리기
    fig = px.scatter_3d(df, x='sepal_length', y='sepal_width', z='petal_width', color='species', width=640, height=480)
    fig.show()

     

     

    플로틀리에서 3D scatter plot은 px.scatter_3d 라는 함수를 이용합니다. 이외에도 기본 지원하는 3D 그래프는 line_3d 함수가 있으니 참고해 주시기 바랍니다. 다시 3D 산점도 이야기로 돌아와서 보면, 2차원 산점도와 거의 동일하지만 z축을 추가로 입력받는다는 점이 차이가 나는데요, 덕분에 3차원 그래프를 이리저리 돌려가면서 볼 수 있는 그래프가 출력되었습니다.

     

     

    맷플롯립으로 3D 산점도 그려보기


    만약 파이썬 시각화 도구로 plotly 대신 맷플롯립(Matplotlib)을 사용할 경우, mpl_toolkits이라는 패키지의 도움을 받아 3D 산점도를 그릴 수 있습니다. 코드가 조금 더 길어지지만 그리 어렵지는 않은데요, 위의 그래프를 그린 자료를 이용해서 똑같은 그래프를 그려보겠습니다. 이 때는, 일반적인 scatterplot 작성과 달리 축 이름이 xs, ys, zs로 바뀐다는 점에 유의해 주시기 바랍니다.

     

     

    이 코드는 맷플롯립의 3D scatterplot 문서를 참고해 작성했습니다.

     

     

    # 패키지 불러오기
    import matplotlib.pyplot as plt
    from mpl_toolkits.mplot3d import Axes3D
    
    # 3D 그래프 공간 설정
    fig = plt.figure()
    ax = Axes3D(fig)
    fig.add_axes(ax)
    
    # 그래프 그리기
    ax.scatter(data=df, xs='sepal_length', ys='sepal_width', zs='petal_width', c='species_id')
    plt.show()

    반응형

    댓글

문의: jwkang3929@naver.com