首页  >  文章  >  后端开发  >  如何使用 Pandas 和 Matplotlib 或 Seaborn 创建聚类堆积条形图?

如何使用 Pandas 和 Matplotlib 或 Seaborn 创建聚类堆积条形图?

Susan Sarandon
Susan Sarandon原创
2024-11-02 11:56:02552浏览

How to create clustered stacked bar plots using Pandas and Matplotlib or Seaborn?

创建聚类堆叠条形图

问题:

考虑两个数据帧 df1 和 df2,它们具有相同的索引,但可能具有不同的列,其中每个数据帧行代表一个类别,每列代表一个指标。目标是创建聚类堆叠条形图,其中每个类别的条形图分组在一起,每个数据帧的条形图彼此堆叠。

使用 Pandas 和 Matplotlib 的解决方案:

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

def plot_clustered_stacked(df_list, labels=None, title="Clustered Stacked Bar Plot"):
    n_dataframes = len(df_list)
    n_columns = len(df_list[0].columns) 
    n_index = len(df_list[0].index)
    
    fig, ax = plt.subplots()

    # Iterate through each dataframe
    for i, df in enumerate(df_list):
        # Plot the bars for the current dataframe
        df.plot(kind="bar", 
                 ax=ax, 
                 linewidth=0,
                 stacked=True,
                 legend=False, 
                 grid=False)

    # Adjust the position and width of the bars
    for df, j in zip(df_list, range(n_dataframes)):
        for n, rect in enumerate(ax.patches):
            if rect.get_y() == 0:
                # Stacked bar for dataframe df
                rect.set_x(rect.get_x() + j / float(n_dataframes))
                rect.set_width(1 / float(n_dataframes))

    # Set the x-axis labels and ticks
    ax.set_xticks(np.arange(0, n_index) + 0.5)
    ax.set_xticklabels(df.index)

    # Add a legend for the dataframes
    plt.legend([df.stack(level=0).index[0] for df in df_list], labels)

    # Set the plot title
    ax.set_title(title)

# Create example dataframes
df1 = pd.DataFrame(np.random.rand(4, 3), index=["A", "B", "C", "D"], columns=["x", "y", "z"])
df2 = pd.DataFrame(np.random.rand(4, 3), index=["A", "B", "C", "D"], columns=["x", "y", "z"])

# Plot the clustered stacked bar plot
plot_clustered_stacked([df1, df2], labels=["df1", "df2"])</code>

使用 Seaborn 和 Pandas 的解决方案:

<code class="python">import seaborn as sns

# Concatenate the dataframes into a single dataframe with a wide format
df = pd.concat([df1.reset_index().melt(id_vars=["index"]), 
                 df2.reset_index().melt(id_vars=["index"])])

# Plot the clustered stacked bar plot
g = sns.FacetGrid(data=df, col="variable", hue="index")
g.map_dataframe(sns.barplot, order=df["index"].unique())</code>

以上是如何使用 Pandas 和 Matplotlib 或 Seaborn 创建聚类堆积条形图?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn