GeoPandas和Matplotlib地图高亮显示——与中国建交的国家(不全)
- 一、概要
- 二、整体架构流程
- 三、完整代码
一、概要
这段代码是使用GeoPandas
和Matplotlib
库在Python中绘制世界地图的一个例子,它突出了与中国建交的国家(部分)。首先,它创建了一个包含建交国家名称的字典,然后使用GeoPandas库读取了世界地图数据。通过筛选地图数据,它找出了这些特定国家的地理位置信息。
然后,代码创建了一个新的图形对象,并在这个图形上绘制了整个世界的地图,所有国家的颜色都是淡灰色的线条。然后,它再次绘制了与我国建交的国家的地图,这次的颜色是绿色,线条是黑色的。然后,它特别将中国的地图设置为红色,以突出显示。
接下来,代码在每个国家的中心位置添加了一个标签,以显示其名称。最后,它将中文字体设置为正常显示,并设置了图形和轴标签的字体大小。这样创建的图形可以直观地展示出与中国建交的国家在全球的分布情况。
如下图,显示绿色的为与中国建交的国家,还有部分国家如刚果民主共和国等在GeoPandas中没有找到相应的英文名。
另外,有16个国家未与中国建交,名单如下:亚洲(1个):不丹;欧洲(1个):梵蒂冈;非洲(1个):斯威士兰;大洋洲(4个):图瓦卢、马绍尔群岛、帕劳、瑙鲁;北美洲(8个):危地马拉、伯利兹、洪都拉斯、尼加拉瓜、海地、圣基茨和尼维斯、圣卢西亚、圣文森特和格林纳丁斯;南美洲(1个):巴拉圭。
另外,有一件令人恼火的事,就是geopandas的中国版图竟然没有包括台湾,所以增加了一段代码,将台湾纳入中国版图:
# 中国单独设置为绿色
china = world[world['name'].isin(['China', 'Taiwan'])]
china.plot(ax=ax, color='red', edgecolor='black')
二、整体架构流程
这段代码的整体架构是一个使用GeoPandas
和Matplotlib
库进行地理数据可视化的流程。以下是这段代码的详细整体架构解释:
- 导入所需的库:该代码首先导入了
geopandas
库和matplotlib.pyplot
库。Geopandas
是一个开源的Python库,用于更轻松地处理地理空间数据,而matplotlib.pyplot
是Python的一个绘图库,用于创建各种类型的图形。 - 定义与我国建交的国家:为了筛选出与我国建交的国家,代码中定义了一个字典,其中包含这些国家的名称和对应的英文名称。
- 读取世界地图数据:使用
geopandas
的read_file
方法读取了名为“naturalearth_lowres
”的内置世界地图数据。 - 创建国家名称列表:通过遍历字典,将字典中的值提取出来并存储为一个列表。
- 根据国家名称筛选地图数据:通过使用
geopandas
的df[df['name'].isin(country_name_list)]
操作,从读取的世界地图数据中筛选出与我国建交的国家的地理数据。 - 创建图形对象:使用
matplotlib
的subplots
方法创建一个图形和子图对象。 - 在地图上绘制所有国家:通过调用
world.plot
方法,并在图形对象上绘制所有国家。颜色设置为浅灰色,边框为灰色。 - 在地图上绘制指定国家(绿色):调用
countries.plot
方法在图形对象上绘制与我国建交的国家,并设置颜色为绿色,边框为黑色。 - 中国单独设置为红色:通过调用
china.plot
方法,将中国的图形绘制为红色,边框为黑色。 - 添加标题和轴标签:使用
ax
对象的set_title
,set_xlabel
和set_ylabel
方法添加图形标题和轴标签。 - 在地图上显示国家名称:通过循环遍历所有国家的行数据,并使用
ax
对象的annotate
方法在每个国家的中心位置添加其名称。 - 设置中文字体及大小:为了正确显示中文标签,设置
matplotlib
的全局参数rcParams
中的’font.sans-serif
’为’SimHei
’,并将字体大小设置为12
。 - 显示图形:最后,使用
plt.show()
方法显示所创建的图形。 - 与中国建交的国家提取参考这篇文章:提取多个txt数据并合成excel——例子:与中国建交的国家
三、完整代码
1.先安装GeoPandas。在终端或命令提示符中运行以下命令:
pip install geopandas
2.完整代码如下:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2023-09-23 16:54
# @Author : Leuanghing Chen
# @Blog : https://blog.csdn.net/weixin_46153372?spm=1010.2135.3001.5421
# @File : geopandas地图高亮显示.py
# @Software : PyCharm
# country_CHname_list = ['阿富汗', '亚美尼亚', '阿塞拜疆', '巴林', '孟加拉国', '文莱', '柬埔寨', '朝鲜', '东帝汶', '格鲁吉亚', '印度', '印度尼西亚', '伊朗', '伊拉克', '以色列', '日本', '约旦', '哈萨克斯坦', '科威特', '吉尔吉斯斯坦', '老挝', '黎巴嫩', '马来西亚', '马尔代夫', '蒙古', '缅甸', '尼泊尔', '阿曼', '巴基斯坦', '巴勒斯坦', '菲律宾', '卡塔尔', '韩国', '沙特阿拉伯', '新加坡', '斯里兰卡', '叙利亚', '塔吉克斯坦', '泰国', '土耳其', '土库曼斯坦', '阿拉伯联合酋长国', '乌兹别克斯坦', '越南', '也门', '澳大利亚', '库克群岛', '斐济', '基里巴斯', '密克罗尼西亚', '新西兰', '纽埃', '巴布亚新几内亚', '萨摩亚', '所罗门群岛', '汤加', '瓦努阿图', '阿尔巴尼亚', '安道尔', '奥地利', '白俄罗斯', '比利时', '波斯尼亚和黑塞哥维那', '保加利亚', '克罗地亚', '塞浦路斯', '捷克', '丹麦', '爱沙尼亚', '芬兰', '法国', '德国', '希腊', '匈牙利', '冰岛', '爱尔兰', '意大利', '拉脱维亚', '列支敦士登', '立陶宛', '卢森堡', '马耳他', '摩尔多瓦', '摩纳哥', '黑山', '荷兰', '北马其顿', '挪威', '波兰', '葡萄牙', '罗马尼亚', '俄罗斯', '圣马力诺', '塞尔维亚', '斯洛伐克', '斯洛文尼亚', '西班牙', '瑞典', '瑞士', '乌克兰', '英国', '阿尔及利亚', '安哥拉', '贝宁', '博茨瓦纳', '布基纳法索', '布隆迪', '喀麦隆', '佛得角', '中非', '乍得', '科摩罗', '刚果(金)', '刚果(布)', '科特迪瓦', '吉布提', '埃及', '赤道几内亚', '厄立特里亚', '埃塞俄比亚', '加蓬', '冈比亚', '加纳', '几内亚', '几内亚比绍', '肯尼亚', '莱索托', '利比里亚', '利比亚', '马达加斯加', '马拉维', '马里', '毛里塔尼亚', '毛里求斯', '摩洛哥', '莫桑比克', '纳米比亚', '尼日尔', '尼日利亚', '卢旺达', '圣多美和普林西比', '塞内加尔', '塞舌尔', '塞拉利昂', '索马里', '南非', '南苏丹', '苏丹', '坦桑尼亚', '多哥', '突尼斯', '乌干达', '赞比亚', '津巴布韦', '安提瓜和巴布达', '阿根廷', '巴哈马', '巴巴多斯', '玻利维亚', '巴西', '加拿大', '智利', '哥伦比亚', '哥斯达黎加', '古巴', '多米尼克', '多米尼加', '厄瓜多尔', '萨尔瓦多', '格林纳达', '圭亚那', '牙买加', '墨西哥', '尼加拉瓜', '巴拿马', '秘鲁', '苏里南', '特立尼达和多巴哥', '美国', '乌拉圭', '委内瑞拉']
# country_ENname_list = ['Afghanistan', 'Armenia', 'Azerbaijan', 'Bahrain', 'Bangladesh', 'Brunei', 'Cambodia', 'North Korea', 'Timor-Leste', 'Georgia', 'India', 'Indonesia', 'Iran', 'Iraq', 'Israel', 'Japan', 'Jordan', 'Kazakhstan', 'Kuwait', 'Kyrgyzstan', 'Laos', 'Lebanon', 'Malaysia', 'Maldives', 'Mongolia', 'Myanmar', 'Nepal', 'Oman', 'Pakistan', 'Palestine', 'the Philippines', 'Qatar', 'Korea', 'Saudi Arabia', 'Singapore', 'Sri Lanka', 'Syria', 'Tajikistan', 'Thailand', 'Türkiye', 'Turkmenistan', 'The United Arab Emirates', 'Uzbekistan', 'Vietnam', 'Yemen', 'Australia', 'Cook Islands', 'Fiji', 'Kiribati', 'Micronesia', 'New Zealand', 'Niue', 'papua new guinea', 'Samoa', 'Solomon Islands', 'Tonga', 'Vanuatu', 'Albania', 'Andorra', 'Austria', 'Belarus', 'Belgium', 'Bosnia and Herzegovina', 'Bulgaria', 'Croatia', 'Cyprus', 'Czech Republic', 'Denmark', 'Estonia', 'Finland', 'France', 'Germany', 'Greece', 'Hungary', 'Iceland', 'Ireland', 'Italy', 'Latvia', 'Liechtenstein', 'Lithuania', 'Luxembourg', 'Malta', 'Moldova', 'Monaco', 'Montenegro', 'Netherlands', 'Northern Macedonia', 'Norway', 'poland', 'Portugal', 'Romania', 'Russia', 'San Marino', 'Serbia', 'Slovakia', 'Slovenia', 'Spain', 'Sweden', 'Switzerland', 'Ukraine', 'Britain', 'Algeria', 'Angola', 'Benin', 'Botswana', 'burkina faso', 'Burundi', 'Cameroon', 'Cape Verde', 'Central African', 'Chad', 'Comoros', 'Congo (Kinshasa)', 'Congo (Brazzaville)', 'Ivory Coast', 'Djibouti', 'Egypt', 'Equatorial Guinea', 'Eritrea', 'Ethiopia', 'Gabon', 'Gambia', 'Ghana', 'Guinea', 'Guinea-Bissau', 'Kenya', 'Lesotho', 'Liberia', 'Libya', 'Madagascar', 'Malawi', 'Mali', 'Mauritania', 'Mauritius', 'Morocco', 'Mozambique', 'Namibia', 'Niger', 'Nigeria', 'Rwanda', 'Sao Tome and Principe', 'Senegal', 'Seychelles', 'sierra leone', 'Somalia', 'South Africa', 'South Sudan', 'Sudan', 'Tanzania', 'Togo', 'Tunisia', 'Uganda', 'Zambia', 'zimbabwe', 'Antigua and Barbuda', 'Argentina', 'Bahamas', 'Barbados', 'bolivia', 'Brazil', 'Canada', 'Chile', 'Colombia', 'Costa Rica', 'Cuba', 'Dominica', 'Dominican', 'Ecuador', 'El Salvador', 'Grenada', 'Guyana', 'Jamaica', 'Mexico', 'Nicaragua', 'Panama', 'Peru', 'Suriname', 'Trinidad and Tobago', 'United States', 'Uruguay', 'Venezuela']
import geopandas as gpd
import matplotlib.pyplot as plt
# 与中国建交的国家
country_dict={'阿富汗': 'Afghanistan', '亚美尼亚': 'Armenia', '阿塞拜疆': 'Azerbaijan', '巴林': 'Bahrain', '孟加拉国': 'Bangladesh',
'文莱': 'Brunei', '柬埔寨': 'Cambodia', '朝鲜': 'North Korea', '东帝汶': 'Timor-Leste', '格鲁吉亚': 'Georgia',
'印度': 'India', '印度尼西亚': 'Indonesia', '伊朗': 'Iran', '伊拉克': 'Iraq', '以色列': 'Israel', '日本': 'Japan',
'约旦': 'Jordan', '哈萨克斯坦': 'Kazakhstan', '科威特': 'Kuwait', '吉尔吉斯斯坦': 'Kyrgyzstan', '老挝': 'Laos',
'黎巴嫩': 'Lebanon', '马来西亚': 'Malaysia', '马尔代夫': 'Maldives', '蒙古': 'Mongolia', '缅甸': 'Myanmar',
'尼泊尔': 'Nepal', '阿曼': 'Oman', '巴基斯坦': 'Pakistan', '巴勒斯坦': 'Palestine', '菲律宾': 'Philippines',
'卡塔尔': 'Qatar', '韩国': 'South Korea', '沙特阿拉伯': 'Saudi Arabia', '新加坡': 'Singapore', '斯里兰卡': 'Sri Lanka',
'叙利亚': 'Syria', '塔吉克斯坦': 'Tajikistan', '泰国': 'Thailand', '土耳其': 'Turkey', '土库曼斯坦': 'Turkmenistan',
'阿拉伯联合酋长国': 'The United Arab Emirates', '乌兹别克斯坦': 'Uzbekistan', '越南': 'Vietnam', '也门': 'Yemen',
'澳大利亚': 'Australia', '库克群岛': 'Cook Islands', '斐济': 'Fiji', '基里巴斯': 'Kiribati', '密克罗尼西亚': 'Micronesia',
'新西兰': 'New Zealand', '纽埃': 'Niue', '巴布亚新几内亚': 'Papua New Guinea', '萨摩亚': 'Samoa',
'所罗门群岛': 'Solomon Islands', '汤加': 'Tonga', '瓦努阿图': 'Vanuatu', '阿尔巴尼亚': 'Albania', '安道尔': 'Andorra',
'奥地利': 'Austria', '白俄罗斯': 'Belarus', '比利时': 'Belgium', '波斯尼亚和黑塞哥维那': 'Bosnia and Herzegovina',
'保加利亚': 'Bulgaria', '克罗地亚': 'Croatia', '塞浦路斯': 'Cyprus', '捷克': 'Czech Republic', '丹麦': 'Denmark',
'爱沙尼亚': 'Estonia', '芬兰': 'Finland', '法国': 'France', '德国': 'Germany', '希腊': 'Greece', '匈牙利': 'Hungary',
'冰岛': 'Iceland', '爱尔兰': 'Ireland', '意大利': 'Italy', '拉脱维亚': 'Latvia', '列支敦士登': 'Liechtenstein',
'立陶宛': 'Lithuania', '卢森堡': 'Luxembourg', '马耳他': 'Malta', '摩尔多瓦': 'Moldova', '摩纳哥': 'Monaco',
'黑山': 'Montenegro', '荷兰': 'Netherlands', '北马其顿': 'Northern Macedonia', '挪威': 'Norway', '波兰': 'Poland',
'葡萄牙': 'Portugal', '罗马尼亚': 'Romania', '俄罗斯': 'Russia', '圣马力诺': 'San Marino', '塞尔维亚': 'Serbia',
'斯洛伐克': 'Slovakia', '斯洛文尼亚': 'Slovenia', '西班牙': 'Spain', '瑞典': 'Sweden', '瑞士': 'Switzerland',
'乌克兰': 'Ukraine', '英国': 'United Kingdom', '阿尔及利亚': 'Algeria', '安哥拉': 'Angola', '贝宁': 'Benin',
'博茨瓦纳': 'Botswana', '布基纳法索': 'Burkina Faso', '布隆迪': 'Burundi', '喀麦隆': 'Cameroon', '佛得角': 'Cape Verde',
'中非': 'Central African', '乍得': 'Chad', '科摩罗': 'Comoros', '刚果': 'Congo',
'刚果(布)': 'Congo (Brazzaville)', '科特迪瓦': 'Ivory Coast', '吉布提': 'Djibouti', '埃及': 'Egypt',
'赤道几内亚': 'Equatorial Guinea', '厄立特里亚': 'Eritrea', '埃塞俄比亚': 'Ethiopia', '加蓬': 'Gabon',
'冈比亚': 'Gambia', '加纳': 'Ghana', '几内亚': 'Guinea', '几内亚比绍': 'Guinea-Bissau', '肯尼亚': 'Kenya',
'莱索托': 'Lesotho', '利比里亚': 'Liberia', '利比亚': 'Libya', '马达加斯加': 'Madagascar', '马拉维': 'Malawi',
'马里': 'Mali', '毛里塔尼亚': 'Mauritania', '毛里求斯': 'Mauritius', '摩洛哥': 'Morocco', '莫桑比克': 'Mozambique',
'纳米比亚': 'Namibia', '尼日尔': 'Niger', '尼日利亚': 'Nigeria', '卢旺达': 'Rwanda',
'圣多美和普林西比': 'Sao Tome and Principe', '塞内加尔': 'Senegal', '塞舌尔': 'Seychelles', '塞拉利昂': 'Sierra Leone',
'索马里': 'Somalia', '南非': 'South Africa', '南苏丹': 'South Sudan', '苏丹': 'Sudan', '坦桑尼亚': 'Tanzania',
'多哥': 'Togo', '突尼斯': 'Tunisia', '乌干达': 'Uganda', '赞比亚': 'Zambia', '津巴布韦': 'Zimbabwe',
'安提瓜和巴布达': 'Antigua and Barbuda', '阿根廷': 'Argentina', '巴哈马': 'Bahamas', '巴巴多斯': 'Barbados',
'玻利维亚': 'bolivia', '巴西': 'Brazil', '加拿大': 'Canada', '智利': 'Chile', '哥伦比亚': 'Colombia',
'哥斯达黎加': 'Costa Rica', '古巴': 'Cuba', '多米尼克': 'Dominica', '多米尼加': 'Dominican', '厄瓜多尔': 'Ecuador',
'萨尔瓦多': 'El Salvador', '格林纳达': 'Grenada', '圭亚那': 'Guyana', '牙买加': 'Jamaica', '墨西哥': 'Mexico',
'尼加拉瓜': 'Nicaragua', '巴拿马': 'Panama', '秘鲁': 'Peru', '苏里南': 'Suriname',
'特立尼达和多巴哥': 'Trinidad and Tobago', '美国': 'United States of America', '乌拉圭': 'Uruguay', '委内瑞拉': 'Venezuela'}
# 读取世界地图数据
world = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres'))
# 指定要高亮显示的国家名称列表 提取字典中的值并存储为列表
country_name_list = list(country_dict.values())
# 根据国家名称筛选地图数据
countries = world[world['name'].isin(country_name_list)]
# 创建一个新的图形对象
fig, ax = plt.subplots()
# 在地图上绘制所有国家
world.plot(ax=ax, color='lightgray', edgecolor='gray')
# 在地图上绘制指定国家,并设置高亮颜色
countries.plot(ax=ax, color='green', edgecolor='black')
# 中国单独设置为红色
china = world[world['name'].isin(['China', 'Taiwan'])]
china.plot(ax=ax, color='red', edgecolor='black')
# 添加标题和轴标签
ax.set_title('与中国建交的国家')
ax.set_xlabel('经度')
ax.set_ylabel('纬度')
# 在地图上显示国家名称
for idx, row in world[world['name'].isin(country_name_list+['China'])].iterrows():
ax.annotate(row['name'], (row['geometry'].centroid.x, row['geometry'].centroid.y), ha='center', va='center',
fontsize=8, color='black')
# 设置中文字体及大小
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
plt.rcParams['font.size'] = 12 # 设置字体大小
# 显示图形
plt.show()