pyecharts 通過了半年的沉寂後,終於發佈了新版本啦!新版本號將從 v1.0.0 開始,這是一個全新的,向下不兼容的 pyecharts 版本。不過若是開發者之前接觸過 pyecharts 的話,新版本對於大家來講也是會很容易上手的。新版本修復 N 個 0.5.x 版本留下來的 bug。html
pyecharts v1 中止對 Python2.7,3.4~3.5 版本的支持和維護,僅支持 Python3.6+。若是還不知道什麼是 TypeHint 的同窗,勸你儘早入坑,官方入坑指南 typing — Support for type hints。python
在編程界,早已流傳着 動態一時爽,重構火葬場 這樣的真知灼見,動態語言類型檢查已經成爲了一種趨勢,Javascript 已經有了 Typescript,Python 也在力推 TypeHint,雖然 Python 的 TypeHint 實際上對於程序的運行並無任何影響......,但它配合 IDE 和 mypy,或者 pyright 這樣的工具能夠在開發階段趁早發現問題。git
pyecharts v1 廢除原有的插件機制,包括 地圖包插件 和 主題插件,插件的本質是提供 pyecharts 運行所須要的靜態資源文件(基本都是 .js 文件),因此如今開放了兩種模式提供靜態資源文件。github
棄用插件的理由web
新本的 pyecharts 只依賴了兩個第三庫,jinja2 和 prettytable。這意味着 pyecharts 整體的體積將變小,安裝更加輕鬆,也能夠很方便的進行離線安裝,配合上面講的 local 模式。編程
0.5.X 的版本,對原生 JavaScript 的支持還很侷限,v1 版本完全打通了任督二脈,支持傳入任意的 JavaScript 的代碼,任意的配置項回調函數。緩存
對 JupyterLab 的支持一直是不少開發者關心的功能,畢竟 JupyterLab 號稱是下一代的 Notebook。pyecharts v1 開始支持在 JupyterLab 中渲染圖表啦!echarts
Jupyter Notebook 函數
Jupyter Lab 工具
全部配置項均 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 包。
非必須,若是無此需求的開發者可忽略,並不會影響正常的使用。
pyecharts v1 提供兩種模式渲染圖片,selenium 和 phantomjs,分別須要安裝 snapshot-selenium 和 snapshot-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")
複製代碼
新增了圖表類型和組件類型
旭日圖
百度地圖
很酷吧,你能夠在 Notebook 環境中使用百度地圖,指哪打哪,媽媽不再用擔憂我地圖不夠用啦。
組件類型
經開發團隊決定,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 請確保
咱們也很是歡迎開發者能爲 pyecharts 提供更多的示例,共同來完善文檔,文檔項目位於 pyecharts/website
感謝陪伴 pyecharts 一路走來的每一個人,我相信 pyecharts 爲不少的 python 開發者提供了方便的繪圖方式,我但願有提出問題的人,更但願有更多可以一塊兒解決問題的人,若是您真心想參與到開發中來,請及時聯繫我,郵箱 chenjiandongx@qq.com。