有一次,准备研究一下高考排名可视化,网上搜了一下结果发现基本是用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)

 

版权声明:本文为waterzhm原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/waterzhm/p/12608238.html