pyecharts中提供了两种地图,map地图和geo地理坐标系,两者都能够满足地图显示需求,但在实际应用过程中,需要调整的地方还有很多。本文主要介绍关于map,geo的显示调整,因为需求为图片输出,所以不涉及交互效果部分内容。
map地图:
具体参数不多赘述,可查看pyecharts官网介绍。
map 世界地图默认为英文显示(中国及中国省市区县地图为中文显示),若传入的参数为中文则不会绘制图表,如:['China', 79246] 正常显示,['中国', 79246] 无法显示,这时候就需要一个对照表 将其转化为中文显示。(对照表赋予下一篇,也可自行寻找其他对照表)。若存在地图上没有标记的地区 不会报错,但也不会显示。
def cunchupng() -> Map:
#数据处理
df1 = df[['受理局', '公开(公告)号']]
df1 = df1.groupby('受理局', as_index=False)['公开(公告)号'].count()
df1 = df1.sort_values(by='公开(公告)号', ascending=False)
df1.columns = ['受理局', '申请数量']
df1 = df1.head(10)
listx = list(df1['受理局'])
listy = list(df1['申请数量'])
data_pair = [list(z) for z in zip(listx, listy)]
c = (
Map(init_opts=opts.InitOpts(
bg_color='#FFFFFF',
))
.add(series_name="", data_pair=data_pair, maptype="world", # world,china 省 市
is_map_symbol_show=False,name_map=name_map) #更改地图中文显示
.set_series_opts(
label_opts=opts.LabelOpts( #标签配置 若改为 True 则所有标签都会显示
is_show=False,
formatter="{b}",
font_size=8, ))
.set_global_opts(
title_opts=opts.TitleOpts(
title="全球专利地区分布分析",
pos_top='2%',
pos_left='center',
title_textstyle_opts=opts.TextStyleOpts(font_size=30),
),
legend_opts=opts.LegendOpts(
is_show=False, ),
visualmap_opts=opts.VisualMapOpts( #颜色映射
is_show=True,
min_=2500,
max_=12000,
range_text=['高', '低'])
)
)
return c
c = cunchupng()
make_snapshot(driver, c.render(), r"D:\工具自动化绘图\全球专利地区分布分析map.png")
运行结果及效果显示:
不显示标签:
不足之处: 1.在输出的dataframe中 ['欧洲专利局', 1646], ['世界知识产权组织', 1586] 两项并未显示,造成数据缺失。2.在标签显示中,只能选择全部显示和全不显示(为空值的地区也会显示,显示效果过于杂乱)。
geo地理坐标系:
geo相较于map优势在于:1.标签可只显示数据列表中的地区,其他为空的地区不显示。2.标记类型丰富,如散点,涟漪,柱图等。3.可以自定义新增坐标点,以经纬度为参考。4.图表简洁,可显示的信息多,如名称、数据、经纬度。区别在于:1.地图为英文显示,没有提供转换中文的参数。2.没有区域色块填充效果。
def cunchupng() -> Geo:
df1 = df[['受理局', '公开(公告)号']]
df1 = df1.groupby('受理局', as_index=False)['公开(公告)号'].count()
df1 = df1.sort_values(by='公开(公告)号', ascending=False)
df1.columns = ['受理局', '申请数量']
df1 = df1.head(10)
print(df1)
listx = list(df1['受理局'])
listy = list(df1['申请数量'])
data_pair = [list(z) for z in zip(listx, listy)]
print(data_pair)
c = (
Geo(init_opts=opts.InitOpts(
bg_color='#FFFFFF',
))
## 新增坐标点
.add_coordinate(
name='中国',
longitude=104,
latitude=35,
)
.add_coordinate(
name='日本',
longitude=138,
latitude=36,
)
.add_coordinate(
name='韩国',
longitude=128,
latitude=36,
)
.add_coordinate(
name='俄罗斯',
longitude=87,
latitude=64,
)
.add_coordinate(
name='印度',
longitude=78,
latitude=20,
)
.add_coordinate(
name='德国',
longitude=10,
latitude=51,
)
.add_coordinate(
name='美国',
longitude=-95,
latitude=37,
)
.add_coordinate(
name='加拿大',
longitude=-106,
latitude=56,
)
.add_coordinate(
name='欧洲专利局',
longitude=5,
latitude=52,
)
.add_coordinate(
name='世界知识产权组织',
longitude=8,
latitude=46,
)
.add_coordinate( #用于测试,新增点不存在与列表中,不影响正常输出
name='测试',
longitude=108,
latitude=46,
)
.add_schema(maptype="world") #地图类型
.add("geo", data_pair,symbol_size= 12,) #名字 数据 尺寸
.set_series_opts(
label_opts=opts.LabelOpts( #标签配置
is_show=True,
formatter="{b}",
font_size=8,))
.set_global_opts(
visualmap_opts=opts.VisualMapOpts( #颜色映射
is_show=True,
min_=2500,
max_=12000,
range_text=['高', '低']),
title_opts=opts.TitleOpts( #标题配置
title="全球专利地区分布分析",
pos_top='2%',
pos_left='center',
title_textstyle_opts=opts.TextStyleOpts(font_size=30),
),
legend_opts=opts.LegendOpts(
is_show=False,)
)
)
return c
c = cunchupng()
make_snapshot(driver, c.render(), r"D:\工具自动化绘图\全球专利地区分布分析geo.png")
对于geo地图英文显示问题,主要解决方法有:1.新增坐标点,尽量完善坐标点覆盖面。2.更换地图模板,采用中文显示的世界地图模板。
map与geo各有各的优劣,可根据实际情况选择使用。要是既想要色块填充,又想要只显示数据标签、自定义坐标点怎么办?可以通过图表叠加实现,pyecharts中提供了叠加的方法, 层叠多图overlap,但其只可用于直角坐标系中,不能用于map和geo的叠加,而采用多图组合grid即可实现叠加.
grid =(
Grid(init_opts=opts.InitOpts(
bg_color='#FFFFFF',
))
.add(map,grid_opts=opts.GridOpts()) # map geo叠加 grid_opts 参数中的pos_left等 无效
.add(geo,grid_opts=opts.GridOpts()) #个人理解 pos_left是调整直角坐标系的 图表位置 而 map geo不存在坐标系 因此无效
)
return grid
直接赋予map,geo代码后,更改返回值即可。