新版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。

相關文章
相關標籤/搜索