如何基于Pandas数据绘制Top10供应商产品类别堆叠柱状图
解决Pandas供应商数据分析与堆叠柱状图可视化问题
嗨,针对你的需求,我整理了一套完整的实现步骤,结合你给出的示例数据,代码可以直接运行验证:
第一步:准备数据与导入依赖库
首先我们需要导入pandas和matplotlib.pyplot,并把你提供的示例数据构造成DataFrame:
import pandas as pd import matplotlib.pyplot as plt # 构造示例数据 data = [ ["VendorA", "ProdABC", "B"], ["VendorA", "ProdXYZ", "C"], ["VendorAB", "ProdCDC", "A"], ["VendorAB", "ProdDEF", "A"], ["VendorAB", "ProdKLM", "B"], ["VendorF", "ProdXYZ", "D"], ["VendorC", "ProdBSE", "C"], ["VendorF", "ProdFGH", "D"], ["VendorAB", "ProdMNO", "D"], ["VendorA", "ProdFGH", "D"], ["VendorV", "ProdCDC", "A"], ["VendorF", "ProdBSE", "C"] ] df = pd.DataFrame(data, columns=["Vendor", "Product", "Category"])
第二步:找出产品数量最多的前10位供应商
我们可以通过groupby按供应商分组,用size()统计每个组的产品数量,再按数量降序排序。如果你的实际数据里供应商不足10位,head(10)会自动取全部,不会有问题:
# 统计每个供应商的产品数量,并按降序排序 vendor_product_count = df.groupby("Vendor").size().sort_values(ascending=False) # 取前10位供应商的名称 top10_vendors = vendor_product_count.head(10).index # 筛选出Top10供应商的专属数据集 df_top10 = df[df["Vendor"].isin(top10_vendors)]
第三步:绘制堆叠柱状图展示类别细分
要实现堆叠柱状图,我们需要先把数据转换成供应商-类别的交叉统计表(每个单元格对应该供应商在对应类别下的产品数量),再用Matplotlib的堆叠绘制逻辑实现:
# 生成供应商×类别的交叉统计表格 category_pivot = pd.crosstab(df_top10["Vendor"], df_top10["Category"]) # 设置画布大小,让图表更清晰 plt.figure(figsize=(12, 6)) # 初始化底部位置变量,用于实现柱子堆叠 bottom = pd.Series([0]*len(category_pivot.index), index=category_pivot.index) # 遍历每个类别,依次绘制堆叠的柱状图部分 for category in category_pivot.columns: plt.bar(category_pivot.index, category_pivot[category], bottom=bottom, label=category) bottom += category_pivot[category] # 添加图表必要元素,提升可读性 plt.title("Top10供应商产品数量及类别分布", fontsize=14) plt.xlabel("供应商", fontsize=12) plt.ylabel("产品总数", fontsize=12) plt.xticks(rotation=45, ha="right") # 旋转x轴标签,避免名称重叠 plt.legend(title="产品类别") plt.tight_layout() # 自动调整布局,防止标签被截断 # 展示图表 plt.show()
额外提示
- 如果你的实际数据中存在重复的
Vendor+Product组合(比如同一个供应商的同一个产品被多次记录),可以先执行df = df.drop_duplicates(subset=["Vendor", "Product"])去重后再统计,避免重复计数。 - 堆叠柱状图的每个颜色代表一个产品类别,柱子的总高度就是该供应商的产品总数,能直观对比Top10供应商的总规模和类别分布差异。
内容的提问来源于stack exchange,提问作者harry04
相关产品推荐
相关产品推荐

