python pyecharts绘制地图

效果

本文使用python库——pyecharts绘制地图,修改标签样式并调色。重点在于参数调用方法(理解Union[Sequence[str]]或者看源码)。
效果如图:
在这里插入图片描述

工具与配置

pip install pyecharts

实操

要绘制地图,看官方文档可知可以使用Geo或Map:Geo为地理坐标系,画出来是在地点对应的位置画点;Map是区域上色。故选用Map实现。

  • 看官网Demo
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")

得到如图
初始
发现离预期效果的差别为 标签数字的显示 和 调色盘。

  • 看API
# 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()

效果图

  • 5
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值