• 题目:访问餐饮数据,实现以下可视化目标。(所有的数据都存在,不存在缺失值等)
  1. 使用柱状图表示某类菜品在不同时间销量对比(X轴表示不同时间点,要标明。Y轴代表销量,图片采用菜品类别作为Title,X轴和Y轴的label分别是“时间”和“销量”,时间以天为单位),图中添加参考线和图例,隐藏上方和右侧数轴。在一张图中显示3种菜品信息。
  2. 使用折线图表示某类菜品在不同时间的消费金额变化(X轴表示不同时间点,要标明。Y轴代表金额,图片采用菜品类别作为Title,X轴和Y轴的label分别是“时间”和“金额”,时间以天为单位),图中添加参考线和图例。使用4张子图分别显示4种菜品信息,四个子图共享Y轴坐标。
  3. 使用气泡图展示不同会员在所有统计时间段的针对某类菜品的消费金额,消费金额和气泡直径呈正比,金额越大,气泡直径要相对大一些,使用colormap配置颜色。
  4. 每一类菜品在统计时间内有总销量,使用环状饼图展示选择菜品类别中各种菜品的销量占总销量的不同比例。将最大销量菜品突出显示。
  • 代码
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False  # 设置中文显示
# 读入三个表,分别查看表的表头
data = pd.read_excel("./data/./餐饮综合案例数据.xlsx", sheet_name='订单详情表')
data2 = pd.read_excel("./data/./餐饮综合案例数据.xlsx", sheet_name='订单信息表')
data3 = pd.read_excel("./data/./餐饮综合案例数据.xlsx", sheet_name='菜品信息表')
print(data.head())
print(data2.head())
print(data3.head())
# 计算出会员每个菜品的总金额
data['金额'] = data['价格'] * data['数量']
# 将我们需要的字段的信息按照订单号合并并且提取出来
data_concat = pd.merge(data[['订单号', '菜品名称', '金额', '日期']], data2[['订单号', '会员名']], left_on='订单号', right_on='订单号', how='left')
print(data_concat.head())
data_concat2 = pd.merge(data_concat, data3, left_on='菜品名称', right_on='菜品名称', how='left')
print(data_concat2.head())

# 1.三个菜品的条形图
# 添加一个新列读取订单时间的日期
data['时间'] = data['日期'].dt.day
# 按日期,菜品类别对数据分组
detailGroup_1 = data[data['菜品名称'] == '爆炒猪肝'][['时间', '数量']].sort_values(['数量'], ascending=False).groupby(by=['时间'])
# 统计每天的销量和
groupagg_1 = detailGroup_1.sum()
detailGroup_2 = data[data['菜品名称'] == '番茄炖牛腩'][['时间', '数量']].sort_values(['数量'], ascending=False).groupby(by=['时间'])
groupagg_2 = detailGroup_2.sum()
detailGroup_3 = data[data['菜品名称'] == '广式虾仁肠粉'][['时间', '数量']].sort_values(['数量'], ascending=False).groupby(by=['时间'])
groupagg_3 = detailGroup_3.sum()
# 进行画图操作
fig = plt.figure(figsize=(20, 6))
# 设置ax是因为下面需要将图的上方和右侧的数轴隐藏对应ax.spines
ax = fig.add_subplot(111)
# 画三个变量的条形图
plt.bar(groupagg_1.index, groupagg_1['数量'], width=0.2)
plt.bar(groupagg_2.index + 0.2, groupagg_2['数量'], width=0.2)
plt.bar(groupagg_3.index + 0.4, groupagg_3['数量'], width=0.2)
# 设置x、y轴标签
plt.xlabel('时间/天')
plt.ylabel('销量/份')
# 设置x轴的刻度是1~31
plt.xticks(groupagg_1.index, groupagg_1.index)
# 设置图标题
plt.title('菜品柱状图')
# 设置图例
plt.legend(['爆炒猪肝', '番茄炖牛腩', '广式虾仁肠粉'], loc="upper right")
# 设置水平参考线
plt.axhline(3, ls='--', linewidth=1.0)
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
plt.show()

# 2.四类菜品折线图
data_concat2['时间'] = data_concat2['日期'].dt.day
detailGroup_1 = data_concat2[data_concat2['菜品类别'] == '肠粉类'][['时间', '价格']].sort_values(['时间'], ascending=False).groupby(by=['时间'])
groupagg_1 = detailGroup_1.sum()
# print("输出每天的销量和:\n", groupagg_1)
detailGroup_2 = data_concat2[data_concat2['菜品类别'] == '贝壳类'][['时间', '价格']].sort_values(['时间'], ascending=False).groupby(by=['时间'])
groupagg_2 = detailGroup_2.sum()
# print("输出每天的销量和:\n", groupagg_2)
detailGroup_3 = data_concat2[data_concat2['菜品类别'] == '糕点类'][['时间', '价格']].sort_values(['时间'], ascending=False).groupby(by=['时间'])
groupagg_3 = detailGroup_3.sum()
# print("输出每天的销量和:\n", groupagg_3)
detailGroup_4 = data_concat2[data_concat2['菜品类别'] == '根菜类'][['时间', '价格']].sort_values(['时间'], ascending=False).groupby(by=['时间'])
groupagg_4 = detailGroup_4.sum()
# print("输出每天的销量和:\n", groupagg_4)
# 设置画布大小
fig = plt.figure(figsize=(24, 8))
# 子图1
ax1 = fig.add_subplot(141)
# 画折线图
plt.plot(groupagg_1.index, groupagg_1['价格'], label='肠粉类')
plt.xlabel('时间/天')
plt.ylabel('金额/元')
plt.xticks(groupagg_1.index, groupagg_1.index)
plt.title('肠粉类')
# 加上这句话显示图例
plt.legend()
plt.axhline(68, ls='--', linewidth=1.0)
# 子图2
ax2 = fig.add_subplot(142)
plt.plot(groupagg_2.index, groupagg_2['价格'], label='贝壳类')
plt.xlabel('时间/天')
plt.ylabel('金额/元')
plt.xticks(groupagg_1.index, groupagg_1.index)
plt.title('贝壳类')
plt.legend()
plt.axhline(212, ls='--', linewidth=1.0)
# 子图3
ax3 = fig.add_subplot(143)
plt.plot(groupagg_3.index, groupagg_3['价格'], label='糕点类')
plt.xlabel('时间/天')
plt.ylabel('金额/元')
plt.xticks(groupagg_1.index, groupagg_1.index)
plt.title('糕点类')
plt.legend()
plt.axhline(60, ls='--', linewidth=1.0)
# 子图4
ax4 = fig.add_subplot(144)
plt.plot(groupagg_4.index, groupagg_4['价格'], label='根菜类')
plt.xlabel('时间/天')
plt.ylabel('金额/元')
plt.xticks(groupagg_1.index, groupagg_1.index)
plt.title('根菜类')
plt.axhline(550, ls='--', linewidth=1.0)
plt.legend()

plt.show()

# 3.肠粉类气泡图
detailGroup_1 = data_concat2[data_concat2['菜品类别'] == '肠粉类'][['会员名', '金额']].groupby(by=['会员名'])
groupagg_1 = detailGroup_1.sum()
print(groupagg_1)
print(len(groupagg_1))
fig, ax = plt.subplots(figsize=(18, 10))
# 设置x、y、z的数据
x = groupagg_1.index
y = groupagg_1.金额
z = groupagg_1.金额
# 使用colormap配置颜色
cm = plt.cm.get_cmap('RdYlBu')
# 随机配置拥有会员个数的颜色
colors = np.random.rand(len(groupagg_1))
# 画散点图,按照x、y、z
plt.scatter(x, y, s=z*2, c=colors, cmap=cm)
ax.grid()
# 设置x、y标签并设置字体大小
ax.set_xlabel('会员名', fontsize=15)
ax.set_ylabel('肠粉类每位会员消费金额', fontsize=15)
plt.show()

# 4.肠粉类画饼状图
detailGroup = data_concat2[data_concat2['菜品类别'] == '肠粉类'][['菜品名称', '价格']].groupby(by=['菜品名称'])
groupagg = detailGroup.sum().sort_values(['价格'], ascending=False)
fig = plt.figure(figsize=(8, 8))
# 画饼状图
plt.pie(groupagg['价格'], autopct='%.1f%%', labels=groupagg.index, explode=[0.1,0,0,0,0])
plt.title('肠粉类菜品总销量饼图')
plt.show()
  • 无注释代码
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False 
data = pd.read_excel("./data/./餐饮综合案例数据.xlsx", sheet_name='订单详情表')
data2 = pd.read_excel("./data/./餐饮综合案例数据.xlsx", sheet_name='订单信息表')
data3 = pd.read_excel("./data/./餐饮综合案例数据.xlsx", sheet_name='菜品信息表')
data['金额'] = data['价格'] * data['数量']
data_concat = pd.merge(data[['订单号', '菜品名称', '金额', '日期']], data2[['订单号', '会员名']], left_on='订单号', right_on='订单号', how='left')
data_concat2 = pd.merge(data_concat, data3, left_on='菜品名称', right_on='菜品名称', how='left')

# 1.三个菜品的条形图
data['时间'] = data['日期'].dt.day
detailGroup_1 = data[data['菜品名称'] == '爆炒猪肝'][['时间', '数量']].sort_values(['数量'], ascending=False).groupby(by=['时间'])
groupagg_1 = detailGroup_1.sum()
detailGroup_2 = data[data['菜品名称'] == '番茄炖牛腩'][['时间', '数量']].sort_values(['数量'], ascending=False).groupby(by=['时间'])
groupagg_2 = detailGroup_2.sum()
detailGroup_3 = data[data['菜品名称'] == '广式虾仁肠粉'][['时间', '数量']].sort_values(['数量'], ascending=False).groupby(by=['时间'])
groupagg_3 = detailGroup_3.sum()
fig = plt.figure(figsize=(20, 6))
ax = fig.add_subplot(111)
plt.bar(groupagg_1.index, groupagg_1['数量'], width=0.2)
plt.bar(groupagg_2.index + 0.2, groupagg_2['数量'], width=0.2)
plt.bar(groupagg_3.index + 0.4, groupagg_3['数量'], width=0.2)
plt.xlabel('时间/天')
plt.ylabel('销量/份')
plt.xticks(groupagg_1.index, groupagg_1.index)
plt.title('菜品柱状图')
plt.legend(['爆炒猪肝', '番茄炖牛腩', '广式虾仁肠粉'], loc="upper right")
plt.axhline(3, ls='--', linewidth=1.0)
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
plt.show()

# 2.四类菜品折线图
data_concat2['时间'] = data_concat2['日期'].dt.day
detailGroup_1 = data_concat2[data_concat2['菜品类别'] == '肠粉类'][['时间', '价格']].sort_values(['时间'], ascending=False).groupby(by=['时间'])
groupagg_1 = detailGroup_1.sum()
detailGroup_2 = data_concat2[data_concat2['菜品类别'] == '贝壳类'][['时间', '价格']].sort_values(['时间'], ascending=False).groupby(by=['时间'])
groupagg_2 = detailGroup_2.sum()
detailGroup_3 = data_concat2[data_concat2['菜品类别'] == '糕点类'][['时间', '价格']].sort_values(['时间'], ascending=False).groupby(by=['时间'])
groupagg_3 = detailGroup_3.sum()
detailGroup_4 = data_concat2[data_concat2['菜品类别'] == '根菜类'][['时间', '价格']].sort_values(['时间'], ascending=False).groupby(by=['时间'])
groupagg_4 = detailGroup_4.sum()
fig = plt.figure(figsize=(24, 8))
ax1 = fig.add_subplot(141)
plt.plot(groupagg_1.index, groupagg_1['价格'], label='肠粉类')
plt.xlabel('时间/天')
plt.ylabel('金额/元')
plt.xticks(groupagg_1.index, groupagg_1.index)
plt.title('肠粉类')
plt.legend()
plt.axhline(68, ls='--', linewidth=1.0)
ax2 = fig.add_subplot(142)
plt.plot(groupagg_2.index, groupagg_2['价格'], label='贝壳类')
plt.xlabel('时间/天')
plt.ylabel('金额/元')
plt.xticks(groupagg_1.index, groupagg_1.index)
plt.title('贝壳类')
plt.legend()
plt.axhline(212, ls='--', linewidth=1.0)
ax3 = fig.add_subplot(143)
plt.plot(groupagg_3.index, groupagg_3['价格'], label='糕点类')
plt.xlabel('时间/天')
plt.ylabel('金额/元')
plt.xticks(groupagg_1.index, groupagg_1.index)
plt.title('糕点类')
plt.legend()
plt.axhline(60, ls='--', linewidth=1.0)
ax4 = fig.add_subplot(144)
plt.plot(groupagg_4.index, groupagg_4['价格'], label='根菜类')
plt.xlabel('时间/天')
plt.ylabel('金额/元')
plt.xticks(groupagg_1.index, groupagg_1.index)
plt.title('根菜类')
plt.axhline(550, ls='--', linewidth=1.0)
plt.legend()
plt.show()

# 3.肠粉类气泡图
detailGroup_1 = data_concat2[data_concat2['菜品类别'] == '肠粉类'][['会员名', '金额']].groupby(by=['会员名'])
groupagg_1 = detailGroup_1.sum()
print(groupagg_1)
print(len(groupagg_1))
fig, ax = plt.subplots(figsize=(18, 10))
x = groupagg_1.index
y = groupagg_1.金额
z = groupagg_1.金额
cm = plt.cm.get_cmap('RdYlBu')
colors = np.random.rand(len(groupagg_1))
plt.scatter(x, y, s=z*2, c=colors, cmap=cm)
ax.grid()
ax.set_xlabel('会员名', fontsize=15)
ax.set_ylabel('肠粉类每位会员消费金额', fontsize=15)
plt.show()

# 4.肠粉类画饼状图
detailGroup = data_concat2[data_concat2['菜品类别'] == '肠粉类'][['菜品名称', '价格']].groupby(by=['菜品名称'])
groupagg = detailGroup.sum().sort_values(['价格'], ascending=False)
fig = plt.figure(figsize=(8, 8))
plt.pie(groupagg['价格'], autopct='%.1f%%', labels=groupagg.index, explode=[0.1,0,0,0,0])
plt.title('肠粉类菜品总销量饼图')
plt.show()
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐