需求:
假设某店铺的商品销量分为 线上销量 和 线下销量:
使用 叠加柱状图 分别显示线上和线下销量。
在柱状图中添加每种商品的总销量。
图表美观,包含图例、网格、颜色区分等。
代码实现:
import matplotlib.pyplot as plt
import numpy as np
class AdvancedSalesBarChart:
def __init__(self, products, online_sales, offline_sales):
"""
初始化商品名称和销量数据
:param products: 商品名称列表
:param online_sales: 线上销量列表
:param offline_sales: 线下销量列表
"""
self.products = products
self.online_sales = online_sales
self.offline_sales = offline_sales
def plot_stacked_bar_chart(self):
"""
绘制叠加柱状图
"""
# X轴位置
x = np.arange(len(self.products))
# 计算总销量
total_sales = [online + offline for online, offline in zip(self.online_sales, self.offline_sales)]
# 创建叠加柱状图
plt.figure(figsize=(10, 6))
bar_width = 0.6 # 柱宽
# 绘制线上销量
plt.bar(x, self.online_sales, color='skyblue', width=bar_width, label='Online Sales')
# 绘制线下销量,并叠加在线上销量上
plt.bar(x, self.offline_sales, color='orange', width=bar_width, bottom=self.online_sales, label='Offline Sales')
# 添加总销量标签
for i, total in enumerate(total_sales):
plt.text(i, total + 5, f'{total}', ha='center', fontsize=10, color='black')
# 设置X轴标签和标题
plt.xticks(ticks=x, labels=self.products, fontsize=12)
plt.title('Stacked Bar Chart of Product Sales', fontsize=16)
plt.xlabel('Products', fontsize=12)
plt.ylabel('Sales', fontsize=12)
# 添加网格线
plt.grid(axis='y', linestyle='--', alpha=0.7)
# 添加图例
plt.legend(fontsize=10)
# 调整布局并显示图表
plt.tight_layout()
plt.show()
if __name__ == "__main__":
# 商品名称
products = ['Apple', 'Banana', 'Orange', 'Grape', 'Watermelon']
# 线上和线下销量数据
online_sales = [150, 200, 250, 180, 300]
offline_sales = [120, 100, 150, 80, 170]
# 创建图表对象并绘制图表
chart = AdvancedSalesBarChart(products, online_sales, offline_sales)
chart.plot_stacked_bar_chart()
代码说明
数据分组:
将商品销量划分为 线上销量 和 线下销量,通过叠加柱状图分别展示两类数据。
叠加柱状图:
plt.bar() 的 bottom 参数指定了另一组柱状图的基底,实现叠加显示。
总销量标签:
使用 plt.text() 在柱子顶部显示每种商品的总销量。
美化细节:
添加了图例(区分线上和线下销量)。
设置了网格线,使图表更易阅读。
合理的间距和字体大小,使图表更美观。
数据扩展性:
products、online_sales 和 offline_sales 是可定制的数据,支持扩展到更多商品。
运行效果: