Pyecharts v1 Geo库的一些更新与应用

最近在利用Python进行爬虫的过程中,需要对网页中爬取的数据做一些可视化的处理,其中有部分数据是关于地区分布的,在地图上标注出具体的参数分布将使得数据更加的直观与生动。

地图标注的工具我选择使用的是Pyecharts库中Geo,运行在Pycharm下,值得注意的是,最新的Pyecharts库版本是v1, 是最新的版本,且与老版本 v0.5.X 是不兼容的,v0.5.X版本也已不再维护,所以建议以后尽量应用最新的v1版,本文也将在此对其进行一些Geo库的更新应用的说明。

Pyecharts v1版本的安装可使用pip install pyecharts -U,也可直接在Pycharm中安装Pyecharts,其说明文档地址为https://pyecharts.org/#/zh-cn/intro

Pyecharts v0.5.X版本的安装可使用pip install pyecharts==0.5.11,其说明文档地址为https://05x-docs.pyecharts.org/#/zh-cn/prepare

新版本Pyecharts中的地理图表Geo有着较大的改动,总的一个最直观的更新感受是,新的库没有以前那么繁琐了,应用起来更简单直接。因为本人刚接触Python,很多东西也是刚刚入门,现阶段也只是达到能够初步使用Geo的程度,在探索使用新版本的过程中发现网上关于新板Pyecharts的说明很少,所以在这里将自己遇到的一些问题以及自己的一些见解整理出来,以下的一些说明与理解可能较为粗浅,万望各位读者见谅。

Geo:地理坐标系

Geo作为一个地理坐标标注的工具,在功能上新老版本基本是一致的,但在细节上却有着很大的差别,这也导致了新旧代码是完全不通用的。

1. 创建Geo:geo = Geo()

在v0.5.X版本中在创建geo的过程中是可以对其进行一些基本参数设定的

如以说明文档中的例子:

geo = Geo("全国主要城市空气质量", "data from pm2.5", title_color="#fff", title_pos="center",  width=1200, height=600, background_color="#404a59", ) 

可以设定主标题,副标题,标题颜色为止,图表大小,背景颜色等。

但在新版本中继续按照这样的格式进行创建时,编译器报错AttributeError: 'str' object has no attribute 'get',没有这样的对象。在新版文档中对Geo是直接进行创建的geo = Geo(),其实这样创建基本也就可以了,但是如果你真的想对其进行更多的参数设置,当然也是可以的。

在新的库中,对Geo的操作统一放在init_opts中,对其进行更改需要统一的对类opts.InitOpts进行修改,这里我们就需要引入from pyecharts import options as opts才能进行调用。

具体的InitOpts包括以下一些参数

    class InitOpts(BasicOpts):
    def __init__(
        self,
        width: str = "900px",
        height: str = "500px",
        chart_id: Optional[str] = None,
        renderer: str = RenderType.CANVAS,
        page_title: str = CurrentConfig.PAGE_TITLE,
        theme: str = ThemeType.WHITE,
        bg_color: Union[str, dict] = None,
        js_host: str = "",
        animation_opts: Union[AnimationOpts, dict] = AnimationOpts(),
    ):
        self.opts: dict = {
            "width": width,
            "height": height,
            "chart_id": chart_id,
            "renderer": renderer,
            "page_title": page_title,
            "theme": theme,
            "bg_color": bg_color,
            "js_host": js_host,
            "animationOpts": animation_opts,
        }

需要注意的是对opt.InitOpts直接进行配置的话,只能对部分参数进行更改,如bg_color等,而width,height等参数是固定的无法修改的,比如如果这样设定

geo = Geo(init_opts = opts.InitOpts("aaa", width = 400, height = 200, bg_color = "#404a59"))

将报TypeError: init() got multiple values for argument 'width'多赋值的错误。好在新版本除了提供Opts 配置项作为参数传入,还提供了原生 dict 作为参数配置,所有参数均可以自己任意定义,具体操作代码是

geo = Geo(init_opts = {"width":1600,"chart_id":"ceshi","bg_color":"#404a59"})

这里发现了一个奇怪的现象,当更改height参数时,将直接导致地图标注无图像,至今未明白其中的原因。

2.add_schema设置

add_schema是Geo下的一个函数,具体功能是对地图的参数与功能进行一些配置,主要包括有

def add_schema(
    # 地图类型,具体参考 pyecharts.datasets.map_filenames.json 文件
    maptype: str = "china",

    # 是否开启鼠标缩放和平移漫游。
    is_roam: bool = True,

    # 当前视角的缩放比例。默认为 1
    zoom: Optional[Numeric] = None,

    # 当前视角的中心点,用经纬度表示。例如:center: [115.97, 29.71]
    center: Optional[Sequence] = None,

    # # 标签配置项,参考 `series_options.LabelOpts`
    label_opts: Union[opts.LabelOpts, dict, None] = None,

    # 地图区域的多边形 图形样式。
    itemstyle_opts: Union[opts.ItemStyleOpts, dict, None] =None,

    # 高亮状态下的多边形样式
    emphasis_itemstyle_opts: Union[opts.ItemStyleOpts, dict,None] = None,

    # 高亮状态下的标签样式。
    emphasis_label_opts: Union[opts.LabelOpts, dict, None] =None,
):

这里我只使用过maptype,zoom,label_opts的设置,具体设置如下

geo.add_schema(maptype = "china", zoom = 1, label_opts = opts.LabelOpts(is_show=True))

maptype可替换成世界地图,省份地图等,地图资源可通过以下

pip install echarts-countries-pypkg
pip install echarts-china-provinces-pypkg
pip install echarts-china-cities-pypkg
pip install echarts-china-counties-pypkg
pip install echarts-china-misc-pypkg

zoom是缩放设置,label_opts是标签设置,如同1中的设置,这里也是可以通过原生dict进行自定义设置的。

3.add_coordinate设置:新增坐标点

Geo中可以自己增加需要标注的坐标点,通过设置地点,经度,纬度这三个参数即可完成添加。

def add_coordinate(
    # 坐标地点名称
    name: str,

    # 经度
    longitude: Numeric,

    # 纬度
    latitude: Numeric,
)

这个函数和旧版是一致的,应用也非常简单,此处不再多加赘述,举一个简单的例子

geo.add_coordinate("标注地点", 120, 80)
4.add设置:显示与图例筛选

这是Geo中最主要的函数模块,可供设置的参数类型也比较多,新版的add函数结构与以前相比也有较大的改动,相关的参数如下所示

def add(
    # 系列名称,用于 tooltip 的显示,legend 的图例筛选。
    series_name: str,

    # 数据项 (坐标点名称,坐标点值)
    data_pair: Sequence,

    # Geo 图类型,有 scatter, effectScatter, heatmap, lines 4 种,建议使用
    # from pyecharts.globals import GeoType
    # GeoType.GeoType.EFFECT_SCATTER,GeoType.HEATMAP,GeoType.LINES
    type_: str = "scatter",

    # 是否选中图例
    is_selected: bool = True,

    # 标记图形形状
    symbol: Optional[str] = None,

    # 标记的大小
    symbol_size: Numeric = 12,

    # 系列 label 颜色
    color: Optional[str] = None,

    # 是否是多段线,在画 lines 图情况下
    is_polyline: bool = False,

    # 是否启用大规模线图的优化,在数据图形特别多的时候(>=5k)可以开启
    is_large: bool = False,

    # 特效尾迹的长度。取从 0 到 1 的值,数值越大尾迹越长。默认值 0.2
    trail_length: Numeric = 0.2,

    # 开启绘制优化的阈值。
    large_threshold: Numeric = 2000,

    # 标签配置项,参考 `series_options.LabelOpts`
    label_opts: Union[opts.LabelOpts, dict] = opts.LabelOpts(),

    # 涟漪特效配置项,参考 `series_options.EffectOpts`
    effect_opts: Union[opts.EffectOpts, dict] = opts.EffectOpts(),

    # 线样式配置项,参考 `series_options.LineStyleOpts`
    linestyle_opts: Union[opts.LineStyleOpts, dict] = opts.LineStyleOpts(),

    # 提示框组件配置项,参考 `series_options.TooltipOpts`
    tooltip_opts: Union[opts.TooltipOpts, dict, None] = None,

    # 图元样式配置项,参考 `series_options.ItemStyleOpts`
    itemstyle_opts: Union[opts.ItemStyleOpts, dict, None] = None,
)

其中,新旧版本最大的一个不同是,旧版的地点和值分开配置给attr和value,旧版的典型示例如下

from pyecharts import Geo

data = [
    ("海门", 9), ("鄂尔多斯", 12), ("招远", 12), ("舟山", 12), ("齐齐哈尔", 14), ("盐城", 15)
]
geo = Geo(
    "全国主要城市空气质量",
    "data from pm2.5",
    title_color="#fff",
    title_pos="center",
    width=1200,
    height=600,
    background_color="#404a59",
)
attr, value = geo.cast(data)
geo.add("", attr, value, type="effectScatter", is_random=True, effect_scale=5)
geo.render()

而新版的add函数将地点和值放在了一个数据项里,

geo.add("", [attr, value], type_=ChartType.HEATMAP, symbol_size = 12, label_opts = opts.LabelOpts(is_show=False))

其他一些参数配置大致与以前是一致的,配置方式也可同样参照1中的方式进行。

在运行中发现一个有趣的问题,如一个个对坐标进行显示插入

geo.add_coordinate("测试点1", 20, 40)
geo.add("haha1", [("测试点1", 60)])
geo.add_coordinate("测试点2", 60, 80)
geo.add("haha2", [("测试点2", 60)])

这样运行是没有问题的,但如果对列表中的项进行批量的插入,如

for i in range(num):
    geo.add_coordinate(address[i], lng[i], lat[i])
    geo.add("", [(address[i],60)])

这样做是会报错的,具体原因不是太明白,无奈只能进行如下修改

for i in range(num):
    geo.add_coordinate(address[i], lng[i], lat[i])
geo.add("", [(address[i],60) for i in range(num)])

做了这样的修改后就没有问题了,如果有知道原因的朋友可以留言给我,万分感谢

还有一个值得注意的问题是,对中国地图进行标注时,使用的地点不能包含“省”,“市”等,只能使用“江苏”,“浙江”等地名,不然就是无效的。

最后想放一张自己运行生成的标注地图,无奈第一次标记这边的文章,不会添加图片!!!

可以前去我自己的网站查看:www.wwee.date

 

Pyecharts Geo

转载于:https://my.oschina.net/u/4178696/blog/3083092

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值