python pyecharts绘制地图

效果

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


image.png

工具与配置

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")

得到如图


image.png

发现离预期效果的差别为 标签数字的显示 和 调色盘。

  • 看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()
image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,496评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,407评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,632评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,180评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,198评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,165评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,052评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,910评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,324评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,542评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,711评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,424评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,017评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,668评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,823评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,722评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,611评论 2 353

推荐阅读更多精彩内容