首页 > 编程语言 >Python 使用shapely、geopandas、matplotlib绘制全国各个省份2023年GDP热力图,鼠标点击会显示省份GDP数值

Python 使用shapely、geopandas、matplotlib绘制全国各个省份2023年GDP热力图,鼠标点击会显示省份GDP数值

时间:2024-11-27 23:30:00浏览次数:13  
标签:GDP shapely matplotlib 点击 china value 省份 event

以下是一个示例代码,用于在使用matplotlibgeopandas绘制地图并设置区域后,当鼠标点击地图上的某个区域时,返回该区域的名称。

首先,确保你已经安装了matplotlibgeopandasdescartes库(descartes库用于在matplotlib中绘制地理空间数据)。如果没有安装,可以通过pip install matplotlib geopandas descartes进行安装。

另外,你需要一份中国省级行政区划的地理空间数据文件(比如 Shapefile 格式),这里假设已经有了一个名为china_provinces.shp的文件,它包含了中国各省份的几何边界信息。你可以从相关地理数据平台获取这样的文件。

省份数据地图获取——提取码:7clz

import geopandas as gpd
import pandas as pd
from plotly.subplots import make_subplots
import matplotlib.pyplot as plt
from shapely.geometry import Point

from pypinyin import pinyin, Style
 
def to_pinyin(text, style=Style.TONE):
    return ''.join([i[0] for i in pinyin(text, style=style)])

# 读取中国省份的GeoJSON数据
china_geojson = gpd.read_file('省.shp')  # 请确保路径正确,且文件是GeoJSON格式
gdp_data_t = {
    "广东": 130518.8,
    "江苏": 92595.4,
    "山东": 92069.0,
    "浙江": 83467.3,
    "河南": 48056.0,
    "四川": 60132.9,
    "湖北": 39367.0,
    "湖南": 36426.0,
    "河北": 36010.0,
    "福建": 35804.0,
    "上海": 32680.0,
    "北京": 30320.0,
    "安徽": 30007.0,
    "辽宁": 25315.0,
    "陕西": 24438.0,
    "江西": 21985.0,
    "重庆": 20363.0,
    "广西": 20353.0,
    "天津": 18810.0,
    "云南": 17881.0,
    "内蒙古": 17289.0,
    "山西": 16818.0,
    "黑龙江": 16362.0,
    "吉林": 15075.0,
    "贵州": 14806.0,
    "新疆": 12199.0,
    "甘肃": 8246.0,
    "海南": 4832.0,
    "宁夏": 3705.0,
    "青海": 2865.0,
    "西藏": 1478.0
}
# 示例数据:假设我们有一些省份的2023年GDP总量数据
gdp_data = {
    'Province': [
    "北京市", "天津市", "河北省", "山西省", "内蒙古自治区",
    "辽宁省", "吉林省", "黑龙江省", "上海市", "江苏省",
    "浙江省", "安徽省", "福建省", "江西省", "山东省",
    "河南省", "湖北省", "湖南省", "广东省", "广西壮族自治区",
    "海南省", "重庆市", "四川省", "贵州省", "云南省",
    "西藏自治区", "陕西省", "甘肃省", "青海省", "宁夏回族自治区",
    "新疆维吾尔自治区", "台湾省", "香港特别行政区", "澳门特别行政区"
    ],
    'value':  [
    30320.0, 18810.0, 36010.0, 16818.0, 17289.0,
    25315.0, 15075.0, 16362.0, 32680.0, 92595.4,
    83467.3, 30007.0, 35804.0, 21985.0, 92069.0,
    48056.0, 39367.0, 36426.0, 130518.8, 20353.0,
    4832.0, 20363.0, 60132.9, 14806.0, 17881.0,
    1478.0, 24438.0, 8246.0, 2865.0, 3705.0,
    12199.0, 11000, 11000, 11000  # 台湾省、香港特别行政区、澳门特别行政区暂无示例数据,实际可补充准确数据
    ]
}

gdp_df = pd.DataFrame(gdp_data)

merged = china_geojson.set_index('省').join(gdp_df.set_index('Province'))

fig, ax = plt.subplots(figsize=(20, 36))

# 定义鼠标点击事件处理函数
def on_click(event):
    if event.inaxes == ax:
        for index, row in china_geojson.iterrows():
            poly = row['geometry']
            point = Point(event.xdata,  event.ydata)    
            if poly.contains(point):
                for key, value in gdp_data_t.items():
                    #print(key, value)
                    if key in row['省']:
                        print(key, value)
                        value = gdp_data_t[key]
                        print(value)
                        break
                name = to_pinyin(row['省'])
                print(name)
                plt.annotate(f"{name}: {value}", xy=(event.xdata, event.ydata), xytext=(10, 10),
                            textcoords='offset points', bbox=dict(boxstyle='round,pad=0.5', fc='yellow', alpha=0.5),
                            arrowprops=dict(arrowstyle='->', connectionstyle='arc3,rad=0'))
                fig.canvas.draw_idle()
                break


# 连接鼠标点击事件到处理函数
cid = fig.canvas.mpl_connect('button_press_event', on_click)

plt.title(to_pinyin('全国热力图'))

merged.plot(column='value', cmap='OrRd', linewidth=0.8, ax=ax, edgecolor='0.8', legend=True)

plt.show()

数据准备

  1. 首先使用geopandasread_file方法读取了包含中国各省份几何边界信息的地理空间数据文件(china_provinces.shp),得到一个GeoDataFrame对象china_map
  2. 然后为每个省份生成了一个示例数值,这里假设是虚构的人口数量,并将其添加到china_map的新列population中。

地图绘制

  1. 创建了一个matplotlib的图形和坐标轴对象figax,并设置了合适的图形大小。
  2. 通过遍历china_map的每一行,对于每个省份的几何边界信息:
    • 使用descartes库的PolygonPatch将其转换为可以在matplotlib中绘制的多边形补丁对象,并设置其填充颜色为none,边框颜色为black,然后添加到坐标轴ax上。
    • 计算省份几何形状的质心坐标,并在质心位置添加省份名称作为标签,设置了合适的字体大小和对齐方式。

鼠标点击事件处理

  1. 定义了on_click函数作为鼠标点击事件的处理函数:
    • 首先判断点击事件是否发生在当前坐标轴ax内。
    • 如果在坐标轴内,通过遍历china_map的每一行,检查每个省份的几何边界是否包含点击的坐标点(event.xdataevent.ydata)。
    • 一旦找到包含点击点的省份,获取该省份的名称和对应的数值,然后使用plt.annotate在点击点附近添加一个注释,显示省份名称和数值,并设置了注释框的样式(如圆角、填充颜色、透明度等)以及箭头的样式,最后通过fig.canvas.draw_idle()重新绘制图形,使注释显示出来。

事件连接与显示

  1. 通过fig.canvas.mpl_connect将鼠标点击事件与处理函数on_click连接起来。
  2. 最后使用plt.show()显示绘制好的中国省级行政区划地图,当鼠标点击某个省份区域时,就会弹出一个提示框显示该省份的名称和对应的数值。

请注意,在实际应用中,你可以根据自己的需求替换示例中的数值,比如各省份的 GDP 总量等。同时,确保地理空间数据文件的准确性和完整性,以及数据与地图区域的正确匹配。

运行效果,我已经运行测试通过,如下图

标签:GDP,shapely,matplotlib,点击,china,value,省份,event
From: https://blog.csdn.net/SmartGridequation/article/details/144080459

相关文章

  • Sambruk 利用 NocoBase 实现瑞典教育资源的 GDPR 合规管理
    关于Sambruk在瑞典,有一半的城市是Sambruk的成员,并且61%的瑞典居民居住在参与Sambruk合作的市政区域内。Sambruk是一家位于瑞典的非营利组织,专注于推动和支持瑞典各地市政部门的数字化转型。其主要任务是通过协作和共享资源,帮助各个市政部门更高效地实现数字化。Sambru......
  • 中国各省GDP平减指数(1980-2022年)(原始计算代码(计算过程和计算的文字说明)、最终计算结果
    GDP平减指数是一个关键的经济指标,用于衡量一个国家或地区在不同时间点的GDP价格水平变化。它通过比较现价GDP(名义GDP)与不变价GDP(实质GDP或真实GDP)之间的比例,帮助分析经济增长的实际表现,剔除了通货膨胀或紧缩的影响。GDP平减指数的定义GDP平减指数定义为:\text{GDP平减指数}=......
  • GDPR 学习笔记
    一、前言1、以GDPR为代表的监管条例GDPR(《通用数据保护条例》)于2018年5月25日生效,取代了欧盟的《数据保护指令》(DPD,95指令,1995年颁布),对欧盟所有成员国发生直接、统一、首要的效力。除GDPR之外,其他法规对欧盟制度下的企业也很重要。如,适用于电子通信行业中个人数据处理的《电......
  • [2024最新整理]300多个地级市GDP及第一、二、三产业占比数据(1990-2021年)
    文章目录数据下载地址数据指标说明项目备注数据下载地址数据下载地址点击这里下载数据数据指标说明梳理了2021年普通地级市GDP30强,其中有26个城市GDP总量超过了5000亿元,更有6个城市超过了万亿元,分别是苏州、无锡、佛山、泉州、南通、东莞;从省份来看,30强中江苏有......
  • 使用Python创建省份城市地图选择器
    在这篇博客中,我们将探讨如何使用Python创建一个简单而实用的省份城市地图选择器。这个项目不仅能帮助我们学习Python的基础知识,还能让我们了解如何处理JSON数据和集成网页浏览器到桌面应用程序中。C:\pythoncode\new\geographicgooglemap.py全部代码importwximportwx.......
  • 分享一套包含12000多条历史上的今天发生的大事件数据库 及中国城市2017年全年GDP排行
    一、分享一套包含12000多条历史上的今天发生的大事件数据库    分享一套包括1.2万条历史上的今天的sql数据库文件。包含12000多条历史上的今天数据的SQL数据库文件.zip。详细数据可以参考使用此数据库运行的网站: http://www.guihei.com 下    资源下载链......
  • GDP增速5%但个人生活困境?解析经济增长与个人福祉的非直接对应
    尽管GDP增速达到了5%,但我们个人在生活中却可能感到经济困境,这揭示了经济增长与个人福祉之间并非总是直接对应的关系。为了正确理解这一现象,我们需要从多个维度进行深入分析。首先,GDP增速作为宏观经济指标,主要反映的是经济总量的增长情况,它并不直接涉及个体或家庭的经济状况。......
  • 使用python获取江苏省历年GDP#获取数据#爬虫程序#统计
    我们在搜索页面随机点开拥有数据的页面。www.shujujidi.com观察其所需数据的元素特点,编写代码frombs4importBeautifulSoupimportrequestsheaders={"User-Agent":"Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/1......
  • 时间序列分析:西安GDP 的 ARIMA 分析SAS操作过程(理论知识略)
    目录一、西安GDP的ARIMA分析二、判断序列的平稳性 三、定阶和预测SAS代码附录:一、西安GDP的ARIMA分析通过对某一指标进行短期的ARIMA分析预测,我们能够预见其未来几年的变化趋势.基于这些预测结果,我们可以采取针对性的措施和制定适应性政策,以促进快速且高效的发......
  • 【Python&GIS】基于Geopandas和Shapely计算矢量面最短路径
    ​    在GIS进行空间分析时经常会需要计算最短路径,我也是最近在计算DPC的时候有这方面的需求,刚开始直接是用面的中心点求得距离,但其对不规则或空洞面很不友好。所以今天跟大家分享一下基于Geopandas和Shapely计算矢量面最短路径,这里的最短即点/边的最短!原创作者:RS迷......