开场段子???? :

下面我们用平行坐标系图来直观呈现全国各省市高考难度(4维度,分别是一本录取率,211录取率,985录取率,清北录取率)。

平行坐标系图是一种适合呈现高维数据(3维以上)的图表形式。顾名思义,它使用一组平行的坐标系来表达数据,每个样本点表达为坐标系中的一条折线。

先上数据:

(数据来源:统计局,教育部,各省教育厅,国金证券研究所。西藏一本录取率为估计数值。年份为2018年)

再上图片:

然后上视频:

最后上代码:

import numpy as np
import pandas as pd
import shapely
from shapely import geometry as geo
import matplotlib.pyplot as plt
import matplotlib.animation as  animation import imageio
import os
from PIL import Imageplt.rcParams['font.family'] = 'sans-serif'
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['animation.writer'] = 'html'
plt.rcParams['animation.embed_limit'] = 100def rgba_to_rgb(img_rgba):img_rgb = Image.new("RGB", img_rgba.size, (255, 255, 255))img_rgb.paste(img_rgba, mask=img_rgba.split()[3]) return img_rgb def html_to_gif(html_file, gif_file, duration=0.5):path = html_file.replace(".html","_frames")images = [os.path.join(path,x) for x in sorted(os.listdir(path))]frames = [imageio.imread(x) for x in images]if frames[0].shape[-1]==4:frames = [np.array(rgba_to_rgb(Image.fromarray(x))) for x in frames]imageio.mimsave(gif_file, frames, 'gif', duration=duration)return gif_filecmap = [
'#2E91E5',
'#1CA71C',
'#DA16FF',
'#B68100',
'#EB663B',
'#00A08B',
'#FC0080',
'#6C7C32',
'#862A16',
'#620042',
'#DA60CA',
'#0D2A63']*100df = pd.read_excel("./data/各省市高考录取率数据.xlsx")def parallel_coordinates_dance(df,title = "中国各省市高考难度",filename = None,figsize = (8,5),dpi = 144,duration = 0.5,anotate_points = ["江西","上海","河南","山东","西藏","北京","天津"],line_cols = ["一本录取率","211录取率","985录取率","清北录取率"],name_col = "省份",text_col = "高考模式"):fig, ax =plt.subplots(figsize=figsize,dpi=dpi)def plot_frame(i):ax.clear()ax.axis("off")n = len(line_cols)k = i//n+1m = i%ndfvalues = df[line_cols].copy() values = dfvalues.values/dfvalues.values.max(axis=0)dfvalues = pd.DataFrame(values,columns = line_cols)dfvalues.index = df[name_col]dfdata = dfvalues.iloc[:k,:].copy()ax.set_xlim(-(len(line_cols)-1)/20, 21*(len(line_cols)-1)/20)    ax.set_ylim(-0.1, 1.1)# 绘制坐标系for j,col in enumerate(line_cols):y = np.array([0,1.05])x = [j,j]line = plt.Line2D(x,y,color="gray",linestyle="-",linewidth= 2.5,alpha = 0.5)ax.add_artist(line)ax.annotate(col,xy = (j,0),  xycoords = "data",xytext = (-25,-10),fontsize = 10,fontweight = "bold",color = "black", textcoords = "offset points",zorder = 1)# 绘制平均参考线y = dfvalues.iloc[-1,:].values.tolist()x = list(range(0,len(line_cols)))line = plt.Line2D(x,y,color="gray",linestyle="--",linewidth= 3.5,alpha = 0.7)ax.add_artist(line)for j,(px,py) in enumerate(zip(x,y)):s = str(df[line_cols].iloc[-1,j])+"%"ax.annotate(s,xy = (px,py),  xycoords = "data",xytext = (-17,5),fontsize = 10,fontweight = "bold",color = "black", textcoords = "offset points",zorder = 3)s = dfvalues.index[-1]ln = geo.LineString(np.array(list(zip(x,y))))pt = np.array(ln.interpolate(0.5 ,normalized=True))px, py =  pt ax.annotate(s,xy = (px,py),  xycoords = "data",xytext =(-5,-5),fontsize = 12,fontweight = "bold",color = "black", textcoords = "offset points",zorder = 4)# 绘制最高参考值y = [1.0]*len(line_cols)x = list(range(0,len(line_cols)))arr_s = df[line_cols].max().to_list()line = plt.Line2D(x,y,color="gray",linestyle="--",linewidth= 3.5,alpha = 0.7)ax.add_artist(line)for r,(px,py) in enumerate(zip(x,y)):s = str(arr_s[r])+"%"ax.annotate(s,xy = (px,py),  xycoords = "data",xytext = (-17,5),fontsize = 10,fontweight = "bold",color = "black", textcoords = "offset points",zorder = 3)s = "最高参考线"ln = geo.LineString(np.array(list(zip(x,y))))pt = np.array(ln.interpolate(0.5 ,normalized=True))px, py =  pt ax.annotate(s,xy = (px,py),  xycoords = "data",xytext =(-25,-5),fontsize = 12,fontweight = "bold",color = "black", textcoords = "offset points",zorder = 4)# 绘制之前数据for j in range(k-1):y = dfdata.iloc[j,:].values.tolist()x = list(range(0,len(line_cols)))s = dfdata.index[j]if s in anotate_points:line = plt.Line2D(x,y,color=cmap[j],linestyle="-",linewidth= 2.5,alpha = 0.3)ax.add_artist(line)ln = geo.LineString(np.array(list(zip(x,y))))np.random.seed(j)pt = np.array(ln.interpolate(np.random.rand() ,normalized=True))px, py =  pt ax.annotate(s,xy = (px,py),  xycoords = "data",xytext = (-25,-5),fontsize = 12,fontweight = "bold",color = cmap[j], textcoords = "offset points",zorder = 4)# 添加标题和排名序号text = df[name_col].iloc[k-1]+":"+df[text_col].iloc[k-1]ax.set_title(title,color = "black",fontsize = 12)ax.text(0.50, 0.50, text, va="center", ha="center", color = cmap[k-1],size = 50,alpha=0.5,transform = ax.transAxes,zorder = 6)       # 添加动画j = k-1y = dfdata.iloc[j,:].values.tolist()x = list(range(0,len(line_cols)))s = dfdata.index[j]ax.scatter(x[0:m],y[0:m],s=50,c = cmap[j])ax.scatter(x[m:m+1],y[m:m+1],s=100,c = cmap[j])line = plt.Line2D(x[0:m+1],y[0:m+1],color=cmap[j],linestyle="-",linewidth= 3.5,alpha = 0.7)ax.add_artist(line)for r,(px,py) in enumerate(zip(x[0:m+1],y[0:m+1])):s = str(df[line_cols].iloc[j,r])+"%"fs = 10 if r!=m else 20ax.annotate(s,xy = (px,py),  xycoords = "data",xytext = (-17,8),fontsize = fs,fontweight = "bold",color = cmap[j], textcoords = "offset points",zorder = 5)my_animation = animation.FuncAnimation(fig,plot_frame,frames = range(0,len(line_cols)*(len(df)-1)),interval = int(duration*1000))if filename is None:try:from IPython.display import HTMLHTML(my_animation.to_jshtml())return HTML(my_animation.to_jshtml())except ImportError:passelse:my_animation.save(filename)return filenamehtml_file = "中国各省市高考难度.html"
parallel_coordinates_dance(df,filename=html_file)gif_file = html_file.replace(".html",".gif")
html_to_gif(html_file,gif_file,duration=0.8)

主要思路是使用 plt.Line2D对象来构建平行坐标系图。

收工。????

如需获取本文高考数据集和源码的同学,可以在公众号后台回复关键词:高考。添加作者微信获取。

全国各省市高考有多难?Python动态图给你盘点!相关推荐

  1. 2021高考理综单科成绩查询,2021全国各省市高考总分及各科分数 分值是多少

    2021年高考7月7日至9日举行,全国大部分地区使用全国卷,江苏等地自主命题,上海.浙江.山东.海南等属于高考改革地区,不分文理.下面是2021全国各省市高考总分及各科分数,高考前可能会有微调,具体分 ...

  2. 2018计算机专业高考人数,2018年全国31省市高考人数及各省历年高考人数分析【图】...

    2018年共有975万考生报名高考.中国高考人数一直在持续变化.高考人数顶峰时期是2008年,为1050万,到2013年下降到912万,2014.2015年分别增加到939万.942万,2016.20 ...

  3. 2018计算机专业高考人数,2018年全国各省市高考报名人数汇总

    目前全国大部分省市高考报名已经结束,高考报名人数也陆续公布,那么哪个省市高考报名人数最多,有多少人参加2018年高考呢?欢迎阅读<2018年全国各省市高考报名人数汇总>. 全国高考多少人报 ...

  4. Python动态图见得多了?Excel:亦可赛艇!我可是身经百战了

    作者:Ryoko量子 来源:凹凸数据 朋友圈又看到 Python 广告推送了,什么"你还在用 Excel 加班啊"."我一进去就看见 Python 在打 Excel 啊& ...

  5. python动态图的绘制和保存

    前言 这段时间要做一个涉及排队论的数学建模,需要动态绘图.建好了模,却没想到在原以为简单的绘图上耗费了我大量时间.原因在于用python作动态绘图的参考资料过于琐碎.因此在我费了九牛二虎之力终于实现动 ...

  6. python动态图-python之最炫抖音动态图

    原标题:python之最炫抖音动态图 我们使用2013 年-2019 年比特币(BTC) 的价格数据绘制面积图动画,其HTML 交互效果页面如图11-4-6 所示.该数据集包括四列数据:年份(year ...

  7. python动态图-Python图像处理之gif动态图的解析与合成操作详解

    本文实例讲述了Python图像处理之gif动态图的解析与合成操作.分享给大家供大家参考,具体如下: gif动态图是在现在已经司空见惯,朋友圈里也经常是一言不合就斗图.这里,就介绍下如何使用python ...

  8. python动态图-Python处理gif动态图的解析与合成操作的介绍

    本篇文章给大家带来的内容是关于Python处理gif动态图的解析与合成操作的介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 本文实例讲述了Python图像处理之gif动态图的解析 ...

  9. 优雅的 Python 动态图工具

    作者 | pythonic生物人 来源 | pythonic生物人 数据动态图怎么做,效果图, 多子图联动竞赛图 安装 pip install pandas_alive#或者 conda instal ...

最新文章

  1. 2022-2028年中国电力行业节能减排投资分析及前景预测报告
  2. php中pre标签,html中pre标签与code标签的作用与用法
  3. Log4j 日志详细用法
  4. mugen4g补丁如何使用_客户端与WSUS如何连接,补丁审批,下载安装(3)
  5. python用另一个字段替代本字段的null_Python中的数据库
  6. 【译】NoClassDefFoundError和ClassNotFoundException的不同
  7. 一个数据库的所见即所得的好工具
  8. Paint的方法总结(一):基本常用Api
  9. 3. Javascript 对象
  10. 【活字格案例】综合报表信息管理系统搭建
  11. NC - 网络编码的Java实现(1)-GF28基本运算
  12. 创客(米思奇编程)-03-传感器
  13. 以逗号为分隔符对字符串进行分隔
  14. 六张图片形成立方体并旋转
  15. 【LG5055】可持久化文艺平衡树
  16. 对话上海财经大学ITCS主任陆品燕教授:如何用一年时间,建设国际一流理论计算机研究中心?...
  17. 王唯佳被南开计算机学院录取,662分!庞贝病少年王唯佳被南开大学录取
  18. grunt 使用教程及步骤
  19. 国产半桥驱动IC屹晶微_EG2014_搭建H桥_立创eda
  20. 微信小程序 之 初体验(24点游戏)

热门文章

  1. Vue.js经典项目:TodoMvc
  2. 基本数据类型和表达式(下)7-1 快速求和 (10 分)
  3. 什么是 DNS DMARC 记录?
  4. vscode实现自动导入python包配置
  5. grep -F 用法
  6. SQL截取字符串替换
  7. 五月集训(第七日)哈希表
  8. javascript大全二
  9. gitLab汉化出错问题
  10. 数据库系统原理与应用教程(073)—— MySQL 练习题:操作题 131-140(十七):综合练习