>  기사  >  백엔드 개발  >  Pandas 및 Matplotlib를 사용하여 Python에서 클러스터형 누적 막대 그래프를 어떻게 만들 수 있나요?

Pandas 및 Matplotlib를 사용하여 Python에서 클러스터형 누적 막대 그래프를 어떻게 만들 수 있나요?

Patricia Arquette
Patricia Arquette원래의
2024-11-02 15:26:29314검색

How can I create clustered stacked bar plots in Python using Pandas and Matplotlib?

Pandas 및 Matplotlib를 사용하여 군집 누적 막대 그래프 생성

이 기사에서는 Pandas를 사용하여 군집 누적 막대 그래프를 생성하는 방법을 살펴보겠습니다. 그리고 맷플롯립. 이 기술을 사용하면 막대가 서로 쌓인 상태로 동일한 열과 인덱스가 있는 여러 데이터세트를 나란히 시각화할 수 있습니다.

문제 이해

다음 사항을 고려하세요. 시나리오: 세 개의 데이터 프레임이 있으며 각 프레임에는 동일한 인덱스를 가진 "I" 및 "J" 열의 값이 포함되어 있습니다. 각 데이터 프레임에 대한 누적 막대 그래프를 생성하고 싶지만 특정 방식으로 정렬하려고 합니다.

  • 인덱스 A에 있는 데이터 프레임 1에 대한 막대
  • 인덱스 A에 있는 데이터 프레임 2에 대한 막대
  • 인덱스 B의 데이터 프레임 1에 대한 막대
  • 인덱스 B의 데이터 프레임 2에 대한 막대

솔루션 구현

다음 코드 조각 이 문제에 대한 효율적인 솔루션을 보여줍니다.

<code class="python">import pandas as pd
import matplotlib.cm as cm
import numpy as np
import matplotlib.pyplot as plt

def plot_clustered_stacked(dfall, labels=None, title="multiple stacked bar plot",  H="/", **kwargs):
    """Given a list of dataframes, with identical columns and index, create a clustered stacked bar plot.
    labels is a list of the names of the dataframe, used for the legend
    title is a string for the title of the plot
    H is the hatch used for identification of the different dataframe"""

    n_df = len(dfall)
    n_col = len(dfall[0].columns) 
    n_ind = len(dfall[0].index)
    axe = plt.subplot(111)

    for df in dfall : # for each data frame
        axe = df.plot(kind="bar",
                      linewidth=0,
                      stacked=True,
                      ax=axe,
                      legend=False,
                      grid=False,
                      **kwargs)  # make bar plots

    h,l = axe.get_legend_handles_labels() # get the handles we want to modify
    for i in range(0, n_df * n_col, n_col): # len(h) = n_col * n_df
        for j, pa in enumerate(h[i:i+n_col]):
            for rect in pa.patches: # for each index
                rect.set_x(rect.get_x() + 1 / float(n_df + 1) * i / float(n_col))
                rect.set_hatch(H * int(i / n_col)) #edited part     
                rect.set_width(1 / float(n_df + 1))

    axe.set_xticks((np.arange(0, 2 * n_ind, 2) + 1 / float(n_df + 1)) / 2.)
    axe.set_xticklabels(df.index, rotation = 0)
    axe.set_title(title)

    # Add invisible data to add another legend
    n=[]
    for i in range(n_df):
        n.append(axe.bar(0, 0, color="gray", hatch=H * i))

    l1 = axe.legend(h[:n_col], l[:n_col], loc=[1.01, 0.5])
    if labels is not None:
        l2 = plt.legend(n, labels, loc=[1.01, 0.1]) 
    axe.add_artist(l1)
    return axe

# create fake dataframes
df1 = pd.DataFrame(np.random.rand(4, 5),
                   index=["A", "B", "C", "D"],
                   columns=["I", "J", "K", "L", "M"])
df2 = pd.DataFrame(np.random.rand(4, 5),
                   index=["A", "B", "C", "D"],
                   columns=["I", "J", "K", "L", "M"])
df3 = pd.DataFrame(np.random.rand(4, 5),
                   index=["A", "B", "C", "D"],
                   columns=["I", "J", "K", "L", "M"])

# Then, just call :
plot_clustered_stacked([df1, df2, df3],[“df1”, “df2”, “df3”])</code>

함수 사용

이 함수를 사용하려면 데이터 프레임 목록을 첫 번째 인수로 전달합니다. 다음 인수는 범례에 대한 레이블 목록이 될 수 있습니다. title 인수는 플롯의 제목을 지정합니다. 마지막으로 H는 각 데이터프레임을 구별하는 데 사용되는 해치 패턴을 나타냅니다.

출력

결과 플롯에는 각 데이터프레임에 대해 클러스터된 누적 막대가 나란히 정렬되어 표시됩니다. 각 인덱스의 막대는 서로 다른 데이터 프레임을 나타내는 서로 다른 해치와 함께 서로 쌓입니다.

추가 기능

색상 사용자 정의:

matplotlib 색상 맵의 인스턴스를 사용하는 플롯_clustered_stacked 함수에 cmap 인수를 전달하여 막대의 색상을 사용자 정의할 수 있습니다. 예는 다음과 같습니다.

<code class="python">plot_clustered_stacked([df1, df2, df3], ["df1", "df2", "df3"], cmap=plt.cm.viridis)</code>

결론

이 접근 방식은 Pandas 및 Matplotlib를 사용하여 군집 누적 막대 그래프를 생성하는 간단하고 효과적인 방법을 제공합니다. 여러 데이터 세트를 명확하고 유익한 방식으로 나란히 시각화할 수 있습니다. 해치 패턴과 색상을 조정하여 특정 요구 사항에 맞게 플롯을 추가로 사용자 정의할 수 있습니다.

위 내용은 Pandas 및 Matplotlib를 사용하여 Python에서 클러스터형 누적 막대 그래프를 어떻게 만들 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.