做者 | CDA數據分析師
Echarts是一個由百度開源的數據可視化工具,憑藉着良好的交互性,精巧的圖表設計,獲得了衆多開發者的承認。而 Python 是一門富有表達力的語言,很適合用於數據處理。當數據分析趕上數據可視化時,Pyecharts誕生了。javascript
Pyecharts最先只適用於工程領域的可視化開發,可是隨着其對Jupyter notebook、Jupyter lab等交互式開發工具的支持不斷增強,如今也開始被許多數據分析師應用到數據探索中。html
1.1 Pyecharts各個版本與Python的對應關係java
pyecharts 分爲 v0.5.x 和 v1.x 兩個大版本,v0.5.x 和 v1.x 間不兼容,v1.x 是一個全新的版本。python
Pyecharts各版本與python的對應關係見下表git
注:經Pyecharts開發團隊決定,0.5.x 版本將再也不進行維護github
1.2 Pyecharts v1系列的新特性編程
pyecharts v1.0.0 中止對 Python2.7,3.4~3.5 版本的支持和維護,僅支持 Python3.6+。若是還不知道什麼是 TypeHint 的同窗,勸你儘早入坑,官方入坑指南 typing — Support for type hints。echarts
在編程界,早已流傳着 動態一時爽,重構火葬場 這樣的真知灼見,動態語言類型檢查已經成爲了一種趨勢,Javascript 已經有了 Typescript,Python 也在力推 TypeHint,雖然 Python 的 TypeHint 實際上對於程序的運行並無任何影響......,但它配合 IDE 和 mypy,或者 pyright 這樣的工具能夠在開發階段趁早發現問題。ide
pyecharts v1.0.0 廢除原有的插件機制,包括地圖包插件和主題插件,插件的本質是提供 pyecharts 運行所須要的靜態資源文件(基本都是 .js 文件),因此如今開放了兩種模式提供靜態資源文件。函數
online 模式,使用 pyecharts 官方提供的 assets host,或者部署本身的 remote host。
local 模式,使用本身本地開啓的文件服務提供 assets host(離線模式)。
對 JupyterLab 的支持一直是不少開發者關心的功能,畢竟 JupyterLab 號稱是下一代的 Notebook。pyecharts 1.0.0 開始支持在 JupyterLab 中渲染圖表啦!
from pyecharts.globals import CurrentConfig,NotebookType
CurrentConfig,NOTEBOOK_TYPE=NotebookType.JUPYTER_LAB
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()
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.3 安裝 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
繪圖前須要導入相關模塊,根據繪製的圖形不一樣,導入的模塊會有些許差別
from pyecharts import options as opts #引入配置項入口
from pyecharts.charts import Bar,Line #導入相關圖形的構造方法
2.1 pyecharts繪圖步驟
pyecharts繪圖大體是按如下五個步驟來的
這裏以繪製柱形圖爲例
bar = Bar()
bar.add_xaxis(xaxis_data=x_data)
bar.add_yaxis( "系列名稱", #設置系列名稱
yaxis_data=y_data, #設置y軸系列數據
...... #更多參數能夠查看官網
)
bar.set_series_opts( #主要是對圖元、文字、
...... #標籤、線型、標記點、標記線 等內容進行配置
)
bar.set_global_opts( #可配置內容包括:x、y座標軸;初始化配置;
...... #工具箱配置;標題;區域縮放;圖例;
)
bar.render(path) #將圖片渲染爲html文件
bar.render_notebook() #直接在jupytr notebook中渲染
基於分類/時間的數據對比,一般需用到比較型圖表。用戶經過圖表輕鬆識別最大/最小值,查看當前和過去的數據變更狀況。
常見場景:哪一個地區的收件量最多?今年的收入和去年相好比何?商品的銷量在不一樣地區、時間維度上的差別……
2.2 柱狀圖的繪製
當數據量少的時候咱們使用柱狀圖就能夠了。pyecharts繪製柱狀圖表灰常簡單咯,啥也不說了,上代碼。
from example.commons import Faker #調用官方提供的測試數據
from pyecharts import options as opts #配置入口模塊
from pyecharts.charts import Bar #柱狀圖構造方法
bar = Bar()#構造bar對象
bar.add_xaxis(Faker.choose()) #添加x軸數據
bar.add_yaxis("商家A", Faker.values()) #添加一個系列數據,這裏是A商家的數據
bar.add_yaxis("商家B", Faker.values()) #添加另外一個系列數據
bar.set_global_opts(title_opts=opts.TitleOpts(
title="Bar-基本示例", #設置主標題
subtitle="我是副標題" #設置副標題
))
bar.render_notebook() #在jupyter notebook中渲染
效果圖以下:
2.3 條形圖
當條目較多,如大於12條,移動端上的柱狀圖會顯得擁擠不堪,更適合用條形圖。通常數據條目不超過30條,不然易帶來視覺和記憶負擔。
bar = Bar().add_xaxis(Faker.choose()+Faker.choose()+Faker.choose()) #將數據生成三份
bar.add_yaxis("", Faker.values()+Faker.values()+Faker.values()) #數據生成三份
bar.set_global_opts(title_opts=opts.TitleOpts(title="條形圖"))
bar.reversal_axis() #翻轉XY軸,將柱狀圖轉換爲條形圖
bar.render_notebook()
2.4 折線圖
當數據X軸爲連續數值(如時間)且咱們比較注重觀察數據變化趨勢時,折線圖是很是好的選擇。
import pyecharts.options as opts
from pyecharts.charts import Line
line=Line()
line.add_xaxis(["201{}年/{}季度".format(y,z)
for y in range(4)
for z in range(1,5)]) #設置x軸數據
line.add_yaxis(
"電視機銷量",
[4.80,4.10,6.00,6.50,5.80,5.20,6.80,7.40,
6.00,5.60,7.50,7.80,6.30,5.90,8.00,8.40]
)#設置y軸數據
line.set_global_opts(
xaxis_opts=opts.AxisOpts(
axislabel_opts=opts.LabelOpts(rotate=-40),
),#設置x軸標籤旋轉角度
yaxis_opts=opts.AxisOpts(name="銷量(單位/千臺)"),#設置y軸名稱
title_opts=opts.TitleOpts(title="折線圖")) #設置圖表標題
line.render_notebook() #渲染圖表
2.5 南丁格爾-玫瑰圖
當對比差別不是很明顯的數據時,可使用南丁格爾玫瑰圖,其原理爲:扇形的半徑和麪積是平方的關係,南丁格爾玫瑰圖會將數值之間的差別放大,適合對比大小相近的數值。它不適合對比差別較大的數值。
此外,由於圓有周期性,玫瑰圖也適於表示週期/時間概念,好比星期、月份。依然建議數據量不超過30條,超出可考慮條形圖。
def pie_rosetype():
from pyecharts.charts import Pie
c = (
Pie()
.add(
"",
[list(z) for z in zip(["201{}年/{}季度".format(y,z)
for y in range(2)
for z in range(1,3)], [4.80,4.10,5.80,5.20])],
radius=["0%", "75%"], #設置內徑外徑
rosetype="radius", #玫瑰圖有兩種類型
label_opts=opts.LabelOpts(is_show=True),
)
.set_global_opts(title_opts=opts.TitleOpts(title="Pie-玫瑰圖示例"))
)
return c
pie_rosetype().render_notebook()
2.6 雷達圖
對於一些多維的性能數據,如王者榮耀等遊戲中的玩家戰力信息,經常使用雷達圖表示。指標得分接近圓心,說明處於較差狀態,應分析改進;指標得分接近外邊線,說明處於理想狀態。
from pyecharts import options as opts
from pyecharts.charts import Page, Radar
v1 = [[4300, 10000, 28000, 35000, 50000, 19000]]
v2 = [[5000, 14000, 28000, 31000, 42000, 21000]]
def radar_base() -> Radar:
c = (
Radar()
.add_schema(
schema=[
opts.RadarIndicatorItem(name="KDA", max_=6500),
opts.RadarIndicatorItem(name="輸出", max_=16000),
opts.RadarIndicatorItem(name="經濟", max_=30000),
opts.RadarIndicatorItem(name="生存", max_=38000),
opts.RadarIndicatorItem(name="推動", max_=52000),
opts.RadarIndicatorItem(name="打野", max_=25000),
]
)
.add("魯班", v1, #添加系列名稱及數據
color="red", #設置邊框線的顏色
areastyle_opts = opts.AreaStyleOpts(#設置填充的屬性
opacity = 0.5, #透明度
color="red" #填充顏色
),)
.add("後裔", v2,color="blue",
areastyle_opts = opts.AreaStyleOpts(
opacity = 0.5,#透明度
color="blue"
),)
.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
.set_global_opts(title_opts=opts.TitleOpts(title="英雄成長對比"))
)
return c
radar_base().render_notebook()
2.7 餅圖
部分相較於總體,一個總體被分紅幾個部分。這類狀況會用到構成型圖表,如五大產品的收件量佔比、公司利潤的來源構成等。
對於參與構成研究的數據不超過9個時,可使用餅圖來繪製,若是超過了建議使用條形圖來展現。
def pie_base():
from pyecharts import options as opts
from pyecharts.charts import Page, Pie
v1=["啤酒","可樂","雪碧","咖啡","奶茶"]
v2=[30,19,21,12,18]
c = (
Pie()
.add("", [list(z) for z in zip(v1,v2)])
.set_global_opts(title_opts=opts.TitleOpts(title="銷售收入佔比"))
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}%"))#格式化標籤輸出內容
)
return c
pie_base().render_notebook()
2.8 pyecharts繪製散點圖
經過分佈&聯繫型圖表能看到數據的分佈狀況,進而找到某些聯繫,如相關性、異常值和數據集羣。
常見使用場景:客戶的分佈與哪些因素相關、身高與體重的相關性分析等
查看兩個變量的關係使用散點圖,以貸款業務爲例,查看年齡與信用的關係
代碼:
def scatter_render():
from pyecharts.charts import Scatter
from pyecharts import options as opts
from pyecharts.commons.utils import JsCode
import pandas as pd
df = pd.DataFrame({"年齡":[32,28,23,24,21],
"信用分":[771,751,738,726,725],
"姓名":['小明','小花','小麗','小剛','小紅']})
df.sort_values("年齡",inplace=True,ascending=True)# 按年齡對數據作升序排序
c = (
Scatter()
.add_xaxis(df.年齡.values.tolist())
.add_yaxis(
"信用分",
df[["信用分","姓名"]].values.tolist(),#傳入信用分與姓名組合,方便js回調函數顯示標籤
label_opts=opts.LabelOpts(
formatter=JsCode(
"function(params){return params.value[2];}" #經過定義JavaScript回調函數自定義標籤
)
)
)
.set_global_opts(
title_opts=opts.TitleOpts(title="Scatter-多維度數據"),
xaxis_opts = opts.AxisOpts(
type_="value",#x軸數據類型是連續型的
min_=20 #x軸範圍最小爲20
),
yaxis_opts = opts.AxisOpts(
min_=700 #y軸範圍最小爲700
)
)
)
return c
scatter_render().render_notebook()
咱們能夠看出,信用分與年齡在圖形所顯示範圍內大體是成正比的。
2.9 繪製組合圖
組合圖就是將兩種不一樣的圖形繪製到同一圖表中,咱們以數據分析中經常用到的帕累託圖爲例,展現pyecharts如何繪製組合圖。
帕累托法則又稱爲二八法則,即百分之八十的問題是百分之二十的緣由形成的。
帕累託圖(Pareto chart)又叫排列圖、主次圖,是按照發生頻率大小順序繪製的直方圖,表示有多少結果是由已確認類型或範疇的緣由所形成。
帕累託圖在項目管理中主要用來找出產生大多數問題的關鍵緣由來解決大多數問題,是將出現的質量問題按照重要程度依次排列的一種圖表,從而能夠直觀地得出影響質量問題的主要因素。
主要特色:
一、柱形圖的數據按數值的降序排列,折線圖上的數據有累積百分比數據,並在次座標軸顯示;
二、折線圖的起點數值爲0%,而且位於柱形圖第一個柱子的最左下角;
三、折線圖的第二個點位於柱形圖第一個柱子的最右上角 ;
四、折線圖最後一個點數值爲100%,位於整張圖形的最右上角
數據:
代碼:
def bar_overlap_line():
from pyecharts import options as opts #引入配置項
from pyecharts.charts import Bar,Line
x_data1 = ["產品價格優點不突出","渠道經理服務不到位",
"營銷活動頻次不夠","區域消費市場不景氣","其餘"]
x_data2 = [*range(6)]
y_data1 = [115,99,59,33,23]
y_data2 = [0,35,65,83,93,100]
bar = Bar()
bar.add_xaxis(xaxis_data=x_data1)
bar.set_global_opts(xaxis_opts=opts.AxisOpts(type_="category")) #設置x軸系列
bar.add_yaxis( "問題數量(頻數)", #設置y軸系列名稱
yaxis_data=y_data1, #設置y軸系列數據
category_gap=0, #設置柱的間距
color="blue", #設置柱形的填充顏色
)
bar.extend_axis(
xaxis=opts.AxisOpts( #設置x軸的參數
is_show=False,
position="top",
)
)
bar.extend_axis(
yaxis=opts.AxisOpts(
axistick_opts=opts.AxisTickOpts( #刻度
is_inside=True,
),
axislabel_opts=opts.LabelOpts(formatter="{value}%", #格式化刻度輸出
position="right")
)
)
bar.set_global_opts(
xaxis_opts=opts.AxisOpts( #設置x軸的參數
is_show=True, #是否顯示座標軸
),
yaxis_opts=opts.AxisOpts( #設置y軸最大取值範圍
max_=320,
),
title_opts=opts.TitleOpts(title="帕累託圖")
)
line =Line()
line.add_xaxis(x_data2)
line.add_yaxis("累計百分比",
y_data2,
xaxis_index=1, #使用次x座標軸
yaxis_index=1, #使用次y座標軸
label_opts=opts.LabelOpts(is_show=False),
is_smooth=True,
)
bar.overlap(line) #組合柱狀圖與折線圖
return bar
bar_overlap_line().render_notebook()
最終效果圖以下所示:
以上就是數據分析經常使用可視化圖表的pyecharts實現方法。