차밍이

[Python] Plotly 누적 그룹 막대 그래프 그리기 - Stack and Group Bar Chart 본문

파이썬/데이터 시각화

[Python] Plotly 누적 그룹 막대 그래프 그리기 - Stack and Group Bar Chart

2023. 1. 27. 05:00
반응형

목차

    Plotly를 사용해서 간단한 누적 막대 그래프와 그룹 막대 그래프를 그리는 것에 대해서는 이전 게시글을 확인해주세요.

     

    [Python] Plotly 그래프 사용법 - Bar Plot

    목차 Plotly 그래프 중 Bar Graph 그리는 방법에 대해 소개하겠습니다. express와 graph_objects 두 가지 방식을 모두 알아보겠습니다. 두 개의 차이가 궁금하다면 아래 글을 참고 해주세요. [Plotly] express와

    chancoding.tistory.com

     

    이번 게시글에서는 그룹화된 누적 막대그래프를 그리는 방법에 대해서 알아보겠습니다.

    엑셀로도 해보려고 했는데 잘되지 않아서 Python Plotly를 통해서 그냥 구현하는게 빠르겠다 싶어서 알아보았습니다.

     

    1단계 : 기본 데이터 생성

    그래프를 그리기 위한 예시 데이터를 생성하겠습니다.

    A지역의 데이터가 더 크고 B지역B-1지역B-2지역 두 개로 나뉘어있다고 가정해서 데이터를 만들었습니다.

    import pandas as pd
    import numpy as np
    import plotly.graph_objects as go
    
    data = np.random.randint(0,100,size=(10,3)) + np.array([80,0,0])
    df = pd.DataFrame(data, columns=['A지역', 'B-1지역', 'B-2지역'])
    df

    랜덤한 값이므로 다른 값이 나올 수 있습니다~

    사용할 데이터 테이블

     

    2단계 : Simple Bar Chart

    우선 간단한 기본 바 그래프를 그려보면 다음과 같습니다.

    기존에 BarChart를 그리는 방법에 대해서 설명할 때 아래와 같이 add_trace를 통해서 go.Bar 객체를 추가하였었습니다.

    fig = go.Figure()
    
    for col in df.columns:
        fig.add_trace(
            go.Bar(x=df.index, y=df[col], name=col)
        )
    
    fig.show()

    Plotly Grouped Bar Graph

    이번에는 기존과 다르게 Figure객체를 생성할 때 바로 데이터를 추가하는 방식으로 진행해보겠습니다.

    fig = go.Figure(
        data=[
            go.Bar(x=df.index, y=df['A지역'], name='A지역'),
            go.Bar(x=df.index, y=df['B-1지역'], name='B-1지역'),
            go.Bar(x=df.index, y=df['B-2지역'], name='B-2지역'),
        ]
    )
    
    fig.show()

    그래프 결과는 위와 동일한 결과를 확인할 수 있습니다.
    단순히 이렇게만 그려도 Group화 된 막대그래프를 그릴 수 있습니다.
    하지만, 우리가 원하는 것은 B-1과 B-2를 같은 그룹으로 묶어서 쌓아 올리는 것입니다.
    우선 같은 그룹으로 묶는 방법에 대해서 알아보겠습니다.

     

    3단계 : offsetgroup 설정하기

    go.Bar에서 offsetgroup이라는 옵션을 사용할 수 있습니다.

    이 값을 사용해서 Bar 그래프를 그룹화할 수 있습니다.

    fig = go.Figure(
        data=[
            go.Bar(x=df.index, y=df['A지역'], name='A지역', offsetgroup=0),
            go.Bar(x=df.index, y=df['B-1지역'], name='B-1지역', offsetgroup=1),
            go.Bar(x=df.index, y=df['B-2지역'], name='B-2지역', offsetgroup=1),
        ]
    )
    
    fig.show()

    plotly offsetgroup bar chart

    하지만 여기에 문제가 있습니다.

    B-2 지역 데이터를 추가한 결과를 통해 비교해 보겠습니다.

    offsetgroup값이 동일한 두 개의 막대그래프가 겹쳐집니다.

    둘 다 0부터 시작하니까 두 값을 합한 값의 높이를 확인할 수 없는 것이지요..ㅠ

     

    4단계 : base 설정하기

    3단계의 문제를 해결하기 위해서는 두 번째 B-2지역의 Bar 시작지점이 B-1 offsetgroup 막대그래프 끝 지점에서 부터 시작해야 합니다.

    그래서 Base라는 옵션을 통해서 시작 지점을 어디서부터 할 것인지 기본 값을 넣어줄 수 있습니다.

    fig = go.Figure(
        data=[
            go.Bar(x=df.index, y=df['A지역'], name='A지역', offsetgroup=0),
            go.Bar(x=df.index, y=df['B-1지역'], name='B-1지역', offsetgroup=1),
            go.Bar(x=df.index, y=df['B-2지역'], name='B-2지역', offsetgroup=1, base=df['B-1지역']),
        ]
    )
    
    fig.show()

    grouped and stacked bar graph using Plotly

    이렇게 하면 아래와 같이 B-1 지역의 값이 끝나는 막대 위에서 부터 B-2 막대가 시작하는 것을 확인할 수 있습니다.

    지금까지 Plotly를 사용한 그룹화된 누적 Bar Chart를 만들 수 있습니다.

    반응형

    관련된 글 보기

    Comments