本文使用python库——pyecharts绘制地图,修改标签样式并调色。重点在于参数调用方法(理解Union[Sequence[str]]或者看源码)。
效果如图:
pip install pyecharts
要绘制地图,看官方文档可知可以使用Geo或Map:Geo为地理坐标系,画出来是在地点对应的位置画点;Map是区域上色。故选用Map实现。
from example.commons import Faker
from pyecharts import options as opts
from pyecharts.charts import Map
def map_visualmap() -> Map:
c = (
Map()
.add("商家A", [list(z) for z in zip(Faker.provinces, Faker.values())], "china")
.set_global_opts(
title_opts=opts.TitleOpts(title="Map-VisualMap(连续型)"),
visualmap_opts=opts.VisualMapOpts(max_=200),
)
)
return c
可知需要在add函数中传入数据,格式为[[name,value]]
(例如[['北京',25],['广东',47],...]
,注意无‘省’‘市’等)。由于我数据是xls,故用pandas读入,如下。
data = pd.read_excel(path)
# ...
.add("", [list(z) for z in zip(data['地区'], data['2018年'])],"china")
得到如图
发现离预期效果的差别为 标签数字的显示 和 调色盘。
# Map类
class Map(
# 初始化配置项,参考 `global_options.InitOpts`
init_opts: opts.InitOpts = opts.InitOpts()
)
# Map.add()
def add(
# 系列名称,用于 tooltip 的显示,legend 的图例筛选。
series_name: str,
# 数据项 (坐标点名称,坐标点值)
data_pair: Sequence,
# 地图类型,具体参考 pyecharts.datasets.map_filenames.json 文件
maptype: str = "china",
# 是否选中图例
is_selected: bool = True,
# 是否开启鼠标缩放和平移漫游。
is_roam: bool = True,
# 当前视角的中心点,用经纬度表示
center: Optional[Sequence] = None,
# 当前视角的缩放比例。
zoom: Optional[Numeric] = 1,
# 自定义地区的名称映射
name_map: Optional[dict] = None,
# 标记图形形状
symbol: Optional[str] = None,
# 是否显示标记图形
is_map_symbol_show: bool = True,
# 标签配置项,参考 `series_options.LabelOpts`
label_opts: Union[opts.LabelOpts, dict] = opts.LabelOpts(),
# 提示框组件配置项,参考 `series_options.TooltipOpts`
tooltip_opts: Union[opts.TooltipOpts, dict, None] = None,
# 图元样式配置项,参考 `series_options.ItemStyleOpts`
itemstyle_opts: Union[opts.ItemStyleOpts, dict, None] = None,
# 高亮标签配置项,参考 `series_options.LabelOpts`
emphasis_label_opts: Union[opts.LabelOpts, dict, None] = None,
# 高亮图元样式配置项,参考 `series_options.ItemStyleOpts`
emphasis_itemstyle_opts: Union[opts.ItemStyleOpts, dict, None] = None,
)
首先实现标签格式化,看add类可知需要修改label_opts。这时需要找LabelOpts的文档。依照其中formatter的描述,修改即可实现(文档指出{b}是区域名,{c}是value名)。
# ...
Map().add("", [list(z) for z in zip(data['地区'],
data['2018年'])], "china",
label_opts=opts.LabelOpts(formatter='{b}\n{c}'),
接着实现调色。首先观察Map.add()函数,发现没有对应参数。观察demo样例,发现图例中max_=200
这个参数标定了阈值,故推测目标参数是global_opts中的VisualMapOpts。
到全局配置项查找,根据名字和提示估计为range_color参数。
其参数类型定义如下:
# visualMap 组件过渡颜色
range_color: Union[Sequence[str]] = None,
这里笔者在初学时不知道如何调用,只好去看源码。使用PyCharm ctrl+点击进入VisualMapOpts定义,发现如下:
class VisualMapOpts(BasicOpts):
def __init__(
self,
#...
):
_inrange_op: dict = {}
if type_ == "color":
range_color = range_color or ["#50a3ba", "#eac763", "#d94e5d"]
_inrange_op.update(color=range_color)
可知,在不传入range_color参数时,其默认为["#50a3ba", "#eac763", "#d94e5d"]
,是str列表形式传参。(其实在文档定义中 Union[Sequence[str]]
已经给出了参数形式,是python3对于数据类型的一种加强型标识)
故修改代码如下,得到预期结果。
def geo() -> Map:
c = (
Map()
.add("", [list(z) for z in zip(data['地区'], data['2018年'])], "china", label_opts=opts.LabelOpts(formatter='{b}\n{c}'),
)
.set_global_opts(
title_opts=opts.TitleOpts(title=""),
visualmap_opts=opts.VisualMapOpts(max_=20,range_color=["#90CAF9", "#1E88E5", "#0D47A1"]),
)
)
return c
geo().render_notebook()