>  기사  >  백엔드 개발  >  Python에서 여러 DataFrame에 대한 클러스터형 누적 막대 차트를 만드는 방법은 무엇입니까?

Python에서 여러 DataFrame에 대한 클러스터형 누적 막대 차트를 만드는 방법은 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-11-02 19:07:30259검색

How to Create Clustered Stacked Bar Charts for Multiple DataFrames in Python?

여러 데이터프레임에 대한 클러스터형 누적 막대 차트 생성

문제 설명

동일한 열과 인덱스가 있는 여러 데이터프레임을 처리할 때 다음을 수행하는 것이 바람직할 수 있습니다. 클러스터형 누적 막대 차트를 만들어 데이터를 시각화합니다. 각 데이터프레임에 대한 막대를 해당 인덱스별로 그룹화하여 별도로 쌓으려고 할 때 문제가 발생합니다.

Pandas 및 Matplotlib를 사용한 솔루션

Pandas와 Matplotlib의 조합을 사용하면 이를 달성할 수 있습니다. 막대 직사각형의 위치와 해칭 패턴을 수동으로 조정합니다. 자세한 솔루션은 다음과 같습니다.

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

def plot_clustered_stacked(dfall, labels=None, title="multiple stacked bar plot",  H="/" , **kwargs):

    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</code>

Seaborn을 사용한 솔루션

Seaborn의 막대 그래프 기능을 사용하면 누적 막대 차트를 만들 수 있지만 기본적으로 다양한 데이터 프레임에 대한 막대를 누적할 수는 없습니다. 이 문제를 극복하기 위해 다음 해결 방법을 사용할 수 있습니다.

  1. pd.melt()를 사용하여 데이터프레임을 "정돈된" 형식으로 변환합니다.
  2. 다음을 사용하여 각 막대의 누적 합계를 계산합니다. groupby 및 cumsum()을 사용하여 vcs라는 새 열을 만듭니다.
  3. 변수 그룹을 반복하고 sns.barplot()을 사용하여 누적 합계를 그립니다.
<code class="python">import seaborn as sns

# Convert dataframes to tidy format
dfall.set_index([&quot;Name&quot;, &quot;index&quot;, &quot;variable&quot;], inplace=1)
dfall[&quot;vcs&quot;] = dfall.groupby(level=[&quot;Name&quot;, &quot;index&quot;]).cumsum()
dfall.reset_index(inplace=True)

# Create color palette
c = [&quot;blue&quot;, &quot;purple&quot;, &quot;red&quot;, &quot;green&quot;, &quot;pink&quot;]

# Iterate through groups and plot stacked bars
for i, g in enumerate(dfall.groupby(&quot;variable&quot;)):
    ax = sns.barplot(data=g[1],
                    x=&quot;index&quot;,
                    y=&quot;vcs&quot;,</code>

위 내용은 Python에서 여러 DataFrame에 대한 클러스터형 누적 막대 차트를 만드는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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