python實現高考排名可視化


 

有一次,准備研究一下高考排名可視化,網上搜了一下結果發現基本是用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)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM