在数据可视化中,堆积柱状图(Stacked Bar Chart)是一种常用的图表类型,它不仅能展示每个类别的总量,还能细分显示各组成部分的数量。今天的更新将详细介绍堆积柱状图的概念、优势及其与传统柱状图的差异。我们会通过Python代码展示如何绘制堆积柱状图,并详细讲解每步代码。什么是堆积柱状图?
堆积柱状图是一种柱状图,其特点在于每根柱子被划分成多个部分,每个部分代表不同的数据类别。不同颜色的部分堆叠在一起,展示了每个类别在整体中所占的比例。堆积柱状图适用于展示多个类别的细分数据,同时也能展示每个类别的总和。优势
- 信息丰富:相比于传统柱状图,堆积柱状图可以同时展示多个子类别的详细信息。
- 比较方便:能直观比较每个主类别的整体数值和子类别的分布情况。
- 紧凑布局:在一个图表中展示更多信息而不会占用太多空间。
堆积柱状图与传统柱状图的差异
- 展示维度:传统柱状图通常展示单一变量,而堆积柱状图可以展示多个变量。
- 比较方式:在堆积柱状图中可以直接比较各部分的相对比例,而传统柱状图需要多个图来展示不同类别。
- 解读难度:当子类别数量较多时,堆积柱状图的解读难度可能会增加。
绘图难点
- 颜色选择:由于堆积柱状图包含多个子类别,需选择区分度高的配色方案。
使用Python绘制堆积柱状图
下面是使用Python的Matplotlib
和Pandas
库绘制堆积柱状图的详细步骤。我们将以一个虚拟的季度销售数据集为例,展示不同产品在每个季度的销售额。步骤1:导入所需库
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
步骤2:创建数据集
我们创建一个季度销售数据集,包含三个产品类别的销售数据。# 创建虚拟数据
data = {
'Quarter': ['Q1', 'Q2', 'Q3', 'Q4'],
'Product_A': [150, 200, 300, 250],
'Product_B': [180, 210, 320, 220],
'Product_C': [100, 130, 250, 280]
}
df = pd.DataFrame(data)
步骤3:设置颜色和图形样式
选择区分度高的颜色,以便在堆积图中清晰地展示各类别。# 设置图表颜色
colors = ['#FFA07A', '#20B2AA', '#778899'] # 产品A, B, C的颜色
步骤4:绘制堆积柱状图
我们使用plt.bar()
函数依次绘制每个产品类别,并将其堆叠在上一层的基础上。# 设置图表大小
plt.figure(figsize=(10, 6))
# 计算各类别的底部位置
bar_width = 0.6 # 设置柱宽
bottoms = np.zeros(len(df)) # 初始化底部位置为0
# 循环绘制每个产品的柱状图,并设置为堆叠
for idx, product in enumerate(['Product_A', 'Product_B', 'Product_C']):
plt.bar(df['Quarter'], df[product], bottom=bottoms, color=colors[idx], label=product, width=bar_width)
bottoms += df[product] # 更新底部位置
# 添加图例和标签
plt.xlabel('Quarter')
plt.ylabel('Sales')
plt.title('Quarterly Sales by Product Category')
plt.legend(title='Product Category')
plt.show()
步骤5:添加数据标签
在堆积柱状图上方添加数据标签,让读者更直观地看到每个子类别的数值。# 在堆积柱状图上添加数据标签
bottoms = np.zeros(len(df)) # 重置底部位置
for idx, product in enumerate(['Product_A', 'Product_B', 'Product_C']):
for i, value in enumerate(df[product]):
plt.text(x=i, y=bottoms[i] + value / 2, s=f'{value}', ha='center', color='white', weight='bold')
bottoms += df[product]
步骤6:最终代码
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 创建虚拟数据
data = {
'Quarter': ['Q1', 'Q2', 'Q3', 'Q4'],
'Product_A': [150, 200, 300, 250],
'Product_B': [180, 210, 320, 220],
'Product_C': [100, 130, 250, 280]
}
df = pd.DataFrame(data)
# 设置颜色
colors = ['#FFA07A', '#20B2AA', '#778899']
# 绘制堆积柱状图
plt.figure(figsize=(10, 6))
bar_width = 0.6
bottoms = np.zeros(len(df))
for idx, product in enumerate(['Product_A', 'Product_B', 'Product_C']):
plt.bar(df['Quarter'], df[product], bottom=bottoms, color=colors[idx], label=product, width=bar_width)
bottoms += df[product]
# 添加数据标签
bottoms = np.zeros(len(df))
for idx, product in enumerate(['Product_A', 'Product_B', 'Product_C']):
for i, value in enumerate(df[product]):
plt.text(x=i, y=bottoms[i] + value / 2, s=f'{value}', ha='center', color='white', weight='bold')
bottoms += df[product]
# 添加图例和标题
plt.xlabel('Quarter')
plt.ylabel('Sales')
plt.title('Quarterly Sales by Product Category')
plt.legend(title='Product Category')
plt.show()
总结
通过本教程,我们了解了如何使用Python绘制堆积柱状图,讨论了其优势及绘图难点。堆积柱状图是展示多个子类别数据的一种有效方式,适用于各类数据分析场景。希望本教程能帮助你在项目中轻松地使用堆积柱状图展示数据。