python数据可视化实验:subplots子图的绘制

本文描述了如何设计一个包含洛阳主要旅游景点门票收入数据的数据库表,并插入一周的数据。使用Python和相关库如pandas、pymysql和matplotlib创建了四个可视化图表,展示单个景点每日营收、所有景点每天、按景点排序总营收和按营收排序总营收,以及营收参考线。
摘要由CSDN通过智能技术生成

设计一个存储洛阳市主要旅游景点门票收入的数据表,至少包括景点名称、门票价格、日期、游览人数等字段,添加至少五个景点某一周七天的数据到数据库。选择四种不同的可视化图表分别展示某一景点七天营收情况、所有景点每一天营收情况(按日期顺序)、所有景点总营收(按景点名称排序)、所有景点总营收(按营收排序)及三个参考线(最高营收、最低营收、平均营收),要求利用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()

运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值