ホームページ  >  記事  >  バックエンド開発  >  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 の barplot 関数を使用すると、積み上げ棒グラフを作成できますが、異なるデータフレームの棒をネイティブに積み上げることはできません。これを解決するには、次の回避策を使用できます。

  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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。