如何使用 Pandas 和 Matplotlib 在 Python 中建立聚類堆疊長條圖?

Patricia Arquette
發布: 2024-11-02 15:26:29
原創
368 人瀏覽過

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

使用Pandas 和Matplotlib 建立聚類堆疊條形圖

在本文中,我們將探索一種使用Pandas 建立聚類堆疊長條圖的方法和Matplotlib。透過此技術,您可以視覺化並排具有相同列和索引的多個資料集,條形堆疊在一起。

理解問題

考慮以下內容場景:您有三個資料框,每個資料框都包含具有相同索引的「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 參數傳遞給plot_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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!