使用 Pandas 和 Matplotlib 创建聚类堆叠条形图
在本文中,我们将探索一种使用 Pandas 创建聚类堆叠条形图的方法和 Matplotlib。通过此技术,您可以可视化并排具有相同列和索引的多个数据集,条形堆叠在一起。
理解问题
考虑以下内容场景:您有三个数据框,每个数据框都包含具有相同索引的“I”和“J”列的值。您想要为每个数据帧创建堆叠条形图,但以特定方式排列:
实现解决方案
以下代码片段演示了此问题的有效解决方案:
<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中文网其他相关文章!