在上一课中,我们已经介绍过使用 Plotly 实现地理信息可视化的方法。但是,那个工具对我们不是很友好,特别是由于某种不可抗力的存在,可能根本无法调试。
不过,pyecharts 的确在地理信息可视化上做得不错——如果仅做国内地图,特别推荐使用,还是通过示例来说明吧。
首先,要安装地图文件,安装方法如下:
$ pip install echarts-countries-pypkg # 全球国家地图
$ pip install echarts-china-provinces-pypkg # 中国省级地图
$ pip install echarts-china-cities-pypkg # 中国市级地图
$ pip install echarts-china-counties-pypkg # 中国县区地图
$ pip install echarts-china-misc-pypkg # 中国区域地图
不仅可以安装上述官方提供的地图文件,还能够自己制作个性化的地图扩展,具体请点击这里参阅。
注意:上述文件安装完毕,要重新启动 jupyter notebook。
5.2.1 地图上的散点图
有了上述基础,就可以进行地理信息可视化了(以下示例的数据源,请点击这里查看)。
import pandas as pd
from pyecharts import Geo
df = pd.read_csv("/Users/qiwsir/Documents/Codes/DataSet/pm25/pm2.csv")
city = df['CITY_NAME']
value = df['Exposed days']
geo = Geo("主要城市空气质量", "pm2.5", title_color = "#666666", title_pos = "center",
width=800, height=600, background_color = "#404a59")
geo.add("PM2.5", city, value, visual_range=[0, 300], visual_text_color='#fff', symbol_size=16, is_visualmap=True)
geo
image
实现上述效果的类是 Geo,默认情况下绘制散点图,此外可以实现 type='effectScatter'(闪耀的散点图)和 type='heatmap'(热图)。
此图也是动态交互的,通过左侧图例选择不同数值范围,相应地会显示该范围内的数据。
如果按照前面所述安装了各种地图文件,还可以在 geo.add 方法中规定地理范围。
df.sample(3)
RANK | CITY_ID | CITY_NAME | Exposed days | |
---|---|---|---|---|
115 | 127 | 97 | 阜新 | 91 |
40 | 45 | 88 | 丹东 | 49 |
71 | 79 | 55 | 吕梁 | 69 |
在 pyecharts 地图中认可的城市名称都如同上述结果显示的那样,例如“阜新”,不要写成“阜新市”。
js = pd.read_csv("/Users/qiwsir/Documents/Codes/DataSet/jiangsu/city_population.csv")
js_cities = [name[:-1] for name in js.name]
js_cities
# out
['南京', '无锡', '徐州', '常州', '苏州', '南通', '连云港', '淮安', '盐城', '扬州', '镇江', '泰州', '宿迁']
下面就绘制江苏省的空气质量分布图。
jspm = df[df['CITY_NAME'].isin(js_cities)]
geo = Geo(
"江苏城市空气质量",
"",
title_color="#202020",
title_pos="center",
width=800,
height=600,
background_color="#666666",
)
geo.add(
"",
jspm['CITY_NAME'],
jspm['Exposed days'],
maptype="江苏",
type="effectScatter",
is_random=True,
effect_scale=5,
is_legend_show=False,
)
geo
输出结果:
image这里的 geo.add 参数与前面的不同,导致了展示效果的差异。
5.2.2 地图上的热图
一直以来,房价都是人们关注的话题,下面就用可视化的方式研究一下近十年(2009—2018 年)全国部分城市平均房价(数据源:https://github.com/qiwsir/DataSet/tree/master/house)。
hp = pd.read_csv("/Users/qiwsir/Documents/Codes/DataSet/house/houseprice.csv")
hp['mean'] = hp.mean(axis=1)
hp.drop(index=46, inplace=True) # 有城市在默认安装的地图文件中没有,将其删除
geo = Geo("主要城市房产均价", "", title_color='#111111', width=800, height=600)
geo.add('PRICE', hp['city_name'], hp['mean'],
visual_range=[2000, 40000], symbol_size=20,
is_visualmap=True, type="heatmap")
geo
输出结果:
image在热图查看房价的基础上,为了更准确查看某些城市的房价走向,可以使用折线图看看趋势,例如下列几个城市。
some_cities = hp[hp['city_name'].isin(['上海', '苏州', "北京", "南京", '杭州', '广州'])]
from pyecharts import Line
years = ['2009', '2010', '2011', '2012', '2013', '2014', '2015', '2016', '2017', '2018']
line = Line('选择几个城市的房价', width=800, height=600)
for city in some_cities['city_name']:
line.add(city, years, some_cities[some_cities['city_name']==city][years].values[0])
line
image
网友评论