有一次,准備研究一下高考排名可視化,網上搜了一下結果發現基本是用Excel實現,於是自己動手實現python相關代碼。
數據使用2018年高考河北理科。
下面是代碼
# -*- coding: utf-8 -*- # @Time : 2019/9/30 # @Author : water66 # @File : data.py # @Version : 0.1 # @Python Version : 3.6 import pandas as pd import os import matplotlib.pyplot as plt import time from pylab import mpl mpl.rcParams['font.sans-serif'] = ['FangSong'] # 指定默認字體 mpl.rcParams['axes.unicode_minus'] = False # 解決保存圖像是負號'-'顯示為方塊的問題 # 解決打印df列方向不對齊 pd.set_option('display.unicode.ambiguous_as_wide', True) pd.set_option('display.unicode.east_asian_width', True) def plot(data): score_list = [100, 200, 300, 400, 500, 550, 600, 650, 680, 700] score_range = ["100以下", "100-199", "200-299", "300-399", "400-499", "500-549", "550-599", "600-649", "650-679", "680-699", "700以上"] tatal = data.loc[len(data)-1, 'count'] score_point = score_list[::-1] # 列表反轉,按照高到低,源數據也是高到底好處理 rank = [] number = [] for i in range(10): index = data[data['score'] == str(score_point[i])].index.tolist()[0] # df數據轉列表取第一個 if i == 0 : number.append(data.loc[index, 'count']) else: number.append(data.loc[index, 'count']-count) count = data.loc[index, 'count'] temp = "%.3f%%" % (count / tatal * 100) # 保留小數點后三位 rank.append(temp) index = data[data['score'] == (str)(score_point[-1]-1)].index.tolist()[0] number.append(data.loc[len(data)-1, 'count']-data.loc[index, 'count']) number = number[::-1] # 列表反轉,按照低到高 # temp = "%.3f%%" % (data.loc[index, 'count'] / tatal * 100) # rank.append(temp) rank.append('100%') rank = rank[::-1] # 倒序 rank = ['前' + x for x in rank] # 加字 x, y = score_range,number plt.title("2018高考河北理科分數段統計") # 圖片名 plt.xlabel("分數") # x坐標名 plt.ylabel("人數") # y坐標名 plt.xticks(rotation=90) # 更改標簽位置,旋轉90 plt.bar(x, y, color='blue') # 繪制柱狀圖 for a, b, c in zip(x, y, rank): plt.text(a, b + 0.05, '%.0f' % b , ha='center', va='bottom', fontsize=10) # +0.05 表示高於圖0.05 plt.text(a, b + 2500, c, ha='center', va='bottom', fontsize=8, color='red' ) # +0.05 表示高於圖0.05 # 保存圖片,bbox_inches = 'tight'保存所以內容,默認640*480存在按比例裁剪,dpi分辨率 name = time.strftime('%Y-%m-%d_%H-%M-%S') plt.rcParams['figure.figsize'] = (6.4, 4.8) # 圖片比例 plt.locator_params('y', nbins=10) # 顯示y軸十個刻度 plt.savefig("D:/" + name + ".jpg",dpi=500, bbox_inches='tight') # 高分辨dpi保存 plt.show() # 顯示圖像 return name if __name__ == "__main__": filename = r'D:/數據分析/data.xlsx' # 解決中文路徑通過文件操作 f = open(filename, 'rb') df = pd.read_excel(f) plot(df)