新版pyecharts,Python可视化so easy and powerful !

pyecharts 通过了半年的沉寂后,终于发布了新版本啦!新版本号将从 v1.0.0 开始,这是一个全新的,向下不兼容的 pyecharts 版本。不过若是开发者之前接触过 pyecharts 的话,新版本对于大家来讲也是会很容易上手的。新版本修复 N 个 0.5.x 版本留下来的 bug。html

1. 全面拥抱 Python3 和 TypeHint

pyecharts v1 中止对 Python2.7,3.4~3.5 版本的支持和维护,仅支持 Python3.6+。若是还不知道什么是 TypeHint 的同窗,劝你尽早入坑,官方入坑指南 typing — Support for type hintspython

在编程界,早已流传着 动态一时爽,重构火葬场 这样的真知灼见,动态语言类型检查已经成为了一种趋势,Javascript 已经有了 Typescript,Python 也在力推 TypeHint,虽然 Python 的 TypeHint 实际上对于程序的运行并无任何影响......,但它配合 IDE 和 mypy,或者 pyright 这样的工具能够在开发阶段趁早发现问题。git

2. 弃用插件机制

pyecharts v1 废除原有的插件机制,包括 地图包插件主题插件,插件的本质是提供 pyecharts 运行所须要的静态资源文件(基本都是 .js 文件),因此如今开放了两种模式提供静态资源文件。github

  1. online 模式,使用 pyecharts 官方提供的 assets host,或者部署本身的 remote host。
  2. local 模式,使用本身本地开启的文件服务提供 assets host(离线模式)。

弃用插件的理由web

  1. 原先的 pyecharts 插件机制分散,管理/升级并无想象中的方便,并且分开为 jupyter/local render 两种状况,这就致使了两个要分开管理,虽然咱们的 pip 包能够同时 update 这两种状况引用的 assets,可是因为存在缓存等因素,并不能保证每次都到正确的更新。
  2. pyecharts 不用再依赖这些包,依赖包和 pyecharts 包版本的管理也是一个容易出问题的地方。
  3. 减小维护工做,线上热更新。

3. 更加轻量级

新本的 pyecharts 只依赖了两个第三库,jinja2 和 prettytable。这意味着 pyecharts 整体的体积将变小,安装更加轻松,也能够很方便的进行离线安装,配合上面讲的 local 模式。编程

4. 支持原生 JavaScript

0.5.X 的版本,对原生 JavaScript 的支持还很局限,v1 版本完全打通了任督二脉,支持传入任意的 JavaScript 的代码,任意的配置项回调函数。缓存

5. 支持 JupyterLab

对 JupyterLab 的支持一直是不少开发者关心的功能,毕竟 JupyterLab 号称是下一代的 Notebook。pyecharts v1 开始支持在 JupyterLab 中渲染图表啦!echarts

Jupyter Notebook 函数

Jupyter Lab 工具

6. 代码风格重构

全部配置项均 OOP,在新版本的 pyecharts 中,一切皆 Options。配置项种类更多,可操做性更强,能够画出更丰富的图表,pyecharts 官方画廊 pyecharts/pyecharts-gallery

0.5.X 版本写法

from pyecharts import Bar

attr = ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"]
v1 = [5, 20, 36, 10, 75, 90]
v2 = [10, 25, 8, 60, 20, 80]
bar = Bar("柱状图数据堆叠示例")
bar.add("商家A", attr, v1, is_stack=True)
bar.add("商家B", attr, v2, is_stack=True)
bar.render()
复制代码

v1 版本写法,支持链式调用,导包方式也发生了变化,因此不要再问为何旧版的代码运行不了啦!由于两个版本根本就彻底不兼容,当成一个新库来学的话会好不少。

import pyecharts.options as opts
from pyecharts.charts import Bar

attr = ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"]
v1 = [5, 20, 36, 10, 75, 90]
v2 = [10, 25, 8, 60, 20, 80]


bar = (
    Bar()
    .add_xaxis(attr)
    .add_yaxis("商家A", v1, stack="stack1")
    .add_yaxis("商家B", v2, stack="stack1")
    .set_series_opts(label_opts=opts.LabelOpts(is_show=False))
    .set_global_opts(title_opts=opts.TitleOpts(title="柱状图数据堆叠示例"))
)

bar.render("bar_stack.html")

# 固然不习惯链式写法的开发者仍旧可使用
bar.add_xaxis(attr)
bar.add_yaxis("商家A", v1, stack="stack1")
bar.add_yaxis("商家B", v2, stack="stack1")
bar.render()
复制代码

v1 版本不只支持 Opts 配置项做为参数传入,同时也支持原生 dict 类型,也就意味着本身能够随意扩展 pyecharts(若是你对 Echarts 有必定了解的话),而不用修改 pyecharts 源码。

bar.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
# 等价于
bar.set_series_opts(label_opts={"show": False})
复制代码

具体参考 pyecharts/options 包。

7. 支持 selenium/phantomjs 渲染图片

非必须,若是无此需求的开发者可忽略,并不会影响正常的使用。

pyecharts v1 提供两种模式渲染图片,selenium 和 phantomjs,分别须要安装 snapshot-seleniumsnapshot-phantomjs

from pyecharts import options as opts
from pyecharts.charts import Bar
from pyecharts.render import make_snapshot


def bar_chart() -> Bar:
    c = (
        Bar()
        .add_xaxis(["衬衫", "毛衣", "领带", "裤子", "风衣", "高跟鞋", "袜子"])
        .add_yaxis("商家A", [114, 55, 27, 101, 125, 27, 105])
        .add_yaxis("商家B", [57, 134, 137, 129, 145, 60, 49])
        .set_global_opts(title_opts=opts.TitleOpts(title="Bar-测试渲染图片"))
    )
    return c


def render_chart_by_selenium():
    from snapshot_selenium import snapshot

    make_snapshot(snapshot, bar_chart().render(), "bar0.png")


def render_chart_by_phantomjs():
    from snapshot_phantomjs import snapshot

    make_snapshot(snapshot, bar_chart().render(), "bar1.png")
复制代码

8. 新增更多的图表类型

新增了图表类型和组件类型

旭日图

百度地图

很酷吧,你能够在 Notebook 环境中使用百度地图,指哪打哪,妈妈不再用担忧我地图不够用啦。

组件类型

9. 更加完善的文档和示例

经开发团队决定,0.5.x 版本将再也不进行维护,问题依旧能够提,但基本不会解决。0.5.x 版本代码位于 05x 分支,文档位于 05x-docs.pyecharts.org。v1 版本文档位于 pyecharts.org。新版文档中提供了更加丰富的示例,帮助开发者更容易入手 pyecharts。

总结

这次的重构主要缘由是我发现 pyecharts 之前的设计实在是太糟糕了,致使后来版本的更新一直都是在为这糟糕设计打补丁。在某一个夜深人静的夜晚,我下定了决心,他妈的,看不下去了,老子要重构,不要拦着我。在重构以前,正好那段时间在写 Golang,因此就写了一个 go-echarts,对 Golang 开发感兴趣的开发者也能够关注一下。后来以为 go-echarts 的接口设计还不错,因此就搬到新版的 pyecharts 中来。新接口更加清晰,语义化。

在重构的过程当中也产生了不少的思考,如何把接口设计得简单易用又有可扩展性,这个实际上是有矛盾的地方在的,简单易用意味着要尽可能封装实现细节,而可扩展性可定制性又意味着要尽可能暴露底层接口,参数要灵活,但也不能直接就 *args, **kwargs,真心以为,Python 这个传参方式被过分使用了,不少库为了追求方便,形参都是直接写的 foo(*args, **kwargs),不仔细去阅读具体实现逻辑你根本不知道它须要传什么,而后传的值是什么类型.... 我我的的观点是,Keyword only+TypeHint 是最好的实践,别懒,多写几行代码,否则之后看起来连本身都懵。

开发和维护 pyecharts 花费了我巨大的心力,若是你以为项目帮助到您,请认真考虑请做者喝一杯咖啡 😄

敲黑板

参与贡献

期待能有更多的开发者参与到 pyecharts 的开发中来,咱们会保证尽快 Reivew PR 而且及时回复。但提交 PR 请确保

  1. 经过全部单元测试,如如果新功能,请为其新增单元测试
  2. 遵照开发规范,使用 black 以及 isort 格式化代码($ pip install -r requirements-dev.txt)
  3. 如若须要,请更新相对应的文档

咱们也很是欢迎开发者能为 pyecharts 提供更多的示例,共同来完善文档,文档项目位于 pyecharts/website

感谢陪伴 pyecharts 一路走来的每一个人,我相信 pyecharts 为不少的 python 开发者提供了方便的绘图方式,我但愿有提出问题的人,更但愿有更多可以一块儿解决问题的人,若是您真心想参与到开发中来,请及时联系我,邮箱 chenjiandongx@qq.com。

相关文章
相关标签/搜索