Pyecharts 地图语法
在 Pyecharts 中,我们可以使用 Map 这个模块来绘制一个地图。地图的主要作用是:展示地区对应的数据。
语法:
map = Map()
map.add(series_name, data_pair, maptype)
说明:
对于地图来说,它也是使用 add() 方法。参数 series_name 是一个必选参数,用于定义系列的名字。参数 data_pair 也是一个必选参数,用于定义地图的数据。
参数 maptype 用于定义地图的类型,常用的取值如下表所示。
| 取值 | 说明 |
|---|---|
| world | 世界地图 |
| china | 中国地图 |
| 广东 | 广东地图(可换成其他省) |
| 广州市 | 广州地图(可换成其他市) |
对于 maptype 的取值,我们一定要严格按照下面这 3 个规范才行。
- 如果想要使用中国地图,我们必须写成 maptype='china',而不能写成 maptype='China' 或 maptype='中国' 等。
- 如果想要使用广东地图,我们必须写成 maptype='广东',而不能写成 maptype='广东省' 或 maptype='Guangdong' 等。
- 如果想要使用广州地图,我们必须写成 maptype='广州市',而不能写成 maptype='广州' 或 maptype='guangzhou' 等。
示例 1:Pyecharts 绘制中国地图
import numpy as np
import pandas as pd
from pyecharts.charts import Map
# 数据
data = [
['北京市', 520],
['上海市', 560],
['广东省', 720],
['江苏省', 600],
['浙江省', 650]
]
df = pd.DataFrame(data, columns=['省份', '销量'])
df_array = np.array(df) # 转换为数组
df_list = df_array.tolist() # 转换为列表
# 绘图
map = Map()
map.add(series_name='各省份销量统计', data_pair=df_list, maptype='china')
# 渲染
map.render()
运行生成的 render.html,浏览器效果如下图所示。

分析:
maptype='china' 表示使用的是中国地图。对于参数 data_pair 来说,它的取值要求是一个二维列表,下面 2 种形式都是可行的。
# 方式1
[
['北京市', 520],
['上海市', 560],
['广东省', 720],
['江苏省', 600],
['浙江省', 650]
]
# 方式2
[
('北京市', 520),
('上海市', 560),
('广东省', 720),
('江苏省', 600),
('浙江省', 650)
]
需要注意的是,省份或地区的名字要写对。比如把 “广东省” 写成 “厂东省”,此时就会有问题。并且省份要加上 “省”,比如 “广东省” 不能写成 “广东”。而直辖市要加上 “市”,比如 “北京市” 不能写成 “北京”。否则可能会无法正常显示。
此外,我们并不要求每一个省份都要有对应的数据。哪些省份有数据,地图就会用一个小红点标记出来。如果一个省份没有小红点,那么就表示该省份没有数据。
当我们把鼠标移到有数据的地区,比如移到 “广东” 这个地方,此时就会高亮该地区,并且显示对应的数据,如下图所示。

示例 2:省级地图
import numpy as np
import pandas as pd
from pyecharts.charts import Map
# 数据
data = [
['广州市', 450],
['深圳市', 420],
['东莞市', 360],
['佛山市', 380],
['珠海市', 320]
]
df = pd.DataFrame(data, columns=['城市', '销量'])
df_array = np.array(df) # 转换为数组
df_list = df_array.tolist() # 转换为列表
# 绘图
map = Map()
map.add(series_name='各城市销量统计', data_pair=df_list, maptype='广东')
# 渲染
map.render()
运行生成的 render.html,浏览器效果如下图所示。

分析:
对于这个例子来说,数据部分的城市名后面必须要有一个 “市”,否则就无法正确对应显示。
# 正确
[
['广州市', 450],
['深圳市', 420],
['东莞市', 360],
['佛山市', 380],
['珠海市', 320]
]
# 错误
[
['广州', 450],
['深圳', 420],
['东莞', 360],
['佛山', 380],
['珠海', 320]
]
如果你的 DataFrame 中的城市名本身是不包含 “市” 字的,我们需要借助 Pandas 提供的方法来处理成正确的格式才行。总而言之,在实际开发中,如果你发现地图中的数据并没有正确显示,很可能就是数据中的地区名和地图中的地区名没有正确对应。
示例 3:世界地图
import numpy as np
import pandas as pd
from pyecharts.charts import Map
import pyecharts.options as opts
# 数据
data = [
['United States', 20.95],
['China', 15.58],
['Japan', 4.95],
['Germany', 3.78],
['United Kingdom', 2.71],
['India', 2.62],
['France', 2.60],
['Italy', 1.85],
['Canada', 1.64],
['Korea', 1.63]
]
df = pd.DataFrame(data, columns=['国家', 'GDP'])
df_array = np.array(df) # 转换为数组
df_list = df_array.tolist() # 转换为列表
# 绘图
map = Map()
map.add(series_name='各国GDP', data_pair=df_list, maptype='world')
# 渲染
map.render()
运行生成的 render.html,浏览器效果如下图所示。

分析:
默认情况下,地图会把所有国家或地区的名字全部显示出来。至于如何解决这个问题,我们后面会详细介绍。
Pyecharts 地图样式
在 Pyecharts 中,对于地图的自定义样式,主要包括 2 个方面:① 隐藏地名;② 添加区分。
1. 隐藏地名
在 Pyecharts 中,我们可以使用 set_series_opts() 方法结合 label_opts 参数来隐藏地名。隐藏地名,其实也就是把 “标签(label)” 隐藏起来。
示例 4:Pyecharts 地图隐藏地名
import numpy as np
import pandas as pd
from pyecharts.charts import Map
import pyecharts.options as opts
# 数据
data = [
['北京市', 520],
['上海市', 560],
['广东省', 720],
['江苏省', 600],
['浙江省', 650]
]
df = pd.DataFrame(data, columns=['省份', '销量'])
df_array = np.array(df) # 转换为数组
df_list = df_array.tolist() # 转换为列表
# 绘图
map = Map()
map.add(series_name='各省份销量统计', data_pair=df_list, maptype='china')
# 隐藏地名(标签)
map.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
# 渲染
map.render()
运行生成的 render.html,浏览器效果如下图所示。

分析:
is_show=False 表示把所有标签(即地名)隐藏起来。在实际开发中,如果地图中的标签过多,反而会影响用户体验。虽然标签是隐藏了,不过我们将鼠标移到有数据的区域时,还是会提示该区域的数据,如下图所示。

2. 添加区分
在 Pyecharts 中,我们可以使用 set_global_opts() 方法结合 visualmap_opts 参数来为地图添加颜色区分。
示例 5:Pyecharts 地图添加区分
import numpy as np
import pandas as pd
from pyecharts.charts import Map
import pyecharts.options as opts
# 数据
data = [
['北京市', 520],
['上海市', 560],
['广东省', 720],
['江苏省', 600],
['浙江省', 650]
]
df = pd.DataFrame(data, columns=['省份', '销量'])
df_array = np.array(df) # 转换为数组
df_list = df_array.tolist() # 转换为列表
sale_min = int(df['销量'].min()) # 获取最小值
sale_max = int(df['销量'].max()) # 获取最大值
# 绘图
map = Map()
map.add(series_name='各省份销量统计', data_pair=df_list, maptype='china')
# 添加颜色区分
map.set_global_opts(visualmap_opts=opts.VisualMapOpts(
type_='color',
min_=sale_min,
max_=sale_max,
pos_bottom=50,
pos_right=0
))
# 渲染
map.render()
运行生成的 render.html,浏览器效果如下图所示。

分析:
如果你觉得默认的颜色不好看,也可以使用 range_color 这个参数来自定义颜色。修改后的代码如下,再次运行后的效果如下图所示。
map.set_global_opts(visualmap_opts=opts.VisualMapOpts(
type_='color',
min_=sale_min,
max_=sale_max,
pos_bottom=50,
pos_right=0,
range_color=['lightskyblue', 'yellow', 'orangered']
))

示例 6:综合实例(世界地图)
import numpy as np
import pandas as pd
from pyecharts.charts import Map
import pyecharts.options as opts
# 数据
data = [
['United States', 20.95],
['China', 15.58],
['Japan', 4.95],
['Germany', 3.78],
['United Kingdom', 2.71],
['India', 2.62],
['France', 2.60],
['Italy', 1.85],
['Canada', 1.64],
['Korea', 1.63]
]
df = pd.DataFrame(data, columns=['国家', 'GDP'])
df_array = np.array(df) # 转换为数组
df_list = df_array.tolist() # 转换为列表
gdp_min = int(df['GDP'].min()) # 获取最小值
gdp_max = int(df['GDP'].max()) # 获取最大值
# 绘图
map = Map()
map.add(series_name='各国GDP', data_pair=df_list, maptype='world')
# 不显示label
map.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
# 添加颜色区分
map.set_global_opts(visualmap_opts=opts.VisualMapOpts(
type_='color',
min_=gdp_min,
max_=gdp_max,
pos_bottom=50,
pos_right=0,
range_color=['lightskyblue', 'yellow', 'orangered']
))
# 渲染
map.render()
运行生成的 render.html,浏览器效果如下图所示。

