中国大陆哪个省的人最长寿?Python动态图帮你盘点!

深度学习框架PyTorch入门与实践:第一章 PyTorch简介 本章为PyTorch简介。主要内容包括:PyTorch的诞生过程,常见主流深度学习框架的优劣,PyTorch相比这些框架的优势等。 阅读详情

开场段子 ????

俗话说,人到中年不得已,保温杯里泡枸杞。健康长寿是大家非常关注的人生重要目标。

《2016 年世界卫生统计》显示:中国人的预期寿命为 76.1 岁。处于世界中等水平。世界上预期寿命最长的国家是日本,高达83.7岁。

那么,中国国内哪个省份的人口预期寿命最高呢?我们用Python动态图来盘点一下。

先上图片

再上视频

最后上代码

import numpy as np 
import pandas as pd 
import geopandas as gpd 
import shapely 
from shapely import geometry as geo 
from shapely import wkt 
import geopandas as gpd 
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 html_to_gif(html_file, gif_file, duration=0.1):
    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]
    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

def getCoords(geom):
    if isinstance(geom,geo.MultiPolygon):
        return [np.array(g.exterior) for g in geom.geoms]
    elif isinstance(geom,geo.Polygon):
        return [np.array(geom.exterior)]
    elif isinstance(geom,geo.LineString):
        return [np.array(geom)]
    elif isinstance(geom,geo.MultiLineString):
        return [np.array(x) for x in list(geom.geoms)]
    else:
        raise Exception("geom must be one of [polygon,MultiPolygon,LineString,MultiLineString]!")

#底图数据
dfprovince = gpd.read_file("./data/dfprovince.geojson").set_crs("epsg:4326").to_crs("epsg:2343")
dfnanhai = gpd.read_file("./data/dfnanhai.geojson").set_crs("epsg:4326").to_crs("epsg:2343")
dfline9 =  dfnanhai[(dfnanhai["LENGTH"]>1.0)&(dfnanhai["LENGTH"]<2.0)]

#多边形数据
dfpolygons = pd.read_csv("./data/macro_data_china.csv")[["省份","预期寿命"]]
dfgeoms = dfprovince[["name","geometry"]].rename({"name":"省份"},axis = 1) 
df = dfpolygons.merge(dfgeoms)
df["省份"] = [x if "自治区" not in x else x[0:2] for x in df["省份"]]
df = df.sort_values("预期寿命").set_index("省份")

def polygon_map_dance(df,title = "中国大陆各省市人口预期寿命",
                     filename = None,
                     figsize = (8,6),dpi = 144,
                     duration = 0.5,
                     anotate_points = ["北京市","上海市","江西省","湖北省","青海省","黑龙江省","广东省"]):

    fig, ax_base =plt.subplots(figsize=figsize,dpi=dpi)
    ax_child=fig.add_axes([0.800,0.125,0.10,0.20])
    
    def plot_frame(i):

        ax_base.clear()
        ax_child.clear()

        #============================================================
        #绘制底图
        #============================================================

        #绘制省边界
        polygons = [getCoords(x) for x in dfprovince["geometry"]]
        for j,coords in enumerate(polygons):
            for x in coords:
                poly = plt.Polygon(x, fill=True, ec = "gray", fc = "white",alpha=0.5,linewidth=.8)
                poly_child = plt.Polygon(x, fill=True, ec = "gray", fc = "white",alpha=0.5,linewidth=.8)
                ax_base.add_patch(poly)
                ax_child.add_patch(poly_child )

        #绘制九段线
        coords = [getCoords(x) for x in dfline9["geometry"]]
        lines = [y for x in coords for y in x ]
        for ln in lines:
            x, y = np.transpose(ln)
            line = plt.Line2D(x,y,color="gray",linestyle="-.",linewidth=1.5)
            line_child = plt.Line2D(x,y,color="gray",linestyle="-.",linewidth=1.5)
            ax_base.add_artist(line)
            ax_child.add_artist(line_child)



        #设置spine格式
        for spine in['top','left',"bottom","right"]:
            ax_base.spines[spine].set_color("none")
            ax_child.spines[spine].set_alpha(0.5)
        ax_base.axis("off")


        #设置绘图范围
        bounds = dfprovince.total_bounds
        ax_base.set_xlim(bounds[0]-(bounds[2]-bounds[0])/10, bounds[2]+(bounds[2]-bounds[0])/10)
        ax_base.set_ylim(bounds[1]+(bounds[3]-bounds[1])/3.5, bounds[3]+(bounds[3]-bounds[1])/100)

        ax_child.set_xlim(bounds[2]-(bounds[2]-bounds[0])/2.5, bounds[2]-(bounds[2]-bounds[0])/20)
        ax_child.set_ylim(bounds[1]-(bounds[3]-bounds[1])/20, bounds[1]+(bounds[3]-bounds[1])/2)

        #移除坐标轴刻度
        ax_child.set_xticks([]);
        ax_child.set_yticks([]);

        #============================================================
        #绘制散点
        #============================================================

        k = i//3+1
        m = i%3
        text = "NO."+str(len(df)+1-k) 

        dfdata = df.iloc[:k,:].copy()
        dftmp = df.iloc[:k-1,:].copy()

        # 绘制散点图像
        if len(dftmp)>0:
            polygons = [getCoords(x) for x in dftmp["geometry"]]
            for j,coords in enumerate(polygons):
                for x in coords:
                    poly = plt.Polygon(x, fill=True, ec = "gray", fc = cmap[j],alpha=0.5,linewidth=.8)
                    poly_child = plt.Polygon(x, fill=True, ec = "gray", fc = cmap[j],alpha=0.5,linewidth=.8)
                    ax_base.add_patch(poly)
                    ax_child.add_patch(poly_child)

            # 添加注释文字
            for j,p in enumerate(dftmp.index):
                poly = dftmp.iloc[j]["geometry"]
                pt = poly.representative_point() 
                if p in anotate_points:
                    ax_base.annotate(p,xy = (pt.x,pt.y), xycoords = "data", xytext = (-15,10),
                    fontsize = 10,fontweight = "bold", color = cmap[j], textcoords = "offset points")

        # 添加标题和排名序号
        ax_base.text(0.5, 0.95, title, va="center", ha="center", 
                    size = 12,transform = ax_base.transAxes)
        ax_base.text(0.13, 0.9, text, va="center", ha="center", 
                 alpha=0.5, size = 30,transform = ax_base.transAxes)

        # 添加注意力动画
        if m==0:
            poly = dfdata.iloc[-1]["geometry"]
            pt = poly.representative_point() 
            px,py,pz = pt.x,pt.y,dfdata.iloc[-1]["预期寿命"]
            p = dfdata.index[-1]+":"+str(pz)

            fact = 1.5
            geom = shapely.affinity.scale(poly, xfact= fact, yfact= fact)

            coords = getCoords(geom)
            for x in coords:
                poly = plt.Polygon(x, fill=True, ec = "gray", 
                       fc = cmap[k-1],alpha=0.5,linewidth=.8,zorder = 4)
                ax_base.add_patch(poly)

            ax_base.annotate(p,xy = (px,py),  xycoords = "data",
                    xytext = (-15,10),fontsize = 20,fontweight = "bold",
                    color = "black", textcoords = "offset points",zorder = 5)

        if m==1:
            poly = dfdata.iloc[-1]["geometry"]
            pt = poly.representative_point() 
            px,py,pz = pt.x,pt.y,dfdata.iloc[-1]["预期寿命"]
            p = dfdata.index[-1]+":"+str(pz)

            fact = 1.25
            geom = shapely.affinity.scale(poly, xfact= fact, yfact= fact)

            coords = getCoords(geom)
            for x in coords:
                poly = plt.Polygon(x, fill=True, ec = "gray", 
                       fc = cmap[k-1],alpha=0.5,linewidth=.8,zorder = 4)
                ax_base.add_patch(poly)
            ax_base.annotate(p,xy = (px,py),  xycoords = "data",
                    xytext = (-15,10),fontsize = 15,fontweight = "bold",
                    color = "black", textcoords = "offset points",zorder = 5)

        if m==2:
            poly = dfdata.iloc[-1]["geometry"]
            pt = poly.representative_point() 
            px,py,pz = pt.x,pt.y,dfdata.iloc[-1]["预期寿命"]
            p = dfdata.index[-1]+":"+str(pz)

            fact = 1.0
            geom = shapely.affinity.scale(poly, xfact= fact, yfact= fact)

            coords = getCoords(geom)

            for x in coords:
                poly = plt.Polygon(x, fill=True, ec = "gray", 
                       fc = cmap[k-1],alpha=0.5,linewidth=.8,zorder = 4)
                ax_base.add_patch(poly)

            ax_base.annotate(p,xy = (px,py),  xycoords = "data",
                    xytext = (-15,10),fontsize = 10,fontweight = "bold",
                    color = "black", textcoords = "offset points",zorder = 5)
                
    my_animation = animation.FuncAnimation(fig,plot_frame,frames = range(0,3*len(df)),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"
polygon_map_dance(df,filename = html_file)

gif_file = html_file.replace(".html",".gif")
html_to_gif(html_file,gif_file,duration=0.8)

收工。????

万水千山总是情,点个在看行不行?

matplotlib——配置参数 matplotlib 是一个开源项目,由 John Hunter 发起。关于 matplotlib 的由来,有一个小故事。John Hunter 和他研究癫痫症的同事借助一个专有软件做脑皮层电图分析,但是他所在的实验室只有一份该电图分析软件的许可。他和许多一起工作的同事不得不轮流使用该软件的硬件加密狗。于是,JohnHunter 便有了开发一个工具来替代当前所使用的软件的想法。当时MATLAB被广 阅读详情

相关推荐

geoJson 各地市各县的 JSON地图文件

解压缩后有两个文件夹和一个 JSON 文件: geometryCouties:各市~县的数据 geometryProvince:各省~市的数据 china.json:中国~省的数据

(13)雅思屠鸭第十三天:小作文攻略

非谓语动词

miya的博客 4465

【RViz2】导入urdf模型时报错:Could not load resource xxx,Unable to open file xxx,Error retrieving file xxx

初学ROS2,想要在RViz2中显示urdf模型。其中.urdf文件引用了外部的meshes文件夹。

qq_43557907的博客 9489

Gif动态图

代码其实很简单,直接接入正题 1.下载GifView的jar包,添加到libs中,且右击jar包Build Path→Add to Build Path 2.xml布局,找到gifview         android:id="@+id/gif1"         android:layout_width="match_parent"         android:lay

LK764265808的博客 28万+

nnU-Net v2实战:从零开始配置环境与训练自定义医学影像数据集

本文详细介绍了nnU-Net v2在医学影像分割中的实战应用,从环境配置到自定义数据集训练的全流程。重点讲解了Python 3.9+环境搭建、PyTorch安装技巧、医学影像数据预处理规范,以及五折交叉验证训练方法,帮助开发者快速掌握这一先进的医学影像分析工具。

weixin_28718487的博客 352

workbench谐响应

定义材料 打开Engineering Data定义材料,在分析时不同部分选择不同材料 建模 打开Geometry建模,我举的例子很简单就一根光秃秃的轴 因为要加轴承,在轴上创建imprint face 因为要用point mass代替轴上原来的盘,在轴上盘的位置新建一个Plane,用Slice方法将轴从XYPlane3分成两段 施加边界条件以及谐响应分析 打开Model 1.在两段轴的交界面处,创建Point Mass,输入质量与转动惯量,位置在轴线上 2.mass point promote to.

my blogs include programming, math, physics.回首过去,放眼未来。 leslielee.blog.youkuaiyun.com 5886

gif动态图合成

import imageio def create_gif(image_list, gif_name): frames = [] for image_name in image_list: frames.append(imageio.imread(image_name)) # Save them as frames into a gif ...

Elag的专栏 18万+

HR离职预测模型实战:可解释、可干预、可落地的三层架构

员工离职预测本质上是组织健康度的早期诊断技术,其核心原理在于从行为、心理与结构数据中识别稳定性衰减信号。该技术的价值不仅在于提升预测准确率,更在于将模糊的‘人才风险’转化为可归因、可干预的具体因子,如工龄阶段、满意度落差、薪酬分位数等。典型应用场景覆盖HRBP主动留任、业务部门梯队预警及HRIS系统智能升级。本文聚焦于构建具备业务可解释性与操作闭环能力的离职预警模型,深度融合HR工作流与机器学习工程实践,尤其强调逻辑回归基线、特征业务化重构及三层递进式架构设计。

赵士杰的博客 388

计算机视觉——【python】基于matplotlib绘图库的图表参数设置

基于matplotlib绘图库的图表参数设置 编程语言:python 编辑器:jupyter notebook 在使用python语言进行测试模型或者运行代码时,不免会使用到图表的绘制和图像的显示,这里简单说一下matplotlib库中pyplot函数的一些设置问题。 小提醒 导入所需要的库 import matplotlib.pyplot as plt 若希望将matpl...

技术更新每天 1824

【CSP-J/S初赛知识点整理】

CSP-J/S初赛知识点整理

qq_43884946的博客 1万+

深度学习模型轻量化方法之【量化】

量化虽然有着硬件友好和功效提升的特点,但它也引入了模型性能的折衷。因此,设计有效的量化策略需要在模型大小、性能以及运算速度之间做出平衡。随着深度学习算法和硬件加速技术的快速发展,量化方法在使深度网络轻量化和提高部署效率方面持续发挥着重要作用。

m0_73916791的博客 2850

Python学习之生成带logo背景图的二维码(静态和动态图)

以上就是Python代码对二维码生成处理的示例,根据不同需求可以选择qrcode模块或者MyQR模块来实现,希望对看到的小伙伴有帮助作用。

分享型博主 2260

Label Studio 数据标注平台,大模型预训练与微调必备

摘要:LabelStudio是一款开源数据标注工具,支持文本、图像等多种数据类型的标注。本文介绍了其安装方法(通过conda创建环境并pip安装)、基础使用流程(创建项目、导入数据、设置标签、标注导出)以及AI自动标注功能的实现。重点讲解了如何通过MLBackend集成LangChain模型实现自动标注:创建自定义模型类、构建预测链、处理返回结果,最后配置到LabelStudio项目中。该功能可显著提升标注效率,标注人员只需在AI预测结果基础上进行修正。

技术引领业务创新 290

MoviePy 数据动态可视化 图像转动态图或者视频

转载自:  http://zulko.github.io/blog/2014/11/29/data-animations-with-python-and-moviepy/ Data Animations With Python and MoviePy Nov 29th, 2014 | Comments Python has some great data visua

xiaojiajia007的博客 1万+

AI编程工具到底是初学者的绊脚石还是垫脚石?

现在是AI时代,我们要做的,是学会拥抱AI、使用AI,成为AI的驾驭者,如果你因为害怕使用AI学不到东西,那么大可不必,因为AI必然是今后的趋势,相信会用AI在今后的求职面试中也会有很大的占比。另外我之前写了多篇有关AI编程开发工具Trae的使用技巧和教程,需要的话你可以关注公众号后通过菜单栏获取。另外我也把所有Trae相关的文章整合到了腾讯ima知识库,感兴趣的可以关注公众号以后回复。

cpp加油站的专栏 189

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

【爬虫】邪恶gif图出处爬虫

这是一个罪恶的爬虫 爬取 http://www.27gif.net/gifcc 中的gif图,并以‘神秘代码’为它的文件名保存。 ------------------------------------------------------------------------------------------------------ import requests from bs4...

weixin_30646505的博客 3万+

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

开发笔记、记录常用命令

linux容器操作基础命令

ppp1512的博客 1252

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

matplotlib:将动画输出为动画文件、HTML(标签文本、文件、嵌入jupyter notebook)

当前有效matplotlib版本为:3.4.1。 概述 FuncAnimation是matplotlib生成逐帧动画的常用类,它的工作原理就是按照一定时间间隔不断调用参数func对应的函数生成动画。 FuncAnimation的继承关系如下: matplotlib.animation.Animation→matplotlib.animation.TimedAnimation→matplotlib.animation.FuncAnimation 基类matplotlib.animation.Animation

mighty13的专栏 3万+

日本語三級 

http://jp.hjenglish.com/list/4323?page=4 转载于:https://www.cnblogs.com/redfox241/archive/2008/02/14/1069139.html

weixin_30702887的博客 2万+

B站小甲鱼零基础python视频P57爬取煎蛋网OOXX妹纸图代码修改

问题描述 在B站看[小甲鱼]零基础入门学习PythonP57集时遇到了一些问题,现在煎蛋网的的图片每一页的网址和视频里的不太一样,看弹幕有的说能爬,有的说不能爬,也没有标明日期,当时挺懵逼的,不知道该怎么办,硬着头皮看到最后,发现有弹幕说是用了base64加密,其它弹幕反响不错,感觉挺靠谱的,就百度了一下,最后终于成功爬取。小甲鱼的视频看到这里,这应该是第一个让我小有成就的实例,在这里分享给大家,希望和我遇到同样问题的朋友都能完成并继续学习下去,加油诸位。 具体参考了这篇文章https://blog.csd

hahah1024的博客 1万+

Python 绘图问题:Matplotlib中plt.rcParams[]使用方法 rcsetup.py matplotlibrc

参考文章1: plt.rcParams[] https://www.cnblogs.com/pacino12134/p/9776882.html 参考文章2: matplotlib:plt.rcParams设置画图的分辨率,大小等信息 https://www.cnblogs.com/yxh-amysear/p/9501238.html 参考文章3: Python绘图问题:Matplotlib中rc...

Dontla的博客 5547

数据可视化|用动态折线图分析疫情

01截止到 2020 年 7 月 12 日零点,新冠病毒全球累计确诊人数超过 1280 万人,美国单日新增确诊人数再破纪录,7 月 11 日这一天新增确诊人数就接近 7 万人。为了直观地...

SeizeeveryDay的博客 6530

用matplotlib中的FuncAnimation()实现GDP世界排名动态图

很久以前写过一篇使用Matplotlib实现GDP世界排名动态图,具体可以参考:https://blog.youkuaiyun.com/yeshang_lady/article/details/106040579。 但当时最终的动态图的实现方法非常笨拙,所以这里用maplotlib中的动态图函数FuncAnimation()重新实现制作一遍。数据集可以在原博文给出的网盘链接中下载。具体代码如下: import pandas as pd import matplotlib as mpl from matplotlib

读万卷书 行万里路 2006

新型冠状肺炎全球排名前15位国家感染人数及动态排序图制作,从1月底到5月初

首先爬取who官网疫情数据,由于动图制作数据太多报错,因此截取其排名前15国家。 效果如下: 由于文件太大,csdn只支持5兆上传,因此压缩后模糊了 完整代码如下: import pandas as pd import matplotlib import matplotlib.pyplot as plt import matplotlib.ticker as ticker import mat...

weixin_42464154的博客 1920

matplotlib animation动画保存(save函数)详解

本文主要介绍matplotlib中animation如何保存动画,从matplotlib的一些基础代码说起,并在最后附上了解决save()函数报错的代码,其中的一些代码涉及到__getitem__()方法和注解修饰的知识,如果没有了解的朋友希望先去查一下相关的知识了解一下 一些介绍 rcParams MovieWriter:class for writing movies animati...

sailist的记录站 3万+

用 python 制作超燃动态排序图

用 python 制作超燃动态排序视频 在开始之前,先贴张图,之前网上一段时间下面这种排序风格视频很火,下面这张图当作是视频其中的一帧。 制作这样视频的原理:就是把不同的帧组合在一起拼接成视频;把不同时间的排序图拼接在一起,拼接在一起形成一个随时间快速变化的动画,转化成视频,为了观看效果加一首很燃的BGM,最后的效果很赞。 这种视频 python 也能做,基本上分为三大部分,主要用到的就是两个库...

小张Python 3783
上一篇: 全国各省市高考有多难?Python动态图给你盘点!
下一篇: 北京旅游攻略?Python动态图给你展示!
算法美食屋
博客等级 码龄9年 2万+粉丝 154原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值