PYTHON实践——成绩数据可视化

摘  要

       因为Python实践要求数据可视化,于是我就开始找数据,然后恰好就得到了江苏高考从2012年到2019年的部分数据,并把它们导入到Excel表中,再进一步进行数据分析。从而获得了几幅高考数据的可视化图像。

关键词: 高考成绩,数据可视化

目  录

1实践选题与目标 1

2实践开发环境 1

3实践步骤 7

4关键步骤 17

5实践结果与分析 31

6实践体会 31

正文

  1. 实践选题及目标

   选题:高考成绩数据可视化

       目标:用xlrd,matplotlib等库实现对高考数据的可视化,让枯燥繁多的数据能较为直观得呈现给人们,也让人们填报高考志愿时能更快找到适合自己填报的大学和专业,也能让人看到不同年份江苏高考难度的变化,以及各个大学、各个专业在江苏的招生情况。当然因为个人水平问题,暂时还不能实现那么高级的操作。

2.实践开发环境

        应用软件Pycharm,使用编译器 ,使用的库有(如下图)

 

 

PYTHON实践——成绩数据可视化_第1张图片

PYTHON实践——成绩数据可视化_第2张图片

 PYTHON实践——成绩数据可视化_第3张图片

 3.实践步骤

       因为这次的项目是数据可视化,而要可视化势必要有合适的数据,所以第一步就是寻找合适的数据并确定选题,因为没有在网上找到合适的数据,而找到的合适的数据就是本项目使用的江苏2014-2019年的高考数据汇总。

       而后为了简便操作把用来可视化的数据专门导入了一个新建的Excel表中,后来因为出现数据不能读取问题,又把不同列数的数据存在了不同的表中,然后就基本不报错。

       第二步就是确定要绘制什么图像,因为采用的是高考数据,所以绘制的图像以折线图、条形图、直方图,最后为了避免单调就绘制了一个饼状图,而在绘制过程中,为了让Excel中的中文能够成功地在饼状图上显现还查阅了不少资料,不过最后终于成功了。

4.关键代码

  # todo excel的操作-
import xlrd
# todo 打开excle
xl = xlrd.open_workbook(r'C:\Users\gby20020923\Desktop\江苏高考数据.xls')
# print(xl.read())
# todo 通过索引获取工作表
table = xl.sheets()[0]
print(table)

# 获取一共多少行
rows = table.nrows
print(rows)

# todo 获取第一行的内容,索引从0开始
row = table.row_values(0)
print(row)

# todo 获取第一列的整列的内容
col = table.col_values(0)
print(col)
col=table.col_values(1)
print(col)
col=table.col_values(2)
print(col)

# todo 获取单元格值,第几行第几个,索引从0开始
data = table.cell(3, 0).value
print(data)

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import random
# 数据准备
# 数据准备
x = [2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019]
y = [5, 3, 6, 20, 17, 16, 19, 30, 32, 35]
# 使用Seaborn画折线图
df = pd.DataFrame({'x': x, 'y': y})
sns.lineplot(x="x", y="y", data=df)
plt.show()
#####
x=table.col_values(0)
y=table.col_values(1)
# 使用Matplotlib画折线图
plt.plot(x, y)
plt.show()

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# 数据准备
a=table.col_values(1)
s = pd.Series(a)
# Matplotlib画直方图
plt.hist(s)
plt.show()
# kde=True 会显示一条取值的曲线
sns.distplot(s, kde=True)
plt.show()

import matplotlib.pyplot as plt
import seaborn as sns
import random
# 数据准备

x = ['Cat1', 'Cat2', 'Cat3', 'Cat4', 'Cat5','Cat6','Cat7']
y = [table.cell(random.randint(1,100), 6).value,
     table.cell(random.randint(1,100), 6).value,
     table.cell(random.randint(1,100), 6).value,
     table.cell(random.randint(1,100), 6).value,
     table.cell(random.randint(1,100), 6).value,
     table.cell(random.randint(1,100), 6).value,
     table.cell(random.randint(1,100), 6).value]

# Matplotlib画条形图
plt.bar(x, y)
plt.show()


# todo excel的操作
import xlrd
# todo 打开excle
xl = xlrd.open_workbook(r'C:\Users\gby20020923\Desktop\江苏高考数据.xls')
# print(xl.read())
# todo 通过索引获取工作表
table1 = xl.sheets()[1]
print(table1)
print(row)
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.pyplot as plt

# 这两行代码解决 plt 中文显示的问题
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
m=table1.col_values(0)
n=table1.col_values(3)
print(m)
plt.barh(m,n)  # 横放条形图函数 barh
plt.title('录取人数位次情况(西北工业大学)')
plt.show()
x = table1.col_values(0)#点的横坐标
k1 = table1.col_values(2)#线1的纵坐标
k2 = table1.col_values(4)#线2的纵坐标
plt.plot(x,k1,'s-',color = 'r',label="投档线")#s-:方形
plt.plot(x,k2,'o-',color = 'g',label="省控线")#o-:圆形
plt.xlabel("年份")
plt.ylabel("高考分数")
plt.legend(loc = "best")#图例
plt.rcParams['font.sans-serif']=['SimHei'] # 中文
plt.show()

# todo excel的操作
import xlrd
# todo 打开excle
xl = xlrd.open_workbook(r'C:\Users\gby20020923\Desktop\江苏高考数据.xls')
# print(xl.read())
# todo 通过索引获取工作表
table2= xl.sheets()[2]
print(table2)
#饼状图
s= table2.col_values(0)
t= table2.col_values(1)
explode=[0,0,0,0,0,0,0.1,0.2,0.3,0,0.4,0.2,0]
plt.pie(t, labels=s, autopct='%0.0f%%',explode= explode,shadow=True)#autopct='%0.0f%%'显示百分比
plt.rcParams['font.sans-serif']=['SimHei'] #显示中文标签
plt.rcParams['axes.unicode_minus']=False
plt.show()

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

# 数据准备(1000个随机散点)
N = 1000
x = np.random.randn(N)
y = np.random.randn(N)
# Matplotlib画散点图
plt.scatter(x, y,marker='p')
plt.show()

# Seaborn画散点图
df = pd.DataFrame({'x': x, 'y': y})
sns.jointplot(x="x", y="y", data=df, kind='scatter')
plt.show()

5.实践结果与分析

        这个是用xlrd库调用Excel的数据,为了测试数据是否能成功调用,就输出了部分数据,从这个结果反馈来看这个Excel的数据是能够成功调用的,这样就确保了后面能够成功绘制图像。

       这个图是用Matplotlib绘制的折线图,是反映人数根据分数分布的图像,虽然是有些简略,但是它是能够较为直观的看出高考分数大多位于300-380这个区间,400-425这个区间人数变化的很平缓,可见这个分数段的人数较少,而这也属于江苏高考480分总分的高分段了,在340-360这个区间人数变化很大,由此可知这个分数段人数 

PYTHON实践——成绩数据可视化_第4张图片

       较为密集,这也同样符合江苏高考的历年规律,综上,这个图还是能较为直观准确地反映江苏高考的总体分数分布情况的。

PYTHON实践——成绩数据可视化_第5张图片

 PYTHON实践——成绩数据可视化_第6张图片

 

        直方图使用的都是Matplotlib,这两个直方图看起来是差不多的,唯一的区别就是一个有变化曲线一个没有变化曲线,但其实这两者使用的数据是不一样的,这样表明只要改变调用数据的列数就可以轻松绘制出不同年份的直方图,同时也可以通过一个简单的True还是False来决定是否有变化曲线。当然,我也要解释一下为什么我绘制一堆看着相似的图,这是因为高考数据基本就是年份和分数以及录取人数,故而使用折线图、直方图和条纹图能更好的反映变化规律,让大量数据实现可视化。

PYTHON实践——成绩数据可视化_第7张图片

 

        这个是用Matplotlib绘制的条纹图,与直方图的区别可能就是一个是竖着,一个是横着的。本来想做一个矿大这些年最低录取位次与年份的变化关系,但是很可惜没有找到相关数据,于是乎就用了西北工业大学的数据,基本原理反正是一样的,想要分析哪个大学的录取位次只需要换一下数据就行了。从这个表中,我们可以看出西北工业大学的最低录取位次是逐年上升的,要考取这所大学越来越困难。

   PYTHON实践——成绩数据可视化_第8张图片

 

        这幅折线图也是利用Matplotlib绘制的,也是调用的西北工业大学的数据,红色的是其录取线,绿色的则是本一线,这样的一幅图不仅可以看出省控线和西北工业大学的投档线不同年份之间的变化关系,而且还能看出省控线和投档线之间的分差的逐年变化,可以给想要填报该校的考生予以一定的参考价值,而且同前面的图一样,只要把西北工业大学的数据替换成其他大学的数据,就可以轻松得到其他大学投档线和录取线的逐年变化规律。

PYTHON实践——成绩数据可视化_第9张图片

 

        这幅饼状图是这几幅图中我最满意的一幅,首先这个与上面的几幅图明显不同,而且为了把这个饼状图信息更好地呈现出来,每个部分之间的gap调了很久,同时加了阴影让饼状图看起来更加立体。从这个表上我们可以看出该大学各个专业的招生情况——有哪些专业,同时每种专业招生情况占总招生人数的百分比,数形结合再配合适当间距以及不同的颜色可以说是很直观了。

PYTHON实践——成绩数据可视化_第10张图片

        三维图用的是随机点,没有使用Excel表中数据,而是利用随机生成得到的数据,主要是表中的数据是二维的,这个图呈现的三维数据,所以就没能使用成功。

PYTHON实践——成绩数据可视化_第11张图片

 PYTHON实践——成绩数据可视化_第12张图片

 

       这幅和上面那幅图都是利用100个随机生成点做得图,虽然可能实际用处不大,但是因为我也花费时间研究了,就是没能用到高考数据,最后还是把这两幅图放置在这里,也算是丰富一下内容,让这篇报告上图的种类不那么单调。

6.实践体会

       经过这次python编程实践,我对数据可视化有了一个较为深刻的了解。首先,因为python语言简便的原因,往往几行代码就能实现一幅图像的绘制,另外,其的交互功能比C++要丰富得多,也易操作得多,而且虽然一开始绘图的时候总是报错,但是一步步慢慢实现的过程还是蛮有意思的,就像看到自己一直的设想终于有一天变成了现实。

       在这次数据可视化实践中真的遇到了不少困难,一开始是系统上的问题,我有些库装不上去,试了好多次都不行,后来请教了其他同学,重新装了一个python3.9,在系统环境变量里改了编译器的连接,然后就成功地装了库。当然,也因为我的电脑里有好几个python编译器导致库之间的链接十分混乱,后来出现了问题,也是操作了好久才搞定,通过这些我明白要想学好编程不仅要有过硬的代码知识储备,同时还要对各类系统操作乃至硬件有所了解,否则出了什么问题真的是让人头大,而且还要有足够的耐心,毕竟有时候一个接一个的bug还一直改不对也是让人崩溃极了。不过,当这些问题都得到很好的解决时,就会感到相当的愉悦,还十分有成就感。

         我知道我做得这个项目对于其他同学而言,可能较为简陋,但是我要说我在大学之前从未接触过编程,而且有一点我也要不得不承认那就是我打字速度较慢,所以比其他同学会落后一些,这些我都知道,因此每每当别人的项目有所进展,而我却止步不前的时候,我的内心是痛苦的,但是我暗暗鼓励自己再加把劲或许我也成功了,最终我也完成了自己的项目,或许它真的不够好,但是对我来说它是弥足珍贵的,因为其中凝聚着那几个日夜的心血。

        还有就是本来我也想分析网络数据,但是很遗憾没有找到合适的数据库,于是只能退而求其次转而分析Excel表中的数据,这个过程也遇到了不小的阻力,首先要分析哪些数据比较适合可视化,并把它们导入新的Excel表中,当我成功得完成前几张图之后,我以为后面就是依葫芦画瓢会容易得多,结果事实证明远没有我想的那么简单。如果把列数不同的数据存在同一个表格中,就会造成短的那列数据在调用时产生问题,因而只能把它们存在不同的表里面,这样问题就能迎刃而解了。另外,饼状图一开始中文数据不能调用,还专门上网查了好久才发现是这个问题并加以改正。本来我想再做几张不同的图表类型,结果因为数据不适合就没能实现,有些可惜,最后几张图因为表里的数据不合适,就使用的随机数据或者指定数据,如果以后我有能力改善的话,一定改善。

你可能感兴趣的:(python,开发语言,后端)