设计一个存储洛阳市主要旅游景点门票收入的数据表,至少包括景点名称、门票价格、日期、游览人数等字段,添加至少五个景点某一周七天的数据到数据库。选择四种不同的可视化图表分别展示某一景点七天营收情况、所有景点每一天营收情况(按日期顺序)、所有景点总营收(按景点名称排序)、所有景点总营收(按营收排序)及三个参考线(最高营收、最低营收、平均营收),要求利用subplots绘制在一个画布中,各子图有合理标题和坐标轴设置,子图间有合理间隔。
表字段的设置:
插入数据:
INSERT INTO luoyang (景点名称, 门票价格, 日期, 浏览人数)
VALUES ('白马寺', 50, '星期一', 1000),
('白马寺', 50, '星期二', 1100),
('白马寺', 50, '星期三', 900),
('白马寺', 50, '星期四', 950),
('白马寺', 50, '星期五', 1050),
('白马寺', 50, '星期六', 1200),
('白马寺', 50, '星期日', 950);
INSERT INTO luoyang (景点名称, 门票价格, 日期, 浏览人数)
VALUES ('龙门石窟', 150, '星期一', 1300),
('龙门石窟', 150, '星期二', 2822),
('龙门石窟', 150, '星期三', 1722),
('龙门石窟', 150, '星期四', 2819),
('龙门石窟', 150, '星期五', 2190),
('龙门石窟', 150, '星期六', 4792),
('龙门石窟', 150, '星期日', 2471);
INSERT INTO luoyang (景点名称, 门票价格, 日期, 浏览人数)
VALUES ('洛邑古城', 10, '星期一', 3781),
('洛邑古城', 10, '星期二', 1391),
('洛邑古城', 10, '星期三', 2391),
('洛邑古城', 10, '星期四', 2378),
('洛邑古城', 10, '星期五', 3819),
('洛邑古城', 10, '星期六', 3291),
('洛邑古城', 10, '星期日', 1732);
INSERT INTO luoyang (景点名称, 门票价格, 日期, 浏览人数)
VALUES ('老君山', 100, '星期一', 1972),
('老君山', 100, '星期二', 1479),
('老君山', 100, '星期三', 9294),
('老君山', 100, '星期四', 1391),
('老君山', 100, '星期五', 1938),
('老君山', 100, '星期六', 3583),
('老君山', 100, '星期日', 1383);
INSERT INTO luoyang (景点名称, 门票价格, 日期, 浏览人数)
VALUES ('应天门', 60, '星期一', 2891),
('应天门', 60, '星期二', 1381),
('应天门', 60, '星期三', 2489),
('应天门', 60, '星期四', 1389),
('应天门', 60, '星期五', 2984),
('应天门', 60, '星期六', 2394),
('应天门', 60, '星期日', 2149);
数据库部分数据:
%matplotlib auto
import pandas as pd
import pymysql
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False
#从数据库获取方式
# 连接数据库
con = pymysql.connect(host='127.0.0.1',user= 'root',password= '123456', database='keshihua')
# 写sql 语句
sql = 'select * from luoyang'
# 读出数据
df = pd.read_sql(sql, con)
#display(df)
#将画布划分为2*2的矩阵区域,一次在每个区域绘制子图
fig,axs = plt.subplots(nrows=2, ncols=2,figsize=(10,4.65))
ax1=axs[0,0]
ax2=axs[0,1]
ax3=axs[1,0]
ax4=axs[1,1]
df["营收情况"]=df["门票价格"]*df["浏览人数"]
#display(df)
x1=np.arange(7)
y1=df.loc[0:6,"营收情况"]
y2=df.loc[7:13,"营收情况"]
y3=df.loc[14:20,"营收情况"]
y4=df.loc[21:27,"营收情况"]
y5=df.loc[28:34,"营收情况"]
ax1.set_xticks([0,1,2,3,4,5,6])
ax1.set_xticklabels(df.loc[0:6,"日期"],fontsize=6)
ax1.plot(x1,y1,label=df.loc[0,"景点名称"])
ax1.plot(x1,y2,label=df.loc[7,"景点名称"])
ax1.plot(x1,y3,label=df.loc[14,"景点名称"])
ax1.plot(x1,y4,label=df.loc[21,"景点名称"])
ax1.plot(x1,y5,label=df.loc[28,"景点名称"])
ax1.legend(loc="best",bbox_to_anchor=(0.85, 0, 0.32, 1),prop = {'size':5})
ax1.set_xlabel("日期",loc="right",fontsize=6)
ax1.set_ylabel("营收情况(元)",loc="top",fontsize=6)
#无指向注释
# plt.text(a,b,b)数据显示的横坐标、显示的位置高度、显示的数据值的大小
for a,b in zip(x1,y1):
ax1.text(a,b,b,ha='center',va='bottom',fontsize=6)
for a,b in zip(x1,y2):
ax1.text(a,b,b,ha='center',va='bottom',fontsize=6)
for a,b in zip(x1,y3):
ax1.text(a,b,b,ha='center',va='bottom',fontsize=6)
for a,b in zip(x1,y4):
ax1.text(a,b,b,ha='center',va='bottom',fontsize=6)
for a,b in zip(x1,y5):
ax1.text(a,b,b,ha='center',va='bottom',fontsize=6)
df.sort_values(by="景点名称",inplace=True)
#display(df)
x2=df.groupby("景点名称")["营收情况"].sum()#.sort_values(by="景点名称")
#print(a)
y2=np.arange(5)
ax2.set_yticks([0,1,2,3,4])
ax2.set_yticklabels(df.loc[[0,7,14,21,28],"景点名称"],fontsize=6)
ax2.barh(y2,x2,height=0.6)
# plt.text(a,b,b)数据显示的横坐标、显示的位置高度、显示的数据值的大小
for a,b in zip(x2,y2):
ax2.text(a+150000,b,a,ha="center",va="bottom",fontsize=8)
ax2.set_xlabel("营收情况(元)",loc="right",fontsize=6)
ax2.set_ylabel("景点名称",loc="top",fontsize=6)
y3=df.groupby("景点名称")["营收情况"].sum().sort_values()
#print(y3)
#print(y3.index)
x3=np.arange(5)
ax3.set_xticks([0,1,2,3,4])
ax3.set_xticklabels(y3.index,fontsize=6)
c1=df.groupby("景点名称")["营收情况"].sum().max()
c2=df.groupby("景点名称")["营收情况"].sum().min()
c3=df.groupby("景点名称")["营收情况"].sum().mean()
#print(c1,c2,c3)
ax3.axhline(y=c1,color="g",linestyle="--",linewidth=1)
ax3.axhline(y=c2,color="y",linestyle=":",linewidth=1)
ax3.axhline(y=c3,color="r",linestyle="-.",linewidth=1)
ax3.text(2.5,c1,"最大营收",ha="center",va="top")
ax3.text(2.5,c2,"最小营收",ha="center",va="top")
ax3.text(2.5,c3,"平均营收",ha="center",va="top")
ax3.scatter(x3,y3,s=10)
# plt.text(a,b,b)数据显示的横坐标、显示的位置高度、显示的数据值的大小
for a,b in zip(x3,y3):
ax3.text(a,b+10000,b,ha="center",va="bottom")
ax3.set_xlabel("景点名称",loc="right",fontsize=6)
ax3.set_ylabel("营收情况(元)",loc="top",fontsize=6)
x4=np.arange(7)
y4=np.array(df.loc[0:6,"营收情况"])
ax4.set_xticks([0,1,2,3,4,5,6])
ax4.set_xticklabels(df.loc[0:6,"日期"],fontsize=6)
ax4.bar(x1,y1,label=df.loc[0,"景点名称"])
ax4.legend(loc="best",bbox_to_anchor=(0.85, 0, 0.32, 1),prop = {'size':5})
ax4.set_xlabel("日期",loc="right",fontsize=6)
ax4.set_ylabel("营收情况(元)",loc="top",fontsize=6)
#无指向注释
# plt.text(a,b,b)数据显示的横坐标、显示的位置高度、显示的数据值的大小
for a,b in zip(x4,y4):
ax4.text(a,b,b,ha='center',va='bottom')
#调整子图间距
plt.tight_layout()
plt.show()
运行结果: