1、Pyecharts簡介
Echarts是一個由百度開源的數據可視化工具,憑借着良好的交互性,精巧的圖表設計,得到了眾多開發者的認可。而 Python 是一門富有表達力的語言,很適合用於數據處理。當數據分析遇上數據可視化時,Pyecharts誕生了。
Pyecharts最早只適用於工程領域的可視化開發,但是隨着其對Jupyter notebook、Jupyter lab等交互式開發工具的支持不斷加強,現在也開始被許多數據分析師應用到數據探索中。
1.1、Pyecharts各個版本與Python的對應關系
pyecharts 分為 v0.5.x 和 v1.x 兩個大版本,v0.5.x 和 v1.x 間不兼容,v1.x 是一個全新的版本。
Pyecharts各版本與python的對應關系見下表
版本 | V0.5.x | V1.x.x |
---|---|---|
python 版本選擇 | Python2.7,3.4+ | Python3.6+ |
注 :經Pyecharts開發團隊決定,0.5.x 版本將不再進行維護
1.2、Pyecharts v1系列的新特性
-
全面擁抱 Python3 和 TypeHint
pyecharts v1.0.0 停止對 Python2.7,3.4~3.5 版本的支持和維護,僅支持 Python3.6+。如果還不知道什么是 TypeHint 的同學,勸你盡早入坑,官方入坑指南 typing — Support for type hints。
在編程界,早已流傳着 動態一時爽,重構火葬場 這樣的真知灼見,動態語言類型檢查已經成為了一種趨勢,Javascript 已經有了 Typescript,Python 也在力推 TypeHint,雖然 Python 的 TypeHint 實際上對於程序的運行並沒有任何影響......,但它配合 IDE 和 mypy,或者 pyright 這樣的工具可以在開發階段趁早發現問題。
-
棄用插件機制
pyecharts v1.0.0 廢除原有的插件機制,包括地圖包插件和主題插件,插件的本質是提供 pyecharts 運行所需要的靜態資源文件(基本都是 .js 文件),所以現在開放了兩種模式提供靜態資源文件。
online 模式,使用 pyecharts 官方提供的 assets host,或者部署自己的 remote host。
local 模式,使用自己本地開啟的文件服務提供 assets host(離線模式)。
-
支持 JupyterLab
對 JupyterLab 的支持一直是很多開發者關心的功能,畢竟 JupyterLab 號稱是下一代的 Notebook。pyecharts 1.0.0 開始支持在 JupyterLab 中渲染圖表啦!
#使用JupytrLab需添加如下代碼
from pyecharts.globals import CurrentConfig,NotebookType
CurrentConfig,NOTEBOOK_TYPE=NotebookType.JUPYTER_LAB
#除了以上代碼,還需在渲染之前執行加載JavaScript腳本的代碼,這里以柱狀圖對象bar為例
bar.load_javascript()
#然后再渲染即可
bar.render_notebook()
-
代碼風格重構
所有配置項均 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()
1.0.0 版本寫法,支持鏈式調用
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()
-
支持 selenium/phantomjs 渲染圖片
pyecharts 1.0.0 提供兩種模式渲染圖片,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")
看到新版的種種優勢,小伙伴們是不是躍躍欲試了?接下來我們安裝並通過一系列代碼體驗Pyecharts。
1.2、安裝 Pyecharts
v1系列版本的Pyecharts僅支持python3.6+ ,即如果你的python是3.6+,則默認會下載最新版的pyecharts。
pip install -i https://pypi.douban.com/simple pyecharts -U #使用國內軟件源下載速度會快很多
安裝pyecharts v0.5系列版本:
pip install -i https://pypi.douban.com/simple pyecharts==0.5.11
2、Pyecharts繪圖
繪圖前需要導入相關模塊,根據繪制的圖形不同,導入的模塊會有些許差異
1 from pyecharts import options as opts #引入配置項入口 2 from pyecharts.charts import Bar,Line #導入相關圖形的構造方法
2.1、pyecharts繪圖步驟
pyecharts繪圖大致是按以下五個步驟來的
這里以繪制柱形圖為例
#1、構造柱形圖對象 bar = Bar() #2、添加x軸數據 bar.add_xaxis(xaxis_data=x_data) # 添加y軸數據 bar.add_yaxis( "系列名稱", #設置系列名稱 yaxis_data=y_data, #設置y軸系列數據 ...... #更多參數可以查看官網 ) #3、對系列進行配置 bar.set_series_opts( #主要是對圖元、文字、 ...... #標簽、線型、標記點、標記線 等內容進行配置 ) #4、對全局進行配置 bar.set_global_opts( #可配置內容包括:x、y坐標軸;初始化配置; ...... #工具箱配置;標題;區域縮放;圖例; #提示框等參數配置 ) #5、渲染圖片 bar.render(path) #將圖片渲染為html文件 bar.render_notebook() #直接在jupytr notebook中渲染
基於分類/時間的數據對比,通常需用到比較型圖表。用戶通過圖表輕松識別最大/最小值,查看當前和過去的數據變動情況。
常見場景:哪個地區的收件量最多?今年的收入和去年相比如何?商品的銷量在不同地區、時間維度上的差異……
2.2、 柱狀圖的繪制
當數據量少的時候我們使用柱狀圖就可以了。pyecharts繪制柱狀圖表灰常簡單咯,啥也不說了,上代碼。

1 from example.commons import Faker #調用官方提供的測試數據 2 from pyecharts import options as opts #配置入口模塊 3 from pyecharts.charts import Bar #柱狀圖構造方法 4 5 bar = Bar()#構造bar對象 6 bar.add_xaxis(Faker.choose()) #添加x軸數據 7 bar.add_yaxis("商家A", Faker.values()) #添加一個系列數據,這里是A商家的數據 8 bar.add_yaxis("商家B", Faker.values()) #添加另一個系列數據 9 bar.set_global_opts(title_opts=opts.TitleOpts( 10 title="Bar-基本示例", #設置主標題 11 subtitle="我是副標題" #設置副標題 12 )) 13 bar.render_notebook() #在jupyter notebook中渲染
效果圖如下
2.3、條形圖
當條目較多,如大於12條,移動端上的柱狀圖會顯得擁擠不堪,更適合用條形圖。一般數據條目不超過30條,否則易帶來視覺和記憶負擔。

1 bar = Bar().add_xaxis(Faker.choose()+Faker.choose()+Faker.choose()) #將數據生成三份 2 bar.add_yaxis("", Faker.values()+Faker.values()+Faker.values()) #數據生成三份 3 bar.set_global_opts(title_opts=opts.TitleOpts(title="條形圖")) 4 bar.reversal_axis() #翻轉XY軸,將柱狀圖轉換為條形圖 5 bar.render_notebook()
2.4、折線圖
當數據X軸為連續數值(如時間)且我們比較注重觀察數據變化趨勢時,折線圖是非常好的選擇。
1 import pyecharts.options as opts 2 from pyecharts.charts import Line 3 4 line=Line() 5 line.add_xaxis(["201{}年/{}季度".format(y,z) 6 for y in range(4) 7 for z in range(1,5)]) #設置x軸數據 8 line.add_yaxis( 9 "電視機銷量", 10 [4.80,4.10,6.00,6.50,5.80,5.20,6.80,7.40, 11 6.00,5.60,7.50,7.80,6.30,5.90,8.00,8.40] 12 )#設置y軸數據 13 line.set_global_opts( 14 xaxis_opts=opts.AxisOpts( 15 axislabel_opts=opts.LabelOpts(rotate=-40), 16 ),#設置x軸標簽旋轉角度 17 yaxis_opts=opts.AxisOpts(name="銷量(單位/千台)"),#設置y軸名稱 18 title_opts=opts.TitleOpts(title="折線圖")) #設置圖表標題 19 20 line.render_notebook() #渲染圖表
2.5、南丁格爾-玫瑰圖
當對比差異不是很明顯的數據時,可以使用南丁格爾玫瑰圖,其原理為:扇形的半徑和面積是平方的關系,南丁格爾玫瑰圖會將數值之間的差異放大,適合對比大小相近的數值。它不適合對比差異較大的數值。
此外,因為圓有周期性,玫瑰圖也適於表示周期/時間概念,比如星期、月份。依然建議數據量不超過30條,超出可考慮條形圖。
1 def pie_rosetype(): 2 from pyecharts.charts import Pie 3 c = ( 4 Pie() 5 .add( 6 "", 7 [list(z) for z in zip(["201{}年/{}季度".format(y,z) 8 for y in range(2) 9 for z in range(1,3)], [4.80,4.10,5.80,5.20])], 10 radius=["0%", "75%"], #設置內徑外徑 11 rosetype="radius", #玫瑰圖有兩種類型 12 label_opts=opts.LabelOpts(is_show=True), 13 ) 14 .set_global_opts(title_opts=opts.TitleOpts(title="Pie-玫瑰圖示例")) 15 ) 16 return c 17 pie_rosetype().render_notebook()
2.6、雷達圖
對於一些多維的性能數據,如王者榮耀等游戲中的玩家戰力信息,常用雷達圖表示。指標得分接近圓心,說明處於較差狀態,應分析改進;指標得分接近外邊線,說明處於理想狀態。
1 from pyecharts import options as opts 2 from pyecharts.charts import Page, Radar 3 4 v1 = [[4300, 10000, 28000, 35000, 50000, 19000]] 5 v2 = [[5000, 14000, 28000, 31000, 42000, 21000]] 6 7 def radar_base() -> Radar: 8 c = ( 9 Radar() 10 .add_schema( 11 schema=[ 12 opts.RadarIndicatorItem(name="KDA", max_=6500), 13 opts.RadarIndicatorItem(name="輸出", max_=16000), 14 opts.RadarIndicatorItem(name="經濟", max_=30000), 15 opts.RadarIndicatorItem(name="生存", max_=38000), 16 opts.RadarIndicatorItem(name="推進", max_=52000), 17 opts.RadarIndicatorItem(name="打野", max_=25000), 18 ] 19 ) 20 .add("魯班", v1, #添加系列名稱及數據 21 color="red", #設置邊框線的顏色 22 areastyle_opts = opts.AreaStyleOpts(#設置填充的屬性 23 opacity = 0.5, #透明度 24 color="red" #填充顏色 25 ),) 26 .add("后裔", v2,color="blue", 27 areastyle_opts = opts.AreaStyleOpts( 28 opacity = 0.5,#透明度 29 color="blue" 30 ),) 31 .set_series_opts(label_opts=opts.LabelOpts(is_show=False)) 32 .set_global_opts(title_opts=opts.TitleOpts(title="英雄成長對比")) 33 ) 34 return c 35 radar_base().render_notebook()
2.7、餅圖
部分相較於整體,一個整體被分成幾個部分。這類情況會用到構成型圖表,如五大產品的收件量占比、公司利潤的來源構成等。
對於參與構成研究的數據不超過9個時,可以使用餅圖來繪制,如果超過了建議使用條形圖來展示。
1 def pie_base(): 2 from pyecharts import options as opts 3 from pyecharts.charts import Page, Pie 4 v1=["啤酒","可樂","雪碧","咖啡","奶茶"] 5 v2=[30,19,21,12,18] 6 7 c = ( 8 Pie() 9 .add("", [list(z) for z in zip(v1,v2)]) 10 .set_global_opts(title_opts=opts.TitleOpts(title="銷售收入占比")) 11 .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}%"))#格式化標簽輸出內容 12 ) 13 return c 14 pie_base().render_notebook()
2.8、pyecharts繪制散點圖
通過分布&聯系型圖表能看到數據的分布情況,進而找到某些聯系,如相關性、異常值和數據集群。
常見使用場景:客戶的分布與哪些因素相關、身高與體重的相關性分析等
查看兩個變量的關系使用散點圖,以貸款業務為例,查看年齡與信用的關系
用戶 | 年齡 | 身份特質 | 行為偏好 | 履約能力 | 人脈關系 | 信用歷史 | 信用分 |
---|---|---|---|---|---|---|---|
小明 | 32 | 89 | 90 | 88 | 92 | 95 | 771 |
小花 | 28 | 92 | 80 | 92 | 94 | 87 | 751 |
小麗 | 23 | 86 | 78 | 94 | 78 | 86 | 738 |
小剛 | 24 | 83 | 81 | 83 | 78 | 94 | 726 |
小紅 | 21 | 85 | 87 | 80 | 81 | 85 | 725 |
代碼:
1 def scatter_render(): 2 from pyecharts.charts import Scatter 3 from pyecharts import options as opts 4 from pyecharts.commons.utils import JsCode 5 import pandas as pd 6 df = pd.DataFrame({"年齡":[32,28,23,24,21], 7 "信用分":[771,751,738,726,725], 8 "姓名":['小明','小花','小麗','小剛','小紅']}) 9 df.sort_values("年齡",inplace=True,ascending=True)# 按年齡對數據做升序排序 10 c = ( 11 Scatter() 12 .add_xaxis(df.年齡.values.tolist()) 13 .add_yaxis( 14 "信用分", 15 df[["信用分","姓名"]].values.tolist(),#傳入信用分與姓名組合,方便js回調函數顯示標簽 16 label_opts=opts.LabelOpts( 17 formatter=JsCode( 18 "function(params){return params.value[2];}" #通過定義JavaScript回調函數自定義標簽 19 ) 20 ) 21 ) 22 .set_global_opts( 23 title_opts=opts.TitleOpts(title="Scatter-多維度數據"), 24 xaxis_opts = opts.AxisOpts( 25 type_="value",#x軸數據類型是連續型的 26 min_=20 #x軸范圍最小為20 27 ), 28 yaxis_opts = opts.AxisOpts( 29 min_=700 #y軸范圍最小為700 30 ) 31 ) 32 ) 33 34 return c 35 36 scatter_render().render_notebook()
我們可以看出,信用分與年齡在圖形所顯示范圍內大致是成正比的。
2.9、繪制組合圖
組合圖就是將兩種不同的圖形繪制到同一圖表中,我們以數據分析中常常用到的帕累托圖為例,展示pyecharts如何繪制組合圖。
帕累托法則又稱為二八法則,即百分之八十的問題是百分之二十的原因造成的。
帕累托圖(Pareto chart)又叫排列圖、主次圖,是按照發生頻率大小順序繪制的直方圖,表示有多少結果是由已確認類型或范疇的原因所造成。
帕累托圖在項目管理中主要用來找出產生大多數問題的關鍵原因來解決大多數問題,是將出現的質量問題按照重要程度依次排列的一種圖表,從而可以直觀地得出影響質量問題的主要因素。
主要特點:
1、柱形圖的數據按數值的降序排列,折線圖上的數據有累積百分比數據,並在次坐標軸顯示;
2、折線圖的起點數值為0%,並且位於柱形圖第一個柱子的最左下角;
3、折線圖的第二個點位於柱形圖第一個柱子的最右上角 ;
4、折線圖最后一個點數值為100%,位於整張圖形的最右上角
數據:
問題數量(頻數) | 累計銷量 | 累計百分比 | |
---|---|---|---|
0% | |||
產品價格優勢不突出 | 115 | 115 | 35% |
渠道經理服務不到位 | 99 | 214 | 65% |
營銷活動頻次不夠 | 59 | 273 | 83% |
區域消費市場不景氣 | 33 | 306 | 93% |
其他 | 23 | 329 | 100% |
代碼:
1 def bar_overlap_line(): 2 from pyecharts import options as opts #引入配置項 3 from pyecharts.charts import Bar,Line 4 5 6 x_data1 = ["產品價格優勢不突出","渠道經理服務不到位", 7 "營銷活動頻次不夠","區域消費市場不景氣","其他"] 8 x_data2 = [*range(6)] 9 y_data1 = [115,99,59,33,23] 10 y_data2 = [0,35,65,83,93,100] 11 12 ####################################################################### 13 bar = Bar() 14 #添加x軸數據 15 bar.add_xaxis(xaxis_data=x_data1) 16 bar.set_global_opts(xaxis_opts=opts.AxisOpts(type_="category")) #設置x軸系列 17 bar.add_yaxis( "問題數量(頻數)", #設置y軸系列名稱 18 yaxis_data=y_data1, #設置y軸系列數據 19 category_gap=0, #設置柱的間距 20 color="blue", #設置柱形的填充顏色 21 ) 22 23 bar.extend_axis( 24 xaxis=opts.AxisOpts( #設置x軸的參數 25 is_show=False, 26 position="top", 27 ) 28 ) 29 30 bar.extend_axis( 31 yaxis=opts.AxisOpts( 32 33 axistick_opts=opts.AxisTickOpts( #刻度 34 is_inside=True, 35 ), 36 axislabel_opts=opts.LabelOpts(formatter="{value}%", #格式化刻度輸出 37 position="right") 38 ) 39 ) 40 bar.set_global_opts( 41 xaxis_opts=opts.AxisOpts( #設置x軸的參數 42 is_show=True, #是否顯示坐標軸 43 ), 44 yaxis_opts=opts.AxisOpts( #設置y軸最大取值范圍 45 max_=320, 46 ), 47 title_opts=opts.TitleOpts(title="帕累托圖") 48 ) 49 ########################################################################## 50 line =Line() 51 #添加x軸數據 52 line.add_xaxis(x_data2) 53 #添加y軸數據 54 line.add_yaxis("累計百分比", 55 y_data2, 56 xaxis_index=1, #使用次x坐標軸 57 yaxis_index=1, #使用次y坐標軸 58 label_opts=opts.LabelOpts(is_show=False), 59 is_smooth=True, 60 ) 61 62 bar.overlap(line) #組合柱狀圖與折線圖 63 return bar 64 bar_overlap_line().render_notebook()
以上就是數據分析常用可視化圖表的pyecharts實現方法。