以下的图来自 iMeta 期刊文章,使用此代码,请引用文章:

Yong-Xin Liu, Chun-Lin Shi, Tengfei Ma, Wubin Ding, Danyi Li, Tong Chen, Jingyuan Fu, Shuang-Jiang Liu. 2023. iMeta progress and acknowledgment of reviewers in 2022. iMeta 2: e89. https://doi.org/10.1002/imt2.89

大家可能偶尔需要画世界地图中国地图,来展示不同国家的某些特征分布,比如全球不同国家的新冠感染人数,在中国地图中展示不同省、市的人数、足迹、访问量等。如果没有了解过,可能会觉得画地图很难,可了解后就会觉得其实也没那么难。这篇文章用实际例子来介绍如何用Python画出好看的世界地图或者中国地图,以及如何根据需求来个性化配色添加文字

如果想复现本教程的结果,可以从Github上面下载画图脚本所用到的所有数据(包括每个国家的下载量数据,和世界地图数据,以及画图的脚本):https://github.com/DingWB/folium_documentation。

提示: 在运行ipynb文件时,如果遇到“Notebook ** is not trusted”,就在jupyter notebook右上角点击“不可信”,然后更改为“可信”即可解决。

本教程是用Pyhton3中的jupyter notebook运行的,也可以将代码复制到pytho编辑器中运行。不会python的朋友,可以先下载安装anaconda,在anaconda中打开jupyter notebook,然后再在jupyter notebook中打开本教程所分享的plot_world_map.ipynb即可。

Python主页(https://www.python.org/downloads/windows/)下载安装包后即可安装Anaconda(以window电脑为例),安装网址(https://www.anaconda.com/),安装教程链接:Anaconda安装(过程详细)可以参考:https://blog.csdn.net/weixin_42855758/article/details/122795125

如何打开.ipynb文件看链接:使用Jupyter打开本地.ipynb文件(D盘,E盘或F盘) - 知乎 (zhihu.com)怎么用jupyter执行代码(https://www.python51.com/jc/73223.html) (还可以百度搜索:JupyterNotebook运行代码详细步骤)。

1、安装python包

#pip install folium #用来画世界地图; 去掉井号,在命令行中执行
#pip install pandas,geopandas #用来处理和读取世界地图数据(geojson),去掉井号,在命令行中执行

2、导入python包

import pandas as pd
import folium,branca,os
from folium.features import DivIcon
import geopandas
import matplotlib
import matplotlib.pylab as plt
import numpy as np
import branca.colormap as cm

3、读取数据

读取每个国家下载量数据

这里需要注意,国家会对每个出版的地图进行审核,台湾、香港和南海诸岛必须要要属于中国,所以,需要对原始数据进行处理,将台湾、香港、澳门的数据合并到中国。

读取的数据,包含两列:CountryName和Count,其中,CountryName是国家的名字,Count是每个国家的下载量,大家可以把Count替换为不同国家或者省、市的新冠确诊人数、死亡人数、访问量、人口、降水量等等。

df=pd.read_excel(os.path.expanduser("data.xlsx"))
#merge China main land, Hongkong, Taiwan and Macao.
df.loc[df.CountryName=='China','Count']= df.loc[df.CountryName.isin(['China','Hong Kong','Taiwan','Macao']),'Count'].sum()
df=df.loc[~ df.CountryName.isin(['Hong Kong','Taiwan','Macao'])]
#为了使数据中的国家名字与后面的地图数据中的国家名字匹配,需要将部分国家的名字替换为地图数据中的名字
df.CountryName.replace({'Iran, Islamic Republic of...':'Iran','Russian Federation':'Russia','Sri Lanka':'Srilanka','Venezuela, Bolivarian Republic of...':'Venezuela','The former Yugoslav Republic of Macedonia':'North Macedonia','Syrian Arab Republic':'Syria','Brunei Darussalam':'Brunei','Republic of Moldova':'Moldova','Congo, Democratic Republic':'Dem. Rep. Congo',"Lao People's Democratic Republic":'Laos','Libyan Arab Jamahiriya':'Libya','South Sudan':'S. Sudan','United Republic of Tanzania':'Tanzania','Bosnia and Herzegovina':'Bosnia And Herzegovina',"Korea,Democratic People'S Republic Of":'North Korea',},inplace=True)
print(df.CountryName.unique())
['China' 'United States' 'India' 'Germany' 'United Kingdom' 'Japan''Canada' 'Australia' 'South Korea' 'Netherlands' 'Singapore' 'France''Brazil' 'Spain' 'Mexico' 'Italy' 'Denmark' 'Switzerland' 'Sweden''Pakistan' 'Russia' 'Ireland' 'Israel' 'Belgium' 'Thailand' 'Turkey''Norway' 'South Africa' 'Poland' 'Chile' 'Colombia' 'Finland' 'Malaysia''Austria' 'Philippines' 'Greece' 'Portugal' 'Indonesia' 'Iran' 'Egypt''Czech Republic' 'Argentina' 'New Zealand' 'United Arab Emirates''Ethiopia' 'Nigeria' 'Saudi Arabia' 'Kenya' 'Ukraine' 'Estonia' 'Morocco''Peru' 'Viet Nam' 'Bangladesh' 'Ecuador' 'Croatia' 'Hungary' 'Luxembourg''Romania' 'Unknown' 'Algeria' 'Ghana' 'Panama' 'Puerto Rico' 'Uruguay''Cyprus' 'Iraq' 'Serbia' 'Dominican Republic' 'Venezuela' 'Uganda''Slovakia' 'Slovenia' 'Lithuania' "Cote d'Ivoire'" 'Georgia' 'Kuwait''Kazakhstan' 'Zimbabwe' 'Tanzania' 'Iceland' 'Tunisia' 'Srilanka''Jordan' 'Qatar' 'Nepal' 'Benin' 'Seychelles' 'Yemen' 'North Macedonia''Lebanon' 'Paraguay' 'Sudan' 'Jamaica' 'Trinidad and Tobago' 'Costa Rica''Botswana' 'Bulgaria' 'Namibia' 'Malta' 'Oman''Palestinian Territory, Occupied' 'Senegal' 'Bolivia' 'Dem. Rep. Congo''Bahrain' 'Myanmar' 'Reunion' 'Guatemala' 'Zambia' 'Syria' 'Martinique''New Caledonia' 'Malawi' 'Latvia' 'Bosnia And Herzegovina' 'Honduras''Cameroon' 'Mongolia' 'Cuba' 'Nicaragua' 'Mauritius' 'Maldives' 'Brunei''Uzbekistan' 'Moldova' 'Armenia' 'Eritrea' 'Montenegro' 'Libya''French Guiana' 'Sierra Leone' 'Gabon' 'Liechtenstein' 'Togo' 'Belize''Belarus' 'Laos' 'Bhutan' 'Mozambique' 'Bahamas' 'Albania' 'Angola''Barbados' 'Fiji' 'Guadeloupe' 'Burkina Faso' 'Papua New Guinea''Vanuatu' 'Rwanda' 'Falkland Islands (Malvinas)' 'Madagascar' 'Andorra''Cape Verde' 'S. Sudan' 'Cambodia' 'Kyrgyzstan''EUROPE - UNKNOWN COUNTRY' 'El Salvador' 'Greenland' 'Aruba' 'Guinea']

读取世界地图数据

这里,使用geopandas读取中科院全球国家行政边界数据,
地图数据下载网址:中国科学院地理科学与资源研究所,链接https://www.resdc.cn/Default.aspx,选择【全球100万基础地理数据】分类下面的【全球国家行政边界数据】下载解压,也可以直接从前面分享的github链接获取地图数据。

需要注意的是,从其它地方下载的世界地图(大多来自西方国家),西藏的边界线是有问题的,跟国家官方给的边界线不一致,如果用那些数据来画图,审核肯定无法通过。还有台湾、钓鱼岛和南海诸岛,也存在问题。所以,我们最后使用的是中科院提供的世界地图数据来画图。
如果需要画中国地图,比如不同省、市的分布,可以将这里的世界地图数据替换为中国地图即可(一般是geojson格式的地图数据,也可以在上面中科院官网下载中国地图数据)。

# Read the geopandas dataset
data = geopandas.read_file("世界国家.shp")
data.crs="epsg:4326"
data.to_crs(crs="epsg:3857")
data.to_file('World.geojson', driver='GeoJSON')
#国家名字每个单词首字母大写
data.NAME=data.NAME.apply(lambda x:x.title() if not pd.isna(x) else np.nan)
data.NAME.replace({'Russian Federation':'Russia','Cote D¡¯Ivoire':"Cote D'Ivoire'","Korea,Democratic People'S Republic Of":'North Korea','Macedonia,The Former Yugoslav Republic Of':'North Macedonia','Syrian Arab Republic':'Syria','Korea, Republic Of':'South Korea','Congo,The Democratic Republic Of The':'Dem. Rep. Congo','United States of America':'United States'},inplace=True)
#讲下载量数据中的国家名字也做同样的处理
df.CountryName=df.CountryName.apply(lambda x:x.title() if not pd.isna(x) else np.nan)
#把两个数据框拼接起来,拼接后的数据框,既包含世界地图坐标数据,也包含我们需要展示的数据(下载量)
data = data.merge(df, how="left", left_on=['NAME'], right_on=['CountryName'])
print(data.NAME.unique())
data.drop('geometry',axis=1).head()
#geometry这一列包含每个国家的坐标和边界信息,非常庞大,所以就不展示geometry这一列了
[nan 'Greenland' 'Canada' 'United States' 'Saint Pierre And Miquelon''Bermuda' 'Bahamas' 'Turks And Caicos Islands' 'Cuba' 'Mexico''Cayman Islands' 'Haiti' 'Puerto Rico' 'Virgin Islands,British''Dominican Republic' 'Virgin Islands,U.S.' 'Anguilla' 'Jamaica''Saint Kitts And Nevis' 'Antigua And Barbuda' 'Montserrat' 'Belize''Guadeloupe' 'Guatemala' 'Dominica' 'Martinique' 'Nicaragua''Saint Lucia' 'El Salvador' 'Honduras' 'Barbados''Saint Vincent And The Grenadines' 'Aruba' 'Colombia' 'Grenada''Netherlands Antilles' 'Trinidad And Tobago' 'Costa Rica' 'France''Panama' 'Marshall Islands' 'Palau' 'Kiribati' 'Nauru' 'Solomon Islands''Papua New Guinea' 'Cook Islands' 'American Samoa' 'Australia' 'Vanuatu''Fiji' 'Tonga' 'Niue' 'New Caledonia' 'Pitcairn' 'Norfolk Island''Heard Island And Mcdonald Islands' 'Bouvet Island''Northern Mariana Islands' 'Antarctica''South Georgia And The South Sandwich Islands' 'Tuvalu' 'Tokelau''French Polynesia' 'French Southern Territories' 'Samoa''Micronesia,Federated States Of' 'Wallis And Futuna''Cocos(Keeling) Islands' 'Prince Edward Island' 'New Zealand''Wake Island' 'Algeria' 'Tunisia' 'Libya' 'Morocco' 'Egypt''Western Sahara' 'Mali' 'Mauritania' 'Niger' 'Sudan' 'Senegal''Cape Verde' 'Ethiopia' 'Gambia' 'Burkina Faso' 'Eritrea' 'Guinea-Bissau''Djibouti' 'Guinea' 'Chad' 'Nigeria' "Cote D'Ivoire'"'Central African Republic' 'Ghana' 'Sierra Leone' 'Benin' 'Togo''Liberia' 'Cameroon' 'Uganda' 'Equatorial Guinea' 'Congo''Sao Tome And Principe' 'Gabon' 'Somalia' 'Rwanda' 'Kenya''Dem. Rep. Congo' 'Burundi' 'Tanzania' 'Angola' 'Seychelles' 'Malawi''Mayotte' 'Zambia' 'Madagascar' 'Mozambique' 'Mauritius' 'Zimbabwe''Reunion' 'Namibia' 'Botswana' 'Swaziland' 'Lesotho' 'South Africa''Saint Helena' 'Comoros' 'Canarias' 'Madeira' 'Venezuela' 'Guyana''Suriname' 'French Guiana' 'Ecuador' 'Brazil' 'Bolivia' 'Peru' 'Paraguay''Argentina' 'Uruguay' 'Chile' 'Falkland Islands(Malvinas)''Svalbard And Jan Mayen' 'Russia' 'Sweden' 'Iceland' 'Norway''Faroe Islands' 'Finland' 'United Kingdom' 'Estonia' 'Latvia' 'Lithuania''Denmark' 'Belarus' 'Germany' 'Netherlands' 'Poland' 'Ireland' 'Belgium''Luxembourg' 'Czech Republic' 'Slovakia' 'Moldova' 'Austria' 'Hungary''Switzerland' 'Liechtenstein' 'Slovenia' 'Romania' 'Serbia' 'Ukraine''Bosnia And Herzegovina' 'Croatia' 'San Marino' 'Monaco' 'Italy''Bulgaria' 'Andorra' 'North Macedonia' 'Montenegro' 'Vatican' 'Albania''Greece' 'Gibraltar' 'Malta' 'Portugal' 'Spain' 'Turkmenistan''Kyrgyzstan' 'Armenia' 'Syria' 'Lebanon' 'Afghanistan' 'Iraq' 'Kuwait''Nepal' 'Bhutan' 'Laos' 'Maldives' 'Brunei' 'East Timor''Christmas Island' 'Mongolia' 'Caspian Sea' 'Jordan' 'Bahrain' 'Qatar''Georgia' 'Israel' 'Cyprus' 'Iran' 'Pakistan' 'Azerbaijan' 'Yemen''Bangladesh' 'Singapore' 'Kazakhstan' 'Area Under Dispute' 'Cambodia''Srilanka' 'British Indian Ocean Territory' 'Tajikistan' 'Saudi Arabia''Myanmar' 'Japan' 'South Korea' 'United Arab Emirates' 'Malaysia' 'India''Indonesia' 'Philippines' 'Oman' 'Thailand' 'Uzbekistan' 'Turkey''North Korea' 'Viet Nam' 'China']
OBJECTID NAME FENAME FCNAME SOC POP ELEMID SHAPE_LENG SHAPE_AREA ID1 CountryName Count
0 1 NaN None None None 0.0 0 154.008856 27.507542 1 NaN NaN
1 2 Greenland Greenland ¸ñÁêÀ¼ GRL 6.0 1 1359.592591 662.855357 2 Greenland 1.0
2 3 Canada Canada ¼ÓÄôó CAN 3166.0 2 3635.736641 1692.808594 3 Canada 1763.0
3 4 United States United States Of America ÃÀ¹ú USA 28837.0 3 1261.087368 1100.995648 4 United States 15479.0
4 5 Saint Pierre And Miquelon Saint Pierre and Miquelon ʥƤ°£¶ûºÍÃÜ¿Ë¡ SPM 1.0 4 1.725672 0.026938 5 NaN NaN

将无法匹配的国家名字打印出来,如果有需要,可以向上面df.CountryName.replace中添加字典键值对来匹配

df.loc[~ df.CountryName.isin(data.NAME.tolist())].CountryName.values
array(['Unknown', 'Palestinian Territory, Occupied','Falkland Islands (Malvinas)', 'S. Sudan','Europe - Unknown Country'], dtype=object)

4、画世界地图

folium.Map的主要参数信息如下:
    location:设定地图中心点
    width, height:将地图的宽度和高度进行缩放
    tiles:地图瓦片,参考https://leaflet-extras.github.io/leaflet-providers/preview/ 和 https://juejin.cn/post/7116708374279880734

# Create a map
my_map = folium.Map(title="World Map",location=(50,5),max_zoom=1,control_scale=True,zoom_control=False,width='80%',height='90%',zoom_start=2.49,#tiles='Stamen Terrain', #Stamen Watercolor# titles="http://map.geoq.cn/ArcGIS/rest/services/ChinaOnlineCommunityENG/MapServer/tile/{z}/{y}/{x}",tiles=folium.TileLayer('https://{s}.tile.thunderforest.com/mobile-atlas/{z}/{x}/{y}.png?apikey={apikey}',attr='&copy; <a href="http://www.thunderforest.com/">Thunderforest</a>, &copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors',apikey='pk.eyJ1IjoiZGluZ3diIiwiYSI6ImNsY3doNmluazBmd2Qzb29lbzVrYXltdjYifQ.H8sWvLIDzRD7hbZDYlbUCQ',maxZoom=24,overlay=True))data['Y']=data.Count.apply(lambda x:np.log2(x+1) if not pd.isna(x) else np.nan)
max_v = data.Y.max()
def get_color(x,name):if pd.isna(name):return 'darkgrey'if pd.isna(x):return 'darkgrey'return matplotlib.colors.rgb2hex(plt.get_cmap('Spectral_r')(x/max_v))# return cmap(x)ticks=[]
for i in np.arange(start=0,stop=1.1,step=0.1):ticks.append(int(2**(i * max_v) -1))
print(ticks)
cmap = cm.LinearColormap([plt.get_cmap('Spectral_r')(i) for i in np.arange(start=0,stop=1.1,step=0.1)],index=np.arange(start=0,stop=1.1,step=0.1),vmin=0, vmax=1,max_labels=20).to_step(10) #tick_labels=ticks,cmap.caption="Number of download"
my_map.add_child(cmap)# add different color to each country according to the number of download
folium.GeoJson(data,style_function=lambda feature: {'fillColor': get_color(feature['properties']['Y'],feature['properties']['NAME']),'color': 'gold','fillOpacity':1,'opacity':0.7,'weight': 1,'dashArray': '0.8, 0.8'}
).add_to(my_map)#add country names onto the map.
for i,row in data.iterrows():if pd.isna(row['CountryName']):continuecenter=row.geometry.centroidif row.geometry.area <= 5:continuefontsize= min(3+row.geometry.area / 70,10)folium.map.Marker([center.y, center.x],icon=DivIcon(html='<div style="color:black; font-size: %spt; font-weight: bold"; opacity: 0.5>%s</div>'%(fontsize,row['NAME']),)).add_to(my_map)my_map.save('map1.html')
my_map
[0, 2, 8, 26, 82, 249, 755, 2283, 6894, 20813, 62829]

这里需要注意,最大的难点在于图例,因为这个数据分布不均匀,大部分下载量都很小,集中在1-3000,最大的是中国(下载量是6万多,其次是美国,1万多,排第三的只有3000左右)。

如果用线性的图例配色,那么,1-3000的那些绝大多数国家,颜色就都是一样的(比如都是蓝色),只有中国是红色,就不好看。
所以,我们需要使用非线形的colormap
我首先对下载量data.count进行log转换,转换后,最大值是15左右,然后再缩放(除以最大值)到0-1之间,再采用线性的colormap来解决上述问题。
此外,我们在标注国家名字时,将名字标注在每个国家的中心位置,字体大小还可以根据该国家的面积来自动缩放。

处理图例-方法1:手动编辑

因为我们目前的下载量被缩放到了0-1之间,但是地图的图例上面需要展示真实的下载量,而不是缩放之后的小数。
有2个方法可以修改图例,第一个方法是将图例上面缩放之后的小数,比如0.1,0.2,0.3,通过逆向运算,就可以算出处理之前的真实下载量,比如,我们在处理原始数据时,先对下载量进行了log2转换,然后再除以最大值(max_v):data['Y']=data.Count.apply(lambda x:np.log2(x+1) if not pd.isna(x) else np.nan)。
那么逆运算就是先乘以max_v再做2的幂指数运算,最后减去1,就是我们原始的下载量:

R=[]
for i in np.arange(start=0,stop=1.1,step=0.1):R.append(int(2**(i * max_v) -1))
print(R)
[0, 2, 8, 26, 82, 249, 755, 2283, 6894, 20813, 62829]

上面打印出来的,就是图例上对应的原始下载量,然后手动将图例上面的小数替换成上述真实数字即可。手动在html或者pdf编辑器中将0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1替换成[0, 2, 8, 26, 82, 249, 755, 2283, 6894, 20813, 62829]

处理图例-方法2:自动替换

我们也可以用Javascript代码自动化处理,大致原理就是用javscript读取并识别图例的tick labels,做逆运算,自动替换为原始下载量

from branca.element import Element
e = Element("""var ticks = document.querySelectorAll('div.legend g.tick text')for(var i = 0; i < ticks.length; i++) {var value = parseFloat(ticks[i].textContent.replace(',', ''))console.log(value)var newvalue = (Math.pow(2, value * 15.939188921332656).toFixed(0)-1).toString()ticks[i].textContent = newvalue}
""")
html = cmap.get_root()
html.script.get_root().render()
html.script.add_child(e)
#如果需要保存成html可以添加
my_map.save('map2.html')
my_map

5、备选方法:folium.Choropleth函数

最后,在folium包中,还可以用另外一个函数Choropleth函数也可以画出上面的图,但是这个方法画出来的图,图例也是有问题的,需要手动修改图例。
感兴趣的朋友可以研究一下,附上代码:

scales=[1,5,10,50,100,200,500,1000,2000,3000,20000,62830]
data['ID']=data.index.tolist()my_map = folium.Map(title="World Map",location=(50,5),max_zoom=1,control_scale=True,prefer_canvas=True,zoom_control=False,width='80%',height='90%',zoom_start=2.49,#tiles='Stamen Terrain', #Stamen Watercolor# titles="http://map.geoq.cn/ArcGIS/rest/services/ChinaOnlineCommunityENG/MapServer/tile/{z}/{y}/{x}",tiles=folium.TileLayer('https://{s}.tile.thunderforest.com/mobile-atlas/{z}/{x}/{y}.png?apikey={apikey}',attr='&copy; <a href="http://www.thunderforest.com/">Thunderforest</a>, &copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors',apikey='pk.eyJ1IjoiZGluZ3diIiwiYSI6ImNsY3doNmluazBmd2Qzb29lbzVrYXltdjYifQ.H8sWvLIDzRD7hbZDYlbUCQ',maxZoom=24,overlay=True))c = folium.Choropleth(geo_data=data,name='choropleth',data=data,columns=['ID', 'Count'],key_on='feature.id',fill_color='Spectral_r',#'red',#'RdYlGn_r',nan_fill_color='darkgray',fill_opacity=0.8,line_opacity=0.5,legend_name='No.Download',highlight=True,threshold_scale=scales
)# print(c._children)
for child in c._children:if child.startswith("color_map"):del c._children[child]c.add_to(my_map)cmap=cm.linear.Spectral_11.to_step(11).scale(1,62830)cmap.caption="Number of download"
my_map.add_child(cmap)#add country names onto the map.
for i,row in data.iterrows():if pd.isna(row['CountryName']):continuecenter=row.geometry.centroidif row.geometry.area <= 5:continuefontsize= min(3+row.geometry.area / 70,10)folium.map.Marker([center.y, center.x],icon=DivIcon(html='<div style="color:black; font-size: %spt; font-weight: bold"; opacity: 0.5>%s</div>'%(fontsize,row['NAME']),)).add_to(my_map)my_map.save('map3.html')
my_map

最后,我们也来蹭一下ChatGPT的热度试试让ChatGPT来帮我们写一篇微信公众号推文,来教大家怎么用Folium来画世界地图。看看这个工智能聊天机器人程序能否给我想要的答案。请看截图:

不得不佩服,ChatGPT确实很厉害,难怪它以这么快的速度火遍全球。

大家有什么问题、建议或者更好的画图方法,欢迎关注Computational Biology公众号一起交流学习。

此代码来源于 iMeta期刊 文章,若使用此代码,请引用以下文章:

Yong-Xin Liu, Chun-Lin Shi, Tengfei Ma, Wubin Ding, Danyi Li, Tong Chen, Jingyuan Fu, Shuang-Jiang Liu. 2023. iMeta progress and acknowledgment of reviewers in 2022. iMeta 2: e89. https://doi.org/10.1002/imt2.89

更多推荐

(▼ 点击跳转)

高引文章 ▸▸▸▸

iMeta | 德国国家肿瘤中心顾祖光发表复杂热图(ComplexHeatmap)可视化方法

▸▸▸▸

iMeta | 浙大倪艳组MetOrigin实现代谢物溯源和肠道微生物组与代谢组整合分析

▸▸▸▸

iMeta | 高颜值绘图网站imageGP+视频教程合集

第1卷第1期

第1卷第2期

第1卷第3期

第1卷第4期

期刊简介

“iMeta” 是由威立、肠菌分会和本领域数百位华人科学家合作出版的开放获取期刊,主编由中科院微生物所刘双江研究员和荷兰格罗宁根大学傅静远教授担任。目的是发表原创研究、方法和综述以促进宏基因组学、微生物组和生物信息学发展。目标是发表前10%(IF > 15)的高影响力论文。期刊特色包括视频投稿、可重复分析、图片打磨、青年编委、前3年免出版费、50万用户的社交媒体宣传等。2022年2月正式创刊发行!

联系我们

iMeta主页:http://www.imeta.science

出版社:https://onlinelibrary.wiley.com/journal/2770596x
投稿:https://mc.manuscriptcentral.com/imeta
邮箱:office@imeta.science

如何用python画世界地图,并用不同的颜色展现每个国家的数据?相关推荐

  1. 用python画猫咪怎么画-如何用Python画一只机器猫?

    原标题:如何用Python画一只机器猫? 本文经授权转自公众号异步图书 如若转载请联系原公众号 自信心是成功的源泉,对刚入门编程行业的初级程序员来说,多敲代码多做项目就是构建自信心的最好办法. 第一次 ...

  2. 用python画机器猫代码_如何用Python画一只机器猫?| 原力计划

    原标题:如何用Python画一只机器猫?| 原力计划 作者 | 人邮异步社区 责编 | 胡巍巍 出品 | CSDN博客 自信心是成功的源泉,对刚入门编程行业的初级程序员来说,多敲代码多做项目就是构建自 ...

  3. 怎么用python画个电脑_python语言还是java如何用python画爱心

    用python绘制爱心的基本步骤如下: 002pc.com对<python语言还是java如何用python画爱心>总结来说,为我们学习Python很实用. 首先先下载安装好python程 ...

  4. python画-如何用Python画各种著名数学图案 | 附图+代码

    原标题:如何用Python画各种著名数学图案 | 附图+代码 用Python绘制著名的数学图片或动画,展示数学中的算法魅力. Mandelbrot 集 代码:46 lines (34 sloc) 1. ...

  5. python编程爱心-如何用python画爱心

    用python绘制爱心的基本步骤如下: 首先先下载安装好python程序. 在我们自己的电脑上找到python 的IDLE工具. 2.然后打开IDLE,新建一个文件,命名为test1.py. 3.接着 ...

  6. 用python画简单的动物-如何用python画简单的动物

    首先来看一下实现效果,如下图: 具体实现代码请看: (推荐学习:python视频教程)# -*- coding:utf-8 -*-# __author__ :kusy# __content__:文件说 ...

  7. 用python画烟花-如何用python画烟花

    用python画烟花的方法:首先创建一个所有粒子同时扩大的二维列表:然后实现粒子范围扩大,以自由落体坠落:接着移除超过最高时长的粒子:最后循环调用保持不停. 用python画烟花的方法:# -*- c ...

  8. python语言画心_python语言还是java如何用python画爱心

    用python绘制爱心的基本步骤如下: 002pc.com对<python语言还是java如何用python画爱心>总结来说,为我们学习Python很实用. 首先先下载安装好python程 ...

  9. python turtle画动物_如何用python画简单的动物

    首先来看一下实现效果,如下图:程序猿的生活:Python入门到精通资料大汇总,不啰嗦,全是珍藏资料!​zhuanlan.zhihu.com 具体实现代码请看: # -*- coding:utf-8 - ...

最新文章

  1. jdbc 变量 mysql_JDBC读写mysql总结
  2. Python:机器学习库 sklearn
  3. python多进程重复加载
  4. Oracle设置权限和还原数据库
  5. sqlserver 事务日志 异常增长原因排查_小白入门学习打日志
  6. 移动web开发之rem布局(rem基础、媒体查询、 less 基础、rem适配方案)
  7. LeetCode 174. 地下城游戏(DP)
  8. 王道 —— 中断和异常
  9. Python_异常和模块
  10. 浮点数的加减计算总结
  11. Java学习之==注释、数据类型、变量、运算符
  12. Tom猫爱吃喝_Python面向对象“又“入门
  13. python operator用法,Python operator.eq()函数与示例
  14. 插上耳机一说话别人听有很大的电流声怎么办?
  15. PC端下载文件到本地
  16. JAVA入门Hwork,HBase Java编程入门教程
  17. 一个老工程师的工作经历和思考
  18. vue使用FullCalendar插件实现会议预约功能,个性化实现周视图
  19. 向excel里面插入网络图片
  20. [论文阅读笔记69]医学术语标准化-CODER

热门文章

  1. 开源就意味着好吗?AMD 驱动烂 VS AMD 驱动不烂
  2. 用GPT-4写代码不用翻墙了?Cursor告诉你:可以~~
  3. Android 操作系统 获取Root权限 原理解析
  4. 一支笔撑起黑科技课堂?背后的技术秘密原来是这样的
  5. 报错expect ‘:‘ at 0, actual =
  6. Spire.Presentation使用教程:在Java中设置PowerPoint图像的透明度
  7. 图解递归算法-清晰易懂
  8. java图片强绘制表情符号_java - 具有表情符号的Graphics2D.drawString()无法正常工作 - 堆栈内存溢出...
  9. 解决右键新建xlsx文件错误
  10. CSS 超出部分显示省略号