中国88个超500万人口的大中城市都在哪里?Python动态图告诉你!

Python数据分析之全球人口数据 这篇文章用pandas对全球的人口数据做个简单分析。我收集全球各国1960-2019年人口数据,包含男女和不同年龄段,共6个文件。 很多人学习python,不知道从何学起。 很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手。 很多已经做案例的人,却不知道如何去学习更加高深的知识。 那么针对这三类人,我给大家提供一个好的学习平台,免费领取视频教程,电子书籍,以及课程的源代码! QQ群:1097524789 pop_total.csv: 各国每年总人口 pop_female.csv.. 阅读详情

今日表情 ????

我国的城市层次

除港澳台外,中国一共有337个地级市(含4个直辖市)。一般综合考虑城市人口规模和城市经济发展水平等因素,可以将城市分成一线、新一线、二线、三线、四线、五线等不同层次。

下面我们来看一份第一财经新一线城市研究所发布的一份2021城市商业魅力排行榜城市层次榜单。

我国城市人口规模

如果仅仅考虑城市人口规模的话,根据最新人口普查公开数据,中国337个地级市当中,一共有88个城市超过500万个。它们是哪些城市呢?我们用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 contextily as ctx

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

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)]

#散点数据
dfpoints = gpd.read_file("./data/china_big_cities.geojson").set_crs("epsg:4326").to_crs("epsg:2343")
dfpoints["point"] = dfpoints.representative_point()
dfpoints = dfpoints.query("population>=5000000") 

df = pd.DataFrame({"x":[pt.x for pt in dfpoints["point"]],
                  "y": [pt.y for pt in dfpoints["point"]],
                  "z":[x for x in dfpoints["population"]]})
df.index = [x for x in dfpoints["city"]] 

def bubble_map_dance(df,title = "中国超500万人口城市",
                     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:
                ax_base.scatter(dftmp["x"],dftmp["y"],s = 100*dftmp["z"]/df["z"].mean(),
                       c = (cmap*100)[0:len(dftmp)],alpha = 0.3,zorder = 3)
                ax_child.scatter(dftmp["x"],dftmp["y"],s = 100*dftmp["z"]/df["z"].mean(),
                       c = (cmap*100)[0:len(dftmp)],alpha = 0.3,zorder = 3)

                # 添加注释文字
                for i,p in enumerate(dftmp.index):
                    px,py,pz = dftmp.loc[p,["x","y","z"]].tolist() 
                    if p in anotate_points:
                        ax_base.annotate(p,xy = (px,py),  xycoords = "data",xytext = (-15,10),
                        fontsize = 10,fontweight = "bold",color = cmap[i], textcoords = "offset points")
            
            # 添加标题和排名序号
            #ax_base.set_title(title,color = "black",fontsize = 12)
            ax_base.text(0.5, 0.95, title, va="center", ha="center", 
                        size = 12,transform = ax_base.transAxes)
            ax_base.text(0.5, 0.5, text, va="center", ha="center", 
                         alpha=0.3, size = 50,transform = ax_base.transAxes)

            # 添加注意力动画
            if m==0:
                px,py,pz = dfdata["x"][[-1]],dfdata["y"][[-1]],dfdata["z"][-1]
                p = dfdata.index[-1]+":"+str(pz//10000)+"万"
                ax_base.scatter(px,py,s = 800*pz/df["z"].mean(),
                   c = cmap[len(dfdata)-1:len(dfdata)],alpha = 0.5,zorder = 4)
                ax_base.annotate(p,xy = (px,py),  xycoords = "data",
                        xytext = (-15,10),fontsize = 20,fontweight = "bold",
                        color = cmap[k-1], textcoords = "offset points",zorder = 5)
                
            if m==1:
                px,py,pz = dfdata["x"][[-1]],dfdata["y"][[-1]],dfdata["z"][-1]
                p = dfdata.index[-1]+":"+str(pz//10000)+"万"
                ax_base.scatter(px,py,s = 400*pz/df["z"].mean(),
                   c = cmap[len(dfdata)-1:len(dfdata)],alpha = 0.5,zorder = 4)
                ax_base.annotate(p,xy = (px,py),  xycoords = "data",
                        xytext = (-15,10),fontsize = 15,fontweight = "bold",
                        color = cmap[k-1], textcoords = "offset points",zorder = 5)

            if m==2:
                px,py,pz = dfdata["x"][[-1]],dfdata["y"][[-1]],dfdata["z"][-1]
                p = dfdata.index[-1]+":"+str(pz//10000)+"万"
                ax_base.scatter(px,py,s = 100*pz/df["z"].mean(),
                   c = cmap[len(dfdata)-1:len(dfdata)],alpha = 0.5,zorder = 4)
                ax_base.annotate(p,xy = (px,py),  xycoords = "data",
                        xytext = (-15,10),fontsize = 10,fontweight = "bold",
                        color = cmap[k-1], 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 = "中国超500万人口城市.html"
bubble_map_dance(df,filename = html_file)

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

收工。????

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

echarts加载区域地图,并标注点 如果要把多个省放在一起展示,则把多个JSON文件里的features数据合并即可。新建nanhai.json,把下载的JSON数据放进来。效果如下,加载了南海区域的地图,并标注几个气象站点;如果打勾的话,会显示省下所有市的名字,看个人需求。说明:如果第二步不打勾,只显示省的名字,2、使用Echarts展示地图。 阅读详情

相关推荐

【小旭学长-使用python进行城市数据分析】笔记篇(上)

2021.11.1 1. 学前准备 1.1 python安装包一般有两种方法 再cmd中输入代码 pip install 包名(python自己提供的功能) conda install 包名(anaconda自己提供的功能) 区别: 【pip】 不一定会展示其他依赖包 安装包是或许直接忽略依赖项的安装,尽在结果中提示错误 【conda】 列出所需其他依赖包 安装包时自动安装期依赖项 可以便捷的在包的不同版本中切换 依赖包:大部分依赖包都是一些库文件,有动态库也有静态库,一个程序的依赖包如果没有

羊老羊 2878

全国市一级城市列表

最近的项目中,在注册页面中需要选择地区,花了大量的时间整理,现在也分享下吧,有需要的可以直接复制粘贴就好了: ['北京市|beijing|bj','上海市|shanghai|sh','天津市|tianjin|tj','重庆市|chongqing|cq','长沙市|changsha|cs', '长春市|changchun|cc','成都市|chengdu|cd',

朱麦迪的博客 7649

echart绘制海南地图时增加南海诸岛显示(现成geojson数据)

使用场景:产品经理要求展示海南地图时,需要显示南海诸岛; 问题:南海诸岛在中国地图上的显示,是echart在mapName=‘china’时,默认fix进去。但是海南省不会默认fix进去 解决方案:将南海诸岛的geojson数据想办法弄到,将其直接放在海南省地图数据里面(将三沙市删除) 处理结果: { "type": "FeatureCollection", "features": [ { "id": "460100", "type": "Feature..

dingdinghuoshan的博客 9165

中国城市字母排序

var city = [ { 'code': 'A', 'cityList': ["阿城市", "阿尔山市", "阿克苏市", "阿勒泰市", "阿图什市", "安达市", "安国市", "安康市", "安陆市", "安宁市", "安庆市", "安丘市", &quo

zhanghaipeng788的博客 1万+

实战ByteTrack:用C++手把手教你实现多目标跟踪(附完整代码解析)

本文通过C++实战教程,手把手教你实现ByteTrack多目标跟踪算法。文章详细解析了算法核心,包括利用卡尔曼滤波进行状态预测、匈牙利算法完成数据关联,以及ByteTrack独特的三次匹配策略来有效处理低置信度检测框,并提供了完整的项目架构、代码实现与性能优化指南。

yolo5detector的博客 301

从MFCC到GMM:手把手教你用Python实现说话人识别(附完整代码)

本文详细介绍了如何使用Python实现说话人识别系统,从MFCC特征提取到GMM模型训练,涵盖完整的技术流程和代码示例。通过梅尔频率倒谱系数(MFCC)和高斯混合模型(GMM)的结合,构建高效的说话人识别系统,适用于身份认证和智能交互场景。文章还探讨了从传统方法到深度学习的进阶话题,如i-vector和x-vector技术。

o1p2q3r的博客 201

Python可视化-县市按经纬度坐标在地图标记数值

一、数据文件准备1、Info.csvname,val,lat,lon 南京 ,4.23,32.04,118.78 徐州 ,4.13,34.26,117.2 睢宁 ,4.13,33.89,117.94 沛县 ,4.1,34.73,116.93 丰县 ,4.1,34.79,116.57 邳县 ,4.1,34.3,117.97 铜山 ,4.1,34.26,117.2 新沂 ,4.1,34...

Some. 2万+

CentOS 7环境下GLPI与OCS Inventory资产管理系统集成部署指南

本文详细介绍了在CentOS 7环境下,如何将GLPI与OCS Inventory两大开源工具进行集成部署,构建自动化资产管理系统。指南涵盖环境准备、核心服务安装、Web界面初始化、OCS插件配置及资产同步实战,帮助运维人员实现IT资产的自动发现、统一管理与可视化,大幅提升资产管理效率。

weixin_29274337的博客 329

Python数据可视化:Cartopy 地理空间数据可视化(二)

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。 以下文章来源于EasyShu ,作者 姜英明 绘制 GNSS 速度场 本图使用美国西部的 GNSS 测站速度场数据,数据来自加州大学圣迭戈分校。在使用ax.quiver()方法绘制站速度矢量时,由于 matplotlib 自动确定的矢量长度比较短,不能够表现足够的细节。因此使用scale_units属性指定矢量长度单位,然后使用scale设置缩放程度。加州西部是著名...

Python案例分享,B站视频教程:https://space.bilibili.com/523606542 3447

centos7部署mysql8.0.35,主从复制,主主集群

centos7 linux部署mysql,主从复制,主主模式

zaixiaqin的博客 1990

android6 usb默认文件管理,不弹RSA配对提示框

本文修改针对 高通 Android6.0.1 出user版本时 https://www.cnblogs.com/Jokeyyu/p/7424262.html http://blog.youkuaiyun.com/sinc00/article/details/44957943 diff --git a/frameworks/base/packages/SystemUI/src/com/android...

木叶风的博客 692

全国省市数据表(sql版)

drop table TProvinceAndCityGOCreate Table TProvinceAndCity(PKey int identity(1,1) not null,Province nvarchar(32) null,City nvarchar(32) null)GoBEGIN TRANSACTION ; SELECT TOP 1 0 FROM TProvinceAndCit

chuxue1342的专栏 6334

30 中望CAD二次开发(ZRX C++)-windows下的qt开发

本文介绍了中望CAD在windows下,如何使用qt开发插件界面,给出了具体的编码步骤,并生成了模态对话框和非模态对话框,其中非模态对话框可以调用CAD命令,实现交互操作。

cilvsuanna的博客 191

Python-matplotlib制图04-添加图名称和坐标轴名称

matplotlib, .set_title(), .set_xlabel(), .set_ylabel(), 添加图名和坐标轴名称

EWBA_GIS_RS_ER的博客 5万+

卷积神经网络中的自注意力机制(Self-Attention Mechanism)

卷积神经网络中的机制表现为操作,其实现过程与Seq2Seq模型的自注意力机制类似。标准的卷积层是一种局部滤波操作,其输出特征上的任意位置是由对应输入特征的一个邻域构造的,只能捕捉局部特征之间的关系。而自注意力机制通过计算任意两个位置之间的关系直接捕捉远程依赖,而不用局限于相邻点,相当于构造了一个的卷积核,从而可以捕捉更多信息。在卷积网络的自注意力机制中,首先构造输入特征x的键特征fx, 查询特征gx和值特征hx;

AI天才研究院 1501

【智能座舱】- 智能座舱研究报告合集

智能座舱研究报告合集

零点壹客的博客 1306

按字母排列的中国城市名称大全

/** * Created by hornsey on 2015/11/20. */ public class Cities { public static final String[] mCitiesStrings = { "A","阿坝","阿拉善","阿里","安康","安庆","鞍山","安顺","安阳","澳门","B","北京","白银",

Hornsey的博客 2万+

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

全国地铁城市数据分析(python实现)

详解数据分析过程(包括但不限于数据采集,处理,可视化分析),网络爬虫的基础应用(request+xpath,selenuim),pyechart图表的使用。

a284365的博客 1万+

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

python抓取网站88titienmae88中的“图片区”所有图片

#-*-coding:utf-8-*- from urllib.request import urlopen, urlretrieve from bs4 import BeautifulSoup import re import os ''' 抓取网站http://jyghf.com/中的“图片区”的的所有图片 关于这个网站,大家不要太有纠结的情绪,作为一个泱泱大国...

象话的博客 5万+

数据分析个人笔记

数据分析 一、 Jupyter Notebook Jupyter Notebook 有两种键盘输入模式。编辑模式,允许你往单元中键入代码或文本;这时的单元框线是绿色的。命令模式,键盘输入运行程序命令;这时的单元框线是灰色。 1、 命令模式 (按键 Esc 开启) Enter : 转入编辑模式 Shift-Enter : 运行本单元,选中下个单元 Ctrl-Enter : 运行本单元 Alt-Enter : 运行本单元,在其下插入新单元 Y : 单元转入代码状态 M :单元转入markdown状态 R :

阳阳的博客 1万+

title888

http://aa.com/1.jpg">8888888

sichuandizhen的专栏 6234

设为首页代码和加入收藏代码(兼容各种浏览器)

设为首页代码和加入收藏代码(兼容各种浏览器) 把页面设置为首页,加入收藏功能,支持ie,ff,chrome,safari,360安全,qq,遨游,搜狗浏览器,不兼容360急速浏览器的兼容模式下加入收藏功能 注意: 这里虽然说是兼容,但是有些浏览器的设置就是不支持用js来把页面设为首页,加入收藏夹,只能让用户手动去在浏览器或者按键去设置这些功能,这里说的兼容是指当浏览器有这个设置的时候js

越努力就越主动。 2万+

vue课上知识总结

vue课上知识总结 显示文本框的渲染 原先的dom节点渲染 通过 js 主要做如下事情 通过 js 惊醒业务逻辑的处理,如对变量进行运算、获取服务器端数据、应用 js 中的函数对数据进行处理 通过dom 改变页面:比如 创建元素、添加元素、删除元素、设置和湖区元素的属性、设置和获取元素的style 样式、设置和获取元素的 class 样式、为dom注册事件 <!DOCTYPE html> <html> <head> <meta charset="utf-8

zhzijun的博客 1万+

python抓取网站88titienmae88中的“图片区”的第一页的所有图片

#-*-coding:utf-8-*- from urllib.request import urlopen, urlretrieve from bs4 import BeautifulSoup import re import os ''' 抓取网站http://jyghf.com/中的“图片区”的第一页的所有图片 关于这个网站,大家不要太有纠结的情绪,作为一个泱泱大国的男士

象话的博客 5万+

范冰冰光头再战纯爷们造型

15个封面中,黄晓明与范冰冰参与拍摄的封面分别代表“男人”和“女人”,同时为了表达《时尚先生Esquire》一直以来对环保的重视...                                         中国第一男刊、时尚传媒集团旗下旗舰男刊《时尚先生Esquire》为纪念杂志创刊15周年,9月纪念号邀请黄晓明、范冰冰、蔡康永、小S、李云迪等知名人士、各品

4048
上一篇: 中国116所211大学都在哪里?Python动态图帮你盘点!
下一篇: 用Spark-Scala训练LightGBM模型
算法美食屋
博客等级 码龄9年 2万+粉丝 154原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值