본문 바로가기
공부 목록/IT & 프로그래밍

[Python] 하나의 창에 두 개의 축과 두 종류의 그래프 그리기

by 독학박사 2023. 8. 18.

목차


     지난번에 두 개의 축을 그리기 위해 plt.twinx() 함수를 사용하는 방법에 설명을 드린 적이 있습니다. 그때는 plt.plot() 함수로 직선만 그렸지만 다른 함수를 사용하면 다른 종류의 그래프도 넣을 수 있습니다. 두 종류의 그래프 그리는 방식은 여러 가지가 있지만 이번에는 두 가지 방식에 대해 정리해 보겠습니다. 이해가 쉽고 본인한테 맞는 방법을 선택해 사용하세요

     

    두 종류의 그래프 한번에 그리기
    두 종류의 그래프 한번에 그리기

     

     

    1. 이중 축에 두 종류 그래프 그리기 기본 방법 (객체 선언 방식)

     우선 코드와 결과를 보고 나서 상세한 설명을 하도록 하겠습니다.

     

    import matplotlib.pyplot as plt
    import numpy as np
    
    # 데이터 생성
    x = np.array([1, 2, 3, 4, 5])
    y1 = np.array([3, 8, 4, 6, 7])
    y2 = np.array([10, 5, 8, 12, 6])
    
    # 그래프 그리기
    fig, ax1 = plt.subplots(figsize=(8, 6))
    
    # 직선 그래프
    ax1.plot(x, y1, label='Line Graph', color='blue', marker='o')
    ax1.set_xlabel('X')
    ax1.set_ylabel('Line Data')
    ax1.set_title('Line Graph and Bar Graph')
    ax1.legend(loc='upper left')
    
    # 막대 그래프 (두 번째 y축)
    ax2 = plt.gca().twinx()  # 현재 축의 x축을 공유한 새로운 y축 생성
    # ax2 = ax1.twinx() # 위의 줄의 코드대신 사용 가능
    ax2.bar(x, y2, alpha=0.5, label='Bar Graph', color='green')
    ax2.set_ylabel('Bar Data', color='green')
    ax2.legend(loc='upper right')
    
    plt.show()

     

     데이터에는 y1, y2 두 종류로 만들었으며 x는 하나의 세트만 준비했습니다. 직선 그래프가 있는 곳까지는 일반적인 객체를 이용한 방식의 코드입니다. 

     

     ax2축을 생성할 때 plt.gca().twinx()를 사용하여 처음 그려진 ax1의 축을 가져오게 합니다. 이중 축을 그리는 방법에서는 ax1.twinx() 함수를 사용할 수도 있습니다. 이는 ax1이 이미 객체로 선언됐지 때문에 가능한 것입니다. 만일 처음 그래프를 ax1으로 정의하지 않고 plt.plot() 함수를 이용하여 바로 그렸다면 gca() 함수를 사용해야 이전 축을 가져올 수 있습니다.

     

    ax1과 ax2의 legend는 서로 겹치지 않게 왼쪽과 오른쪽에 각각 배치했습니다.

     

    두 종류의 그래프 출력 결과
    두 종류의 그래프 출력 결과

     

     

     

    2. 함수를 사용한 이중 축에 두 종류 그래프 그리기

     이제는 객체선언이 아니라 처음 그래프를 함수로 그렸을 때 두 번째 그래프를 그리는 방법에 대해 알아보겠습니다. 출력 결과는 위의 코드와 같기 때문에 코드만 보여드립니다.

     

    import matplotlib.pyplot as plt
    import numpy as np
    
    # 데이터 생성
    x = np.array([1, 2, 3, 4, 5])
    y1 = np.array([3, 8, 4, 6, 7])
    y2 = np.array([10, 5, 8, 12, 6])
    
    # 그래프 그리기
    plt.figure(figsize=(8, 6))
    
    # 직선 그래프
    plt.plot(x, y1, label='Line Graph', color='blue', marker='o')
    plt.xlabel('X')
    plt.ylabel('Line Data')
    plt.title('Line Graph and Bar Graph')
    plt.legend(loc='upper left')
    
    # 막대 그래프 (두 번째 y축)
    ax2 = plt.gca().twinx()  # 현재 축의 x축을 공유한 새로운 y축 생성
    ax2.bar(x, y2, alpha=0.5, label='Bar Graph', color='green')
    ax2.set_ylabel('Bar Data', color='green')
    ax2.legend(loc='upper right')
    
    plt.show()

     

     첫 번째 그래프(y1)은 plt.plot() 함수로 그렸습니다. 이때는 ax1이 존재하지 않기 때문에 ax1.twinx() 함수를 사용할 수가 없습니다. 이를 위해 plt.gca().twinx() 함수로 ax2에 전달했습니다. ax2는 객체 형태로 다뤄집니다.

     

     함수와 객체 방식의 주요 차이점은 매서드의 형태에 있습니다. xlabel과 같은 메서드를 함수 형태에서 사용할 경우에는 그냥 사용할 수 있지만 객체 형태에서는 'set_'을 붙여서 사용합니다.

     

     

    3. plt.gca() 란?

    plt.gca()는 "Get Current Axes"의 약어로, 현재 그림(figure)의 현재 축(axes) 객체를 반환하는 함수입니다. 이 함수를 사용하면 현재 그림에 대한 설정이나 그래프를 조작할 수 있습니다.

     

     Matplotlib은 그림(figure)과 축(axes)이라는 두 가지 중요한 개념을 사용합니다. 하나의 그림은 하나 이상의 축을 가질 수 있습니다. 축은 실제로 그래프나 플롯을 그리는 공간을 나타냅니다. plt.gca()를 사용하면 현재 활성화된 그림에 대한 현재 축 객체를 가져올 수 있습니다. 이를 통해 해당 축에 그래프를 추가하거나 축의 속성을 조작하게 되는 원리입니다.

     

     

    4. 마치며

     지금까지 matplotlib의 함수들을 이용하여 두 개 종류의 그래프를 그리는 방법에 대해 두 가지 방법으로 설명해 봤습니다. 하나의 창에 이중 축으로 나타나게 하는 twinx() 함수의 개념을 확인했으며 plt.gca()란 새로운 함수에 대해서도 알아봤습니다. 

     

     

     

    함수와 객체 사용에 대해 정리된 내용입니다.

    https://lifelong-education-dr-kim.tistory.com/entry/Matplotlib-모듈인-pyplot의-기본-함수-figure의-사용

     

    Matplotlib 모듈인 pyplot의 기본 함수 figure()의 사용

    파이썬으로 그래프를 그릴 때 기본적으로 사용하는 라이브러리로 matplotlib일 일반적입니다. plt.plot()이나, plot.scatter()와 같은 함수를 이용하여 그래프를 가시화하는데, 그전에 plt.figure()를 사용하

    lifelong-education-dr-kim.tistory.com

     

     

     twinx()를 사용한 이중 축에 관련된 내용입니다.

    https://lifelong-education-dr-kim.tistory.com/entry/파이썬-matplotlib에서-그래프-이중-축-설정하기

     

    파이썬 matplotlib에서 그래프 이중 축 설정하기

    데이터 가시화를 하다 보면 두 개의 데이터 종류를 같이 나타내야 할 경우가 생깁니다. 하지만 데이터의 스케일이 너무도 크게 차이가 나면 작은 스케일의 데이터는 확인하기 어렵게 되는 문제

    lifelong-education-dr-kim.tistory.com

     

    댓글