关于python:实战Python轻松实现地图可视化附详细源码

33次阅读

共计 5913 个字符,预计需要花费 15 分钟才能阅读完成。

​Python 的地图可视化库很多,Matplotlib 库尽管作图很弱小,但只能做动态地图。而我明天要讲的是交互式地图库,别离为 pyecharts、folium,把握这两个库,根本能够解决你的地图可视化需要。

pyecharts

首先,必须说说弱小的 pyecharts 库,简略易用又酷炫,简直能够制作任何图表。pyecharts 有 v0.5 和 v1 两个版本,两者不兼容,最新的 v1 版本开始反对链式调用,采纳 options 配置图表。pyecharts 在制作地图方面,蕴含 Map、Geo 和 Bmap 三类,应用 Map 类反对世界、国家、省市和区县四级地图,应用前需独立装置。so,pip 它们!

1pip install pyecharts
2pip install echarts-countries-pypkg
3pip install echarts-china-provinces-pypkg
4pip install echarts-china-cities-pypkg
5pip install echarts-china-counties-pypkg

pip 完之后,查看下 pyecharts 版本。

1import pyecharts
2print(pyecharts.__version__)

毋庸置疑,必定是最新版本啦,版本号为 1.6.2。

一 Map
在制作地图前,首先要有数据,我从 Wind 数据库导出了全国各省 GDP 总量数据,命名为 GDP.xlsx,如下图所示。

\

有了数据,咱们就能够用 python 开始操作了,先把须要的库 import 一下。

1import pandas as pd  #pandas 是弱小的数据处理库
2from pyecharts.charts import Map
3from pyecharts import options as opts 

用 pandas 读取 GDP.xlsx,提取 2019 年各省 GDP 数据为例,咱们来制作地图。这里留神下 zip() 函数,它用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,而后返回由这些元组组成的对象。

1data = pd.read_excel('GDP.xlsx')
2province = list(data["province"])
3gdp = list(data["2019_gdp"])
4list = [list(z) for z in zip(province,gdp)]

咱们来打印下 list,长这样:


其实就是列表里嵌套列表的数据结构,只有这种构造把数据增加到地图中去。咱们用 Map 类中的罕用办法 add、set_global_opts 和 render 来配置地图。

 1c = (2    Map(init_opts=opts.InitOpts(width="1000px", height="600px"))  #初始化地图大小
 3    .set_global_opts(4        title_opts=opts.TitleOpts(title="2019 年各省 GDP 分布图  单位: 亿元"),  #配置题目
 5        visualmap_opts=opts.VisualMapOpts(
 6            type_ = "scatter"   #散点类型
 7        )
 8    )
 9    .add("GDP",list,maptype="china")  #将 list 传入,地图类型为中国地图
10    .render("Map1.html")
11)

运行以上代码,用浏览器关上生成的 Map1.html,成果如下:

有敌人可能会问了,地图倒是有了,可你这地图不好辨别不同省的 GDP 大小呀。不慌,咱们持续优化以上代码,给不同省根据 GDP 的大小配置不同的色彩,让你高深莫测。

 1c = (2    Map(init_opts=opts.InitOpts(width="1000px", height="600px")) #可切换主题
 3    .set_global_opts(4        title_opts=opts.TitleOpts(title="2019 年各省 GDP 分布图  单位: 亿元"),
 5        visualmap_opts=opts.VisualMapOpts(
 6            min_=1000,
 7            max_=110000,
 8            range_text = ['GDP 总量(亿)色彩区间:', ''],  #分区间
 9            is_piecewise=True,  #定义图例为分段型,默认为间断的图例
10            pos_top= "middle",  #分段地位
11            pos_left="left",
12            orient="vertical",
13            split_number=10  #分成 10 个区间
14        )
15    )
16    .add("GDP",list,maptype="china")
17    .render("Map2.html")
18)

运行以上代码,用浏览器关上生成的 Map2.html,成果如下:


怎么样,这下成果是不是好多了,色彩越红代表 GDP 越高。你所在的省份 2019 年 GDP 处于哪个色彩段呢?当然,对于有些审美较高的敌人可能还是无奈满足你的要求。


既然如此,那我再优化下代码,给地图增加主题。增加主题很简略,只有 import 下 ThemeType,而后将主题增加到 Mpa() 办法内。我以 ThemeType.DARK 为例看下成果。

1from pyecharts.globals import ThemeType #引入主题
2Map(init_opts=opts.InitOpts(width="1000px", height="600px",theme = ThemeType.DARK)) #增加主题 ThemeType.DARK

运行一下看看成果:
\
有没有 B 格回升 n 个 level 的感觉,如果你还不称心,ok,pyecharts 内置了 10 余种主题任你切换。萝卜青菜各有所爱,自个调去吧~

\

二、Geo
Geo 与 Map 相似,能够通过设置 maptype 参数抉择地图类型,所反对的办法也和 Map 相似,我这里就不赘述了,间接贴代码。

 1#Geo 地图 - 涟漪图
 2import pandas as pd
 3from pyecharts import options as opts
 4from pyecharts.charts import Geo
 5from pyecharts.globals import ChartType
 6
 7data = pd.read_excel('GDP.xlsx')
 8province = list(data["province"])
 9gdp = list(data["2019_gdp"])
10list = [list(z) for z in zip(province,gdp)]
11print(list)
12c = (13    Geo()
14    .add_schema(maptype="china")
15    .add(
16        "geo",
17        list,  #传入数据
18        symbol_size=10, large_threshold=110000,  #设置涟漪大小
19        type_=ChartType.EFFECT_SCATTER,   #地图类型为涟漪图
20    )
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)

运行一下,成果如下:

三 Bmap
Bmap 是百度地图的一个接口,你如果 Map 和 Geo 搞明确了,Bmap 也是分分钟能够搞定的。不过,有一点要留神,你要先到百度地图开放平台注册,获取 AK 才能够调用哦。注册地址:https://lbsyun.baidu.com/inde… 注册取得 AK,就能够开心制作地图啦,以热力求为例,代码如下。

 1#Bmap- 散点图、热力求和涟漪图
 2import pandas as pd
 3from pyecharts.charts import BMap
 4from pyecharts import options as opts
 5from pyecharts.globals import ChartType
 6
 7data = pd.read_excel('GDP.xlsx')
 8province = list(data["province"])
 9gdp = list(data["2019_gdp"])
10list = [list(z) for z in zip(province,gdp)]
11print(list)
12c = (13    BMap(init_opts=opts.InitOpts(width="1000px", height="600px"))
14    .add_schema(baidu_ak="你的 AK", center=[120.13066322374, 30.240018034923])
15    .add(
16        "GDP",
17        list,
18        type_="heatmap",  #scatter 为散点图,heatmap 为热力求,ChartType.EFFECT_SCATTER 为涟漪图
19        label_opts=opts.LabelOpts(formatter="{b}")
20    )
21    .set_global_opts(22        title_opts=opts.TitleOpts(title="2019 年各省 GDP 热力求"), visualmap_opts=opts.VisualMapOpts(max_=110000)
23    )
24    .render("Bmap1.html")
25)

运行后,长这样:

folium

你认为以上几个地图就能满足我查理对数据可视化美感的谋求,那你太小看查理了,我通过钻研,发现 folium 库才是吊炸天的存在。

首先,我用 python 调取了高德地图 API 接口,取得了广州市近 6000 个景点的天文数据,保留为 poi_scenic_spot.csv。以下为局部数据:

而后装置 folium 库,设置刺激战场底图,当然你也能够换其余底图玩,代码中提供了 mapbox 底图、高德底图等,任你随便切换。

 1#folium- 热力求
 2import pandas as pd
 3import folium
 4from folium import plugins
 5
 6data = pd.read_csv('./poi_scenic_spot.csv',encoding='utf-8')
 7
 8# 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='stamen Terrain') #刺激战场底图
10# heatmap1 = folium.Map(location=[23.122373,113.268027], zoom_start=10,control_scale = True,tiles='Mapbox Bright') #mapbox 底图
11# heatmap1 = folium.Map(location=[23.122373,113.268027], zoom_start=10,control_scale = True,tiles='stamentoner') #黑白底图
12
13# 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='&copy; <a href="http://ditu.amap.com/"> 高德地图 </a>'
19#     )
20
21folium.Marker([23.122373,113.268027],popup='<i> 查理 </i>',icon=folium.Icon(icon='cloud',color='green')).add_to(heatmap1)  #创立核心标记
22heatmap1.add_child(plugins.HeatMap([[row["lat"],row["lon"]] for name, row in data.iterrows()]))  #传入经纬度
23heatmap1.save("folium_map1.html")  #生成网页 

急不可待运行了下,成果如下:


哈哈哈哈,好大一只红烧鸡。

热力求有点中看不中用啊,看这图我也很难搞分明广州的景点散布状况。那咱换个别的图试试。

 1#folium- 聚合散点地图
 2import pandas as pd
 3import folium
 4from folium import plugins
 5
 6data = pd.read_csv('./poi_scenic_spot.csv',encoding='utf-8')
 7
 8plotmap1 = folium.Map(location=[23.122373,113.268027], zoom_start=10,control_scale = True,tiles='stamentoner')
 9
10folium.Marker([23.122373,113.268027],popup='<p style="color: green"> 我是 J 哥 </p>',icon=folium.Icon(icon='cloud',color='green')).add_to(plotmap1)  #创立核心标记
11plotmap1.add_child(plugins.MarkerCluster([[row["lat"],row["lon"]] for name, row in data.iterrows()]))
12plotmap1.save('folium_map2.html')

看成果!
\
你就说酷不酷,炫不炫?

结 语

查理自认为以上演绎还算残缺,当然,python 的地图库还有很多,值得进一步开掘。我当前还会写地图可视化的内容,欢送持续关注,精彩不错过!对本文地图所用数据集和残缺代码感兴趣的小伙伴后盾回复“地图可视化”即可收费支付啦。

正文完
 0