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

当Python遇上高考,会发生什么? 延期一个月之后,今天,1071万考生终于走入考场。 这届高考太难了,不仅考学生,更是考验疫情的防控能力。 但是说到难,2018年浙江省教育厅的一个决定,让不少人感叹真难! 原来早在2017年底,就有消息称浙江省信息技术课程改革方案已经出台,确定将Python纳入浙江省信息技术高考! 纳尼?Python纳入高考?为什么?怎么考?想想都很难! 经了解,才明白,原来是纳入高考选考! 虽然是选考,但是看看现在市面上涌现了那么多少儿编程培训机构,可见编程越来越向低龄人群进... 阅读详情

开场段子???? :

下面我们用平行坐标系图来直观呈现全国各省市高考难度(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 Image

plt.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'] = 100

def 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_file

cmap = [
'#2E91E5',
'#1CA71C',
'#DA16FF',
'#B68100',
'#EB663B',
'#00A08B',
'#FC0080',
'#6C7C32',
'#862A16',
'#620042',
'#DA60CA',
'#0D2A63']*100


df = 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+1
        m = i%n

        dfvalues = 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-1
        y = 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 20
            ax.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 HTML
            HTML(my_animation.to_jshtml())
            return HTML(my_animation.to_jshtml())
        except ImportError:
            pass
    else:
        my_animation.save(filename)
        return filename

html_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对象来构建平行坐标系图。

收工。????

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

3天干完6个月的活,Claude把模型搬上AMD 一条挺刺激的消息:Anthropic 给投资人的材料里有一张幻灯片,写着它的 Claude Mythos Preview 只花了大约​,就摸清了怎么让另一个 Claude 模型在 AMD 的 MI355X 上跑起来。同一处还写了个对照数字:过去给一块新芯片做推理适配,通常要几十名工程师、​。3 天对 6 个月,这个比值太扎眼,当天中文互联网上就冒出一堆「英伟达的护城河塌了」的说法。我把能翻到的材料都翻了一遍,越看越觉得,塌掉的那一小块是真的,可塌的位置和很多人想的不一样。 阅读详情

相关推荐

如何处理动态语言(Python / JS)的“隐形”调用链?

本文揭示动态语言(Python/JS)中静态AST解析导致调用链“断链”的核心问题,提出通过运行时追踪补全图谱的解决方案。基于Code-Graph-RAG的cgr trace机制,分别利用pytest插件与V8 Profiler捕获真实调用路径,将动态边合并至静态图谱,并在权重体系中提升动态边优先级。实践表明,该方法可显著提升图谱覆盖率,实现“结构+行为”双视角理解代码,为MCP与Rerank系统提供可靠支持。

xianyinsuifeng的博客 421

本地化部署 DeepSeek,构建单细胞与空间转录组 AI 分析平台

本地化部署 DeepSeek,构建单细胞与空间转录组 AI 分析平台

weixin_53637133的博客 181

Playwright: Pytest vs Library vs LibraryAsync:三者如何选?

Python中Playwright的3个Target:Pytest(推荐用于E2E自动化测试,支持报告、并行、重试)、Library(同步脚本,适合爬虫与简单任务,需手动管理浏览器)、LibraryAsync(异步脚本,适用于高并发批量操作)。选择依据:测试项目选Pytest,轻量脚本选Library,高并发场景选LibraryAsync。

SmallBull的博客 224

【第 009 讲】全面掌握 Python 注释:注释的定义与作用 | 单行注释 | 三引号与多行注释 | 注释使用的最佳实践

本文系统讲解 Python 注释的完整知识体系:从注释的定义与作用讲起,梳理单行注释的书写位置、临时屏蔽用法与 PEP 8 排版规范,剖析注释被忽略的底层机制;进而说明三引号字符串的本质与嵌套问题;最后给出注释使用的三条实践原则,帮助读者写好可读性高的注释。

大模型全栈工程师 · Thanks_ks 579

Linux下Linpack测试GPU和CPU性能

前面的文章已经介绍了如何搭建Linpack环境:https://blog.youkuaiyun.com/liu_feng_zi_/article/details/107429720 接下来说明如何使用 一、编写运行脚本: 新建文件:run_linpack.sh,内容如下: export HPL_DIR =/root/LHC/Linpack/hpl-2.0_FERMI_v15 export MKL_NUM_THREADS=6 export OMP_NUM_THREADS=6 export MKL_DYNAMI.

liu_feng_zi_的专栏 4634

【正点原子I.MX6U-MINI移植篇】Ubuntu-base根文件系统移植构建过程详解(四)

能不能在ARM板上运行Ubuntu呢?答案肯定是可以的,Ubuntu是Linux系统的一种,可以简单的将Ubuntu理解为一个根文件系统,和我们用busybox、buildroot制作的根文件系统一样。因此移植Ubuntu也就是将Ubuntu根文件系统移植到我们的开发板上。

果果小师弟的博客 3773

Python 的 yield from 到底转发了什么:拆开 send、throw 和那个 return 值

很多人把yield from记成「省一层 for 循环的语法糖」。写和写,结果看着一样,于是就当它只是少敲几个字。这个理解会在三个地方翻车:调用方.send()的值送不进去、子生成器return的值拿不到、异常和close()传不下去。yield from真正做的事是,外层生成器退成一个透明通道。本文所有输出来自本机 CPython 3.13.14 实测。yield from不是循环,是委托——nextsendthrowclose四个方向的流量全部直通子生成器,并且子生成器return。

小小张说故事的博客 152

金蝶云星空v8.0私有化部署与cpolar内网穿透:构建企业级远程ERP访问通道

本文详细介绍了金蝶云星空v8.0企业版的私有化部署流程与cpolar内网穿透技术,帮助企业构建安全高效的远程ERP访问通道。从系统环境准备、SQL Server配置到内网穿透安全加固,提供全流程实战指导,助力企业实现本地部署与远程办公的无缝衔接。

weixin_28736335的博客 377

AI全栈实战 | 3.9-01 爬虫入门:requests 加 BeautifulSoup 三分钟跑通,但 90% 的人栽在这 4 个“礼貌“问题上

⚠️:本文内容仅用于。请遵守目标站点的服务条款与相关法律法规,不得对目标服务造成负担,不得采集、传播个人隐私数据。技术是中性的,边界在你手里。爬虫的入门技术(requests 发请求 + BeautifulSoup 解析)三分钟就能学会。真正区分"会用爬虫"和"会做爬虫的人"的,是这篇我们跑通"请求→解析→存储"的最小闭环,然后重点把"合规与礼貌"这根弦给你绷上。

源码获取 | 运行部署 | 定制二开修改,如果回复不及时请耐心等待,请见谅。 436

MCP4728 电路及stm32F103程序移植

写在前面 通过优快云查到一些MCP4728 的程序,结合程序及datasheet对于驱动的描述,理清了思路 感谢开路者! MCP4728的电路比较简单,见下文描述 应用电路 datasheet: 实际测试电路: SCL接stm32的PB10,SDA接PB11 RDY/BSY引脚和LDCA引脚,悬空 解释见截图: MCP4728地址 选择任意输出通道写入DAC输入寄存器 应用程序 int mcp4728_write_all_channel(float vol1, float vol2, fl

u013074298的专栏 5428

YOLO模型从10MB瘦到2MB!剪枝+INT8量化双方案(精度损失<1%,附部署代码)

摘要:本文介绍了一种针对边缘设备的YOLO模型轻量化方案,通过"结构化剪枝+INT8量化"组合技术,将YOLOv8n模型从6.4MB压缩至2MB,体积减少68.75%,推理速度提升80%,同时保持精度损失小于1%。文章详细讲解了剪枝工具选择、通道剪枝实现、量化校准等关键步骤,并提供了完整的代码示例。特别强调了剪枝保留率、校准集使用、微调必要性等实践要点,帮助开发者在树莓派等资源受限设备上实现高效目标检测。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 757

从一段视频到可漫游的 4D 有声场景:思路拆解与最小复现手记

只需一段手机视频,你就能生成可"走进去"的 4D 有声场景:转头时狗叫声方向随之变化,走近时声音更清晰。本文拆解 Video-to-4DAVScene 的核心思路,手把手带你用几十行 Python 搭出最小管线,把视频中的运动物体变成带空间位置的声源,并附上三个真实踩坑的排障经验,代码可直接跑。🎧

helloagent的博客 243

C和C++Everything教程的简介

C和C++Everything教程的简介 C和C++Everything教程,该专栏目前已有8000博文,订阅该专栏相当于同时订阅以下所有收费专栏

希望我的博客,能帮上你解决学习中工作中所遇到的问题 4394

【每天一个 Python 小案例30】Python 基础知识综合小项目:我的工具盒

作为系列收官,本篇把前 29 篇的知识点合成一个能直接用的命令行工具"我的工具盒":计算器(用 ast 解析表达式,不碰 eval)、单位换算与温度转换(一张换算表 + 特例分支)、记账与分类统计(Decimal + JSON 持久化)、以及用"字典当命令表"把菜单和业务逻辑解耦的主循环。文中对比了 eval 的安全隐患与 ast 白名单的做法,解释了 lambda 闭包在字典里的写法与晚绑定陷阱,并在最后给出整个系列的知识地图,把变量、数据结构、控制流、函数、类、异常、文件、标准库八块内容对应到具体篇目。

xinjiyaya的博客 428

openclaw update时出现Skipped:this OpenClaw install isn‘t a git checkout,and the package manager解决方案

本文主要介绍了openclaw update时出现openclaw update时出现Skipped:this OpenClaw install isn’t a git checkout,and the package manager解决方案,希望能对使用openclaw的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 12万+

让 ABAP 程序天生可翻译:Text Symbols 与 Text Pool 从入门到工程化落地

ABAP 国际化实践:Text Symbols 的工程价值与落地方法 摘要: 本文系统阐述了 ABAP 开发中 Text Symbols 的核心价值与实践方法。通过解耦程序逻辑与语言文本,Text Symbols 实现了代码国际化,避免了硬编码带来的维护难题。文章详细介绍了 Text Pool 结构、两种引用方式(独立引用 TEXT-001 和附着式 '(001)'),以及 SE38 和 SE63 的翻译流程。特别强调最大长度预留、术语统一等工程实践,并提供了 READ TEXTPOOL 自动化检查方案。最

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 247

yolo 和 deft 算法的区别

你应该是打错了:是,不是 defrat;

曾大强博客 259

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级 备考:莫队算法离线区间查询详解

备赛进行时:第十八届蓝桥杯软件赛报名已于 2026-10-08 10:00 开启、12-18 14:00 截止,省赛定在 2027-04-10(C/C++·Python 程序设计 9:00–13:00);中国电子学会 2026 年 12 月软件编程(C/C++ 一级至十级、Python 一级至六级)考级报名 9/23–12/2 16:00、统考 12-12;全国青少年信息素养大赛 2026—2027 赛季算法应用主题赛也已进入复盘练兵窗口。

IT_Scratch的博客 179

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

两张表合并之后,行数悄悄多了一倍

pandas merge 行数异常膨胀源于右表键不唯一,导致数据静默复制。实测显示,未聚合的右表(756行)与左表合并后行数增至504行,合计膨胀3.5倍,但无报错。validate 参数仅在检查键唯一性时有效,one_to_one 和 many_to_one 可拦截问题,但需结合 duplicated() 前置检查。正确做法为先按键聚合右表,再合并,避免重复。建议合并前后核对行数、合计,并使用 indicator=True 排查匹配情况,确保数据一致性。

patrickstar231的博客 244

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

我用 200 行代码写了个“代码屎山检测器“,扫完公司的老项目后我沉默了

这个工具不能帮你把屎山铲平,但至少能让你知道自己面对的是多大的山,也能在代码评审时用数据说话——“这个 PR 把圈复杂度从 12 推到了 18,能不能拆一下?毕竟,不能量化的东西,就没法改进。

xixiaoyunya的博客 253

智慧农业实战:育秧车间秧盘计数与苗情分级的Python实现

首先,建立统一的数据结构,保存每盘秧苗的编号、批次、覆盖度、叶色得分和播种天数。A = "壮苗"B = "合格苗"C = "弱苗"@dataclassdays: int。

荆棘鸟智能的博客 134

Java Arrays.asList 常见坑详解|UnsupportedOperationException、数组联动、基本类型 bug

解析 Arrays.asList 常见开发陷阱,演示 UnsupportedOperationException、底层数组引用共享、基本类型数组问题,区分 Arrays 内部 ArrayList 与 java.util.ArrayList,给出数组转 List 的各种场景正确代码。

weixin_42617033的博客 506

【随笔】KV缓存量化:省下的显存,要付出多少数值误差

用可运行量化器解释位宽、比例信息、分组和离群值的关系,核算KV缓存实际载荷,并给出Transformers配置与容量、延迟、质量验收方法。

code2cat的博客 474

【每天一个 Python 小案例29】Python 实现商品购物车

本篇实现一个购物车:商品目录、加入商品、修改数量、移除商品、查看小计、计算满减与 VIP 折扣、结算扣库存。核心设计是"目录与购物车分离"——目录存商品主数据,购物车只存 {商品编号: 数量};金额一律用 Decimal 并做 ROUND_HALF_UP 舍入。折扣部分讲清阶梯满减的匹配顺序(阈值从高到低、命中即停)与叠加顺序(先满减、后打折),并用一次完整结算演示 706 元如何变成 613.70 元。

xinjiyaya的博客 218

Python的字典

Python字典是存储键值对的数据结构,通过键(key)快速查找对应的值(value)。可使用{}定义,支持增删改查操作:通过dict[key]查询或修改值,get()方法安全获取并设置默认值,del dict[key]删除键值对,keys()、values()和items()用于遍历。items()结合双变量循环可高效遍历所有键值对,提升代码可读性与灵活性。

qq_43010954的博客 199

基于深度学习的工业表面缺陷检测系统-毕业设计

只用正常样本训练的工业表面缺陷检测系统:15 类工业品、5354 张图、73 种缺陷。PatchCore-lite 图像级 AUROC 0.896、像素级 0.951,单张 CPU 推理 115 毫秒;附 PaDiM 与整图基线对照,含 Django 系统、论文与使用文档。

csbysj2020 199
上一篇: 用Python制作短视频之动态散点图
下一篇: 中国大陆哪个省的人最长寿?Python动态图帮你盘点!
算法美食屋
博客等级 码龄9年 2万+粉丝 154原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值