当前位置: 首页 > 后端技术 > Python

实用-Python轻松实现地图可视化(附详细源码)

时间:2023-03-26 17:01:16 Python

Python有很多地图可视化库。Matplotlib库虽然绘图功能很强大,但只能做静态图。而今天要说的是交互式地图库,即pyecharts和folium。掌握这两个库基本可以解决你的地图可视化需求。pyecharts首先要说说强大的pyecharts库,简单易用又酷炫,几乎可以制作任何图表。pyecharts有两个版本,v0.5和v1,不兼容。最新的v1版本支持链调用,并使用选项配置图表。在制作地图方面,pyecharts包括三种类型:Map、Geo和Bmap。Map类支持世界、国家、省、市、区四级地图。使用前需要独立安装。所以,点他们!1pipinstallpyecharts2pipinstallecharts-countries-pypkg3pipinstallecharts-china-provinces-pypkg4pipinstallecharts-china-cities-pypkg5pipinstallecharts-china-counties-pypkgpip后查看pyecharts版本。1importpyecharts2print(pyecharts.__version__)毫无疑问,肯定是最新版本,版本号是1.6.2。做地图之前,首先要有数据。我从Wind数据库中导出了全国所有省份的GDP总量数据,并命名为GDP.xlsx,如下图所示。\有了数据,我们就可以开始用python操作了,先导入需要的库。1importpandasaspd#pandas是一个强大的数据处理库2frompyecharts.chartsimportMap3frompyechartsimportoptionsasopts使用pandas读取GDP.xlsx,提取2019年各省GDP数据为例。让我们制作一张地图。这里注意zip()函数,它的作用是将一个可迭代对象作为参数,将对象中对应的元素打包成元组,然后返回一个由这些元组组成的对象。1data=pd.read_excel('GDP.xlsx')2province=list(data["province"])3gdp=list(data["2019_gdp"])4list=[list(z)forzinzip(province,gdp)]下面打印一下列表,它看起来是这样的:其实就是列表中嵌套列表的数据结构,只有这个结构向map中添加数据。我们使用Map类中的常用方法add、set_global_opts和render来配置地图。1c=(2Map(init_opts=opts.InitOpts(width="1000px",height="600px"))#初始化地图大小3.set_global_opts(4title_opts=opts.TitleOpts(title="2019年各GDP分布图单元province:100million"),#Configurationtitle5visualmap_opts=opts.VisualMapOpts(6type_="scatter"#Scattertype7)8)9.add("GDP",list,maptype="china")#传单回车,地图类型为中文地图10.render("Map1.html")11)运行上面的代码,用浏览器打开生成的Map1.html,效果如下:可能有朋友会问,但是有一个地图,但是你这张地图不容易区分不同省份的GDP。不要惊慌,我们会继续优化上面的代码,根据GDP的大小,给不同的省分配不同的颜色,让大家一目了然。1c=(2Map(init_opts=opts.InitOpts(width="1000px",height="600px"))#可切换主题3.set_global_opts(4title_opts=opts.TitleOpts(title="2019年各省GDP分布图单位:100million"),5visualmap_opts=opts.VisualMapOpts(6min_=1000,7max_=110000,8range_text=['GDP总量(亿)颜色范围:',''],#Partition9is_piecewise=True,#定义legend为分段,默认连续legend10pos_top="middle",#分段位置11pos_left="left",12orient="vertical",13split_number=10#分成10个区间14)15)16.add("GDP",list,maptype="china")17.render("Map2.html")18)运行上面的代码,用浏览器打开生成的Map2.html,效果如下:how,是效果现在好多了?颜色越红,GDP越高。2019年你所在省份的GDP属于哪个颜色段?当然,对于一些审美比较高的朋友来说,可能还是不能满足你的要求。既然如此,那我就优化一下代码,给地图加个主题吧。添加主题非常简单,只需导入ThemeType,然后将主题添加到Mpa()方法中即可。下面以ThemeType.DARK为例来看看效果。1frompyecharts.globalsimportThemeType#引入主题2Map(init_opts=opts.InitOpts(width="1000px",height="600px",theme=ThemeType.DARK))#添加主题ThemeType.DARK运行看看效果:\是的,没有B格升到n级的感觉。如果你还不满意,ok,pyecharts内置了10多个主题供你切换。萝卜青菜各有所爱,大家自行调整吧~\其次,GeoGeo类似于Map,可以通过设置maptype参数来选择地图类型,支持的方式也和Map类似,就不赘述了这里就不细说了,直接贴代码就可以了。1#Geomap-ripplemap2importpandasaspd3frompyechartsimportoptionsasopts4frompyecharts.chartsimportGeo5frompyecharts.globalsimportChartType67data=pd.read_excel('GDP.xlsx')8province=list(data["省"])9g??dp=list(data["2019_gdp"])10list=[list(z)forzinzip(province,gdp)]11print(list)12c=(13Geo()14.add_schema(maptype="china")15.add(16"geo",17list,#传入数据18symbol_size=10,large_threshold=110000,#设置波纹大小19type_=ChartType.EFFECT_SCATTER,#地图类型为Ripple20)21.set_series_opts(label_opts=opts.LabelOpts(is_show=False))22.set_global_opts(visualmap_opts=opts.VisualMapOpts(max_=110000),title_opts=opts.TitleOpts(title="2019年省GDP波纹图"))23.render("Geomap1.html")24)运行,效果如下:3.BmapBmap是百度地图的一个接口。如果你了解Map和Geo,Bmap可以在几分钟内完成。不过有一点需要注意的是,必须先在百度地图开放平台注册,获得AK后才能调用。注册地址:https://lbsyun.baidu.com/inde...注册领取AK,快乐做图。以热力图为例,代码如下。1#Bmap-散点图、热图和波纹图2importpandasaspd3frompyecharts.chartsimportBMap4frompyechartsimportoptionsasopts5frompyecharts.globalsimportChartType67data=pd.read_excel('GDP.xlsx')8province=list(data["province"])9g??dp=list(data["2019_gdp"])10list=[list(z)forzinzip(province,gdp)]11print(list)12c=(13BMap(init_opts=opts.InitOpts(width="1000px",height="600px"))14.add_schema(baidu_ak="你的AK",center=[120.13066322374,30.240018034923])15.add(16"GDP",17list,18type_="heatmap",#scatter是散点图,heatmap是热图,ChartType.EFFECT_SCATTER是波纹图19label_opts=opts.LabelOpts(formatter="{b}")20)21.set_global_opts(22title_opts=opts.TitleOpts(title="2019年各省GDP热力图"),visualmap_opts=opts.VisualMapOpts(max_=110000)23)24.render("Bmap1.html")25)运行后是这样的:foliumyouthinkthe以上maps可以满足我查理对数据可视化之美的追求,那你不贬低查理。经过研究,我发现叶库是天上的存在。首先,我用python调用了高德地图的API接口,获取了广州近6000个景点的地理数据,并保存为poi_scenic_spot.csv。以下为部分数据:然后安装folium库,设置刺激战场底图。当然你也可以换其他底图来玩。代码提供了mapbox底图、高德底图等,可以随意切换。1#folium-heatmap2importpandasaspd3importfolium4fromfoliumimportplugins56data=pd.read_csv('./poi_scenic_spot.csv',encoding='utf-8')78#heatmap1=folium.Map(location=[23.122373,113.268027],zoom_start=10,control_scale=True)#绘制地图,确定焦点,默认底图(加载缓慢)9heatmap1=folium.Map(location=[23.122373,113.268027],zoom_start=10,control_scale=True,tiles='stamenTerrain')#刺激战场底图10#heatmap1=folium.Map(location=[23.122373,113.268027],zoom_start=10,control_scale=True,tiles='MapboxBright')#mapbox底图11#heatmap1=folium.Map(location=[23.122373,113.268027],zoom_start=10,control_scale=True,tiles='stamentoner')#黑白底图1213#heatmap1=folium.Map(#高德基图14#location=[23.122373,113.268027],15#zoom_start=15,16#control_scale=True,17#tiles='http://webrd02.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}',18#attr='?Automap</a>'19#)2021folium.Marker([23.122373,113.268027],popup='Charlie',icon=folium.Icon(icon='cloud',color='green')).add_to(heatmap1)#创建中心标记22heatmap1.add_child(plugins.HeatMap([[row["lat"],row["lon"]]forname,rowindata.iterrows()]))#传入纬度andlongitude23heatmap1.save("folium_map1.html")#生成的网页迫不及待的运行起来,效果如下:哈哈哈哈,这么大的红烧鸡的热力图有点花哨,没用。光看这张景点分布图,我是很难摸清广州的。让我们试试另一张图片。1#folium-aggregatescattermap2importpandasaspd3importfolium4fromfoliumimportplugins56data=pd.read_csv('./poi_scenic_spot.csv',encoding='utf-8')78plotmap1=folium.Map(location=[23.122373,113.268027],zoom_start=10,control_scale=True,tiles='stamentoner')910folium.Marker([23.122373,113.268027],popup='我是J哥

',icon=folium.Icon(icon='cloud',color='green')).add_to(plotmap1)#创建中心标记11plotmap1.add_child(plugins.MarkerCluster([[row["lat"],row["lon"]]forname,rowindata.iterrows()]))12plotmap1.save('folium_map2.html')看看效果!\你就说酷不酷,或者炫不炫?结论Charlie认为以上总结相当完整。当然,python中还有很多其他的地图库,值得进一步挖掘。以后也会写地图可视化,请继续关注,精彩不容错过!对本地图使用的数据集和完整代码感兴趣的朋友,可在后台回复“地图可视化”免费获取。