ホームページ  >  記事  >  バックエンド開発  >  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 を使用してクラスター積み上げ棒グラフを作成する方法を検討します。そしてMatplotlib。この手法を使用すると、同一の列とインデックスを持つ複数のデータセットを横に並べてバーを積み重ねて視覚化できます。

問題の理解

次の点を考慮してください。シナリオ: 3 つのデータフレームがあり、それぞれに同じインデックスを持つ列 "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 は各データフレームを区別するために使用されるハッチング パターンを表します。

出力

結果のプロットには、各データフレームのクラスター化された積み上げ棒が並べて表示されます。各インデックスのバーは互いに積み重ねられ、異なるハッチングが異なるデータフレームを示します。

追加機能

色のカスタマイズ:

cmap 引数を関数 Lot_clustered_stacked に渡すことで、バーの色をカスタマイズできます。この関数は、matplotlib カラーマップのインスタンスを受け取ります。以下に例を示します。

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

結論

このアプローチは、Pandas と Matplotlib を使用してクラスター化された積み上げ棒グラフを作成するためのシンプルで効果的な方法を提供します。これにより、複数のデータセットを並べて明確かつ有益な方法で視覚化できます。ハッチング パターンと色を調整することで、特定の要件に合わせてプロットをさらにカスタマイズできます。

以上がPandas と Matplotlib を使用して Python でクラスター化された積み上げ棒グラフを作成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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