亲宝软件园·资讯

展开

python实现高考排名可视化

waterzhm 人气:0

 

有一次,准备研究一下高考排名可视化,网上搜了一下结果发现基本是用Excel实现,于是自己动手实现python相关代码。

数据使用2018年高考河北理科。

 

下面是代码

  1 # -*- coding: utf-8 -*-
  2 # @Time    : 2019/9/30
  3 # @Author  : water66
  4 # @File    : data.py
  5 # @Version : 0.1
  6 # @Python Version : 3.6
  7 
  8 
  9 import pandas as pd
 10 import os
 11 import matplotlib.pyplot as plt
 12 import time
 13 from pylab import mpl
 14 mpl.rcParams['font.sans-serif'] = ['FangSong']  # 指定默认字体
 15 mpl.rcParams['axes.unicode_minus'] = False  # 解决保存图像是负号'-'显示为方块的问题
 16 
 17 # 解决打印df列方向不对齐
 18 pd.set_option('display.unicode.ambiguous_as_wide', True)
 19 pd.set_option('display.unicode.east_asian_width', True)
 20 
 21 
 22 def plot1(data):
 23     df = pd.DataFrame(columns=('score', 'number', 'count'))
 24     step = int(len(data)//10)  # 只显示十个数据
 25     date_index = [i for i in range(0,len(data),step)]  # 每step显示一次
 26 
 27     inteval = []
 28     for i in range(10):
 29         df.loc[i] = data.loc[date_index[i]]
 30         if i==0 :
 31             inteval.append(df.loc[i,'count'])
 32         else:
 33             inteval.append(df.loc[i, 'count']-df.loc[i-1, 'count'])
 34     x, y = df['score'], inteval
 35     print(df)
 36     plt.title("2018高考河北理科一人一分统计")
 37     plt.xlabel("分数")
 38     plt.ylabel("人数")
 39     plt.xticks(rotation=90)  # 更改标签名称
 40     plt.bar(x, y, color='blue')
 41     for a, b in zip(x, y):
 42         plt.text(a, b + 0.05, '%.0f' % b, ha='center', va='bottom', fontsize=11) # +0.05 表示高于图0.05
 43 
 44     #  保存图片,bbox_inches = 'tight'保存所以内容,默认640*480存在按比例裁剪,dpi分辨率
 45     name = time.strftime('%Y-%m-%d_%H-%M-%S')
 46     plt.rcParams['figure.figsize'] = (6.4, 4.8)
 47     # plt.savefig("D:/"+ name +".jpg", dpi=200, bbox_inches = 'tight')
 48     plt.locator_params('y', nbins=10)
 49     plt.savefig("D:/" + name + ".jpg",dpi=200, bbox_inches='tight')
 50     plt.show()
 51     return name
 52 
 53 
 54 def plot2(data):
 55     score_list = [100, 200, 300, 400, 500, 550, 600, 650, 680, 700]
 56     score_range = ["100以下", "100-199", "200-299", "300-399", "400-499",
 57                    "500-549", "550-599", "600-649", "650-679", "680-699", "700以上"]
 58     tatal = data.loc[len(data)-1, 'count']
 59     score_point = score_list[::-1]  # 列表反转,按照高到低,源数据也是高到底好处理
 60     rank = []
 61     number = []
 62     for i in range(10):
 63         index = data[data['score'] == str(score_point[i])].index.tolist()[0]    # df数据转列表取第一个
 64         if i == 0 :
 65             number.append(data.loc[index, 'count'])
 66         else:
 67             number.append(data.loc[index, 'count']-count)
 68 
 69         count = data.loc[index, 'count']
 70         temp = "%.3f%%" % (count / tatal * 100) # 保留小数点后三位
 71         rank.append(temp)
 72 
 73     index = data[data['score'] == (str)(score_point[-1]-1)].index.tolist()[0]
 74     number.append(data.loc[len(data)-1, 'count']-data.loc[index, 'count'])
 75     number = number[::-1]  # 列表反转,按照低到高
 76     # temp = "%.3f%%" % (data.loc[index, 'count'] / tatal * 100)
 77     # rank.append(temp)
 78     rank.append('100%')
 79     rank = rank[::-1]  # 倒序
 80     rank = ['前' + x for x in rank]  # 加字
 81 
 82     x, y = score_range,number
 83     plt.title("2018高考河北理科分数段统计")    # 图片名
 84     plt.xlabel("分数")    # x坐标名
 85     plt.ylabel("人数")    # y坐标名
 86     plt.xticks(rotation=90)  # 更改标签位置,旋转90
 87     plt.bar(x, y, color='blue')     # 绘制柱状图
 88     for a, b, c in zip(x, y, rank):
 89         plt.text(a, b + 0.05, '%.0f' % b , ha='center', va='bottom', fontsize=10)  # +0.05 表示高于图0.05
 90         plt.text(a, b + 2500, c, ha='center', va='bottom', fontsize=8, color='red' ) # +0.05 表示高于图0.05
 91 
 92     #  保存图片,bbox_inches = 'tight'保存所以内容,默认640*480存在按比例裁剪,dpi分辨率
 93     name = time.strftime('%Y-%m-%d_%H-%M-%S')
 94     plt.rcParams['figure.figsize'] = (6.4, 4.8)     # 图片比例
 95     plt.locator_params('y', nbins=10)   # 显示y轴十个刻度
 96     plt.savefig("D:/" + name + ".jpg",dpi=500, bbox_inches='tight')  # 高分辨dpi保存
 97     plt.show()  # 显示图像
 98     return name
 99 
100 
101 if __name__ == "__main__":
102     filename = r'D:/数据分析https://img.qb5200.com/download-x/data.xlsx'  # 解决中文路径通过文件操作
103     f = open(filename, 'rb')
104     df = pd.read_excel(f)
105     plot2(df)
View Code

 

加载全部内容

相关教程
猜你喜欢
用户评论