python實現高考排名視覺化
阿新 • • 發佈:2020-03-31
有一次,準備研究一下高考排名視覺化,網上搜了一下結果發現基本是用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:/資料分析/data.xlsx' # 解決中文路徑通過檔案操作 103 f = open(filename, 'rb') 104 df = pd.read_excel(f) 105 plot2(df)
&n