1嫁审、Pyecharts簡(jiǎn)介
Echarts是一個(gè)由百度開源的數(shù)據(jù)可視化工具特笋,憑借著良好的交互性则剃,精巧的圖表設(shè)計(jì)粗悯,得到了眾多開發(fā)者的認(rèn)可虚循。而 Python 是一門富有表達(dá)力的語言,很適合用于數(shù)據(jù)處理样傍。當(dāng)數(shù)據(jù)分析遇上數(shù)據(jù)可視化時(shí)横缔,Pyecharts誕生了。
Pyecharts最早只適用于工程領(lǐng)域的可視化開發(fā)铭乾,但是隨著其對(duì)Jupyter notebook剪廉、Jupyter lab等交互式開發(fā)工具的支持不斷加強(qiáng),現(xiàn)在也開始被許多數(shù)據(jù)分析師應(yīng)用到數(shù)據(jù)探索中炕檩。
1.1斗蒋、Pyecharts各個(gè)版本與Python的對(duì)應(yīng)關(guān)系
pyecharts 分為 v0.5.x 和 v1.x 兩個(gè)大版本捌斧,v0.5.x 和 v1.x 間不兼容,v1.x 是一個(gè)全新的版本泉沾。
Pyecharts各版本與python的對(duì)應(yīng)關(guān)系見下表
版本 | V0.5.x | V1.x.x |
---|---|---|
python 版本選擇 | Python2.7捞蚂,3.4+ | Python3.6+ |
注 :經(jīng)Pyecharts開發(fā)團(tuán)隊(duì)決定,0.5.x 版本將不再進(jìn)行維護(hù)
1.2跷究、Pyecharts v1系列的新特性
- 全面擁抱 Python3 和 TypeHint
pyecharts v1.0.0 停止對(duì) Python2.7姓迅,3.4~3.5 版本的支持和維護(hù),僅支持 Python3.6+俊马。如果還不知道什么是 TypeHint 的同學(xué)丁存,勸你盡早入坑,官方入坑指南 typing — Support for type hints柴我。
在編程界解寝,早已流傳著 動(dòng)態(tài)一時(shí)爽,重構(gòu)火葬場(chǎng) 這樣的真知灼見艘儒,動(dòng)態(tài)語言類型檢查已經(jīng)成為了一種趨勢(shì)聋伦,Javascript 已經(jīng)有了 Typescript,Python 也在力推 TypeHint界睁,雖然 Python 的 TypeHint 實(shí)際上對(duì)于程序的運(yùn)行并沒有任何影響......觉增,但它配合 IDE 和 mypy,或者 pyright 這樣的工具可以在開發(fā)階段趁早發(fā)現(xiàn)問題翻斟。
- 棄用插件機(jī)制
pyecharts v1.x.x 廢除原有的插件機(jī)制逾礁,包括地圖包插件和主題插件,插件的本質(zhì)是提供 pyecharts 運(yùn)行所需要的靜態(tài)資源文件(基本都是 .js 文件)杨赤,所以現(xiàn)在開放了兩種模式提供靜態(tài)資源文件敞斋。
online 模式,使用 pyecharts 官方提供的 assets host疾牲,或者部署自己的 remote host。
local 模式衙解,使用自己本地開啟的文件服務(wù)提供 assets host(離線模式)阳柔。
- 支持 JupyterLab
對(duì) JupyterLab 的支持一直是很多開發(fā)者關(guān)心的功能,畢竟 JupyterLab 號(hào)稱是下一代的 Notebook蚓峦。pyecharts 1.0.0 開始支持在 JupyterLab 中渲染圖表啦舌剂!
#使用JupytrLab需添加如下代碼
from pyecharts.globals import CurrentConfig,NotebookType
CurrentConfig,NOTEBOOK_TYPE=NotebookType.JUPYTER_LAB
#除了以上代碼,還需在渲染之前執(zhí)行加載JavaScript腳本的代碼暑椰,這里以柱狀圖對(duì)象bar為例
bar.load_javascript()
#然后再渲染即可
bar.render_notebook()
- 代碼風(fēng)格重構(gòu)
所有配置項(xiàng)均 OOP霍转,在新版本的 pyecharts 中,一切皆 Options一汽。配置項(xiàng)種類更多避消,可操作性更強(qiáng)低滩,可以畫出更豐富的圖表,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("柱狀圖數(shù)據(jù)堆疊示例")
bar.add("商家A", attr, v1, is_stack=True)
bar.add("商家B", attr, v2, is_stack=True)
bar.render()
1.x.x 版本寫法恕沫,支持鏈?zhǔn)秸{(diào)用
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="柱狀圖數(shù)據(jù)堆疊示例"))
)
bar.render()
- 支持 selenium/phantomjs 渲染圖片
pyecharts 1.x.x 提供兩種模式渲染圖片,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(["襯衫", "毛衣", "領(lǐng)帶", "褲子", "風(fēng)衣", "高跟鞋", "襪子"])
.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-測(cè)試渲染圖片"))
)
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")
看到新版的種種優(yōu)勢(shì),小伙伴們是不是躍躍欲試了偷霉?接下來我們安裝并通過一系列代碼體驗(yàn)Pyecharts迄委。
1.2、安裝 Pyecharts
v1系列版本的Pyecharts僅支持python3.6+ 类少,即如果你的python是3.6+叙身,則默認(rèn)會(huì)下載最新版的pyecharts。
pip install -i https://pypi.douban.com/simple pyecharts -U #使用國(guó)內(nèi)軟件源下載速度會(huì)快很多
安裝pyecharts v0.5系列版本:
pip install -i https://pypi.douban.com/simple pyecharts==0.5.11
2瞒滴、Pyecharts繪圖
繪圖前需要導(dǎo)入相關(guān)模塊曲梗,根據(jù)繪制的圖形不同,導(dǎo)入的模塊會(huì)有些許差異
from pyecharts import options as opts #引入配置項(xiàng)入口
from pyecharts.charts import Bar,Line #導(dǎo)入相關(guān)圖形的構(gòu)造方法
2.1妓忍、pyecharts繪圖步驟
pyecharts繪圖大致是按以下五個(gè)步驟來的
這里以繪制柱形圖為例
#1虏两、構(gòu)造柱形圖對(duì)象
bar = Bar()
#2、添加x軸數(shù)據(jù)
bar.add_xaxis(xaxis_data=x_data)
# 添加y軸數(shù)據(jù)
bar.add_yaxis( "系列名稱", #設(shè)置系列名稱
yaxis_data=y_data, #設(shè)置y軸系列數(shù)據(jù)
...... #更多參數(shù)可以查看官網(wǎng)
)
#3世剖、對(duì)系列進(jìn)行配置
bar.set_series_opts( #主要是對(duì)圖元定罢、文字、
...... #標(biāo)簽旁瘫、線型祖凫、標(biāo)記點(diǎn)、標(biāo)記線 等內(nèi)容進(jìn)行配置
)
#4酬凳、對(duì)全局進(jìn)行配置
bar.set_global_opts( #可配置內(nèi)容包括:x惠况、y坐標(biāo)軸;初始化配置宁仔;
...... #工具箱配置稠屠;標(biāo)題;區(qū)域縮放翎苫;圖例权埠;
#提示框等參數(shù)配置
)
#5、渲染圖片
bar.render(path) #將圖片渲染為html文件
bar.render_notebook() #直接在jupytr notebook中渲染
基于分類/時(shí)間的數(shù)據(jù)對(duì)比煎谍,通常需用到比較型圖表攘蔽。用戶通過圖表輕松識(shí)別最大/最小值,查看當(dāng)前和過去的數(shù)據(jù)變動(dòng)情況呐粘。
常見場(chǎng)景:哪個(gè)地區(qū)的收件量最多满俗?今年的收入和去年相比如何转捕?商品的銷量在不同地區(qū)、時(shí)間維度上的差異……
2.2漫雷、 柱狀圖的繪制
當(dāng)數(shù)據(jù)量少的時(shí)候我們使用柱狀圖就可以了瓜富。pyecharts繪制柱狀圖表灰常簡(jiǎn)單咯,啥也不說了降盹,上代碼与柑。
from example.commons import Faker #調(diào)用官方提供的測(cè)試數(shù)據(jù)
from pyecharts import options as opts #配置入口模塊
from pyecharts.charts import Bar #柱狀圖構(gòu)造方法
bar = Bar()#構(gòu)造bar對(duì)象
bar.add_xaxis(Faker.choose()) #添加x軸數(shù)據(jù)
bar.add_yaxis("商家A", Faker.values()) #添加一個(gè)系列數(shù)據(jù),這里是A商家的數(shù)據(jù)
bar.add_yaxis("商家B", Faker.values()) #添加另一個(gè)系列數(shù)據(jù)
bar.set_global_opts(title_opts=opts.TitleOpts(
title="Bar-基本示例", #設(shè)置主標(biāo)題
subtitle="我是副標(biāo)題" #設(shè)置副標(biāo)題
))
bar.render_notebook() #在jupyter notebook中渲染
效果圖如下
2.3蓄坏、條形圖
當(dāng)條目較多价捧,如大于12條,移動(dòng)端上的柱狀圖會(huì)顯得擁擠不堪涡戳,更適合用條形圖结蟋。一般數(shù)據(jù)條目不超過30條,否則易帶來視覺和記憶負(fù)擔(dān)渔彰。
bar = Bar().add_xaxis(Faker.choose()+Faker.choose()+Faker.choose()) #將數(shù)據(jù)生成三份
bar.add_yaxis("", Faker.values()+Faker.values()+Faker.values()) #數(shù)據(jù)生成三份
bar.set_global_opts(title_opts=opts.TitleOpts(title="條形圖"))
bar.reversal_axis() #翻轉(zhuǎn)XY軸嵌屎,將柱狀圖轉(zhuǎn)換為條形圖
bar.render_notebook()
2.4、折線圖
當(dāng)數(shù)據(jù)X軸為連續(xù)數(shù)值(如時(shí)間)且我們比較注重觀察數(shù)據(jù)變化趨勢(shì)時(shí)恍涂,折線圖是非常好的選擇宝惰。
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)]) #設(shè)置x軸數(shù)據(jù)
line.add_yaxis(
"電視機(jī)銷量",
[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]
)#設(shè)置y軸數(shù)據(jù)
line.set_global_opts(
xaxis_opts=opts.AxisOpts(
axislabel_opts=opts.LabelOpts(rotate=-40),
),#設(shè)置x軸標(biāo)簽旋轉(zhuǎn)角度
yaxis_opts=opts.AxisOpts(name="銷量(單位/千臺(tái))"),#設(shè)置y軸名稱
title_opts=opts.TitleOpts(title="折線圖")) #設(shè)置圖表標(biāo)題
line.render_notebook() #渲染圖表
2.5、南丁格爾-玫瑰圖
當(dāng)對(duì)比差異不是很明顯的數(shù)據(jù)時(shí)再沧,可以使用南丁格爾玫瑰圖尼夺,其原理為:扇形的半徑和面積是平方的關(guān)系,南丁格爾玫瑰圖會(huì)將數(shù)值之間的差異放大炒瘸,適合對(duì)比大小相近的數(shù)值淤堵。它不適合對(duì)比差異較大的數(shù)值。
此外顷扩,因?yàn)閳A有周期性拐邪,玫瑰圖也適于表示周期/時(shí)間概念,比如星期隘截、月份庙睡。依然建議數(shù)據(jù)量不超過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%"], #設(shè)置內(nèi)徑外徑
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、雷達(dá)圖
對(duì)于一些多維的性能數(shù)據(jù)统台,如王者榮耀等游戲中的玩家戰(zhàn)力信息雕擂,常用雷達(dá)圖表示。指標(biāo)得分接近圓心贱勃,說明處于較差狀態(tài)井赌,應(yīng)分析改進(jìn)谤逼;指標(biāo)得分接近外邊線,說明處于理想狀態(tài)仇穗。
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="經(jīng)濟(jì)", max_=30000),
opts.RadarIndicatorItem(name="生存", max_=38000),
opts.RadarIndicatorItem(name="推進(jìn)", max_=52000),
opts.RadarIndicatorItem(name="打野", max_=25000),
]
)
.add("魯班", v1, #添加系列名稱及數(shù)據(jù)
color="red", #設(shè)置邊框線的顏色
areastyle_opts = opts.AreaStyleOpts(#設(shè)置填充的屬性
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="英雄成長(zhǎng)對(duì)比"))
)
return c
radar_base().render_notebook()
2.7流部、餅圖
部分相較于整體,一個(gè)整體被分成幾個(gè)部分纹坐。這類情況會(huì)用到構(gòu)成型圖表枝冀,如五大產(chǎn)品的收件量占比、公司利潤(rùn)的來源構(gòu)成等耘子。
對(duì)于參與構(gòu)成研究的數(shù)據(jù)不超過9個(gè)時(shí)果漾,可以使用餅圖來繪制,如果超過了建議使用條形圖來展示谷誓。
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="绒障: {c}%"))#格式化標(biāo)簽輸出內(nèi)容
)
return c
pie_base().render_notebook()
2.8、pyecharts繪制散點(diǎn)圖
通過分布&聯(lián)系型圖表能看到數(shù)據(jù)的分布情況捍歪,進(jìn)而找到某些聯(lián)系户辱,如相關(guān)性、異常值和數(shù)據(jù)集群糙臼。
常見使用場(chǎng)景:客戶的分布與哪些因素相關(guān)庐镐、身高與體重的相關(guān)性分析等
查看兩個(gè)變量的關(guān)系使用散點(diǎn)圖,以貸款業(yè)務(wù)為例弓摘,查看年齡與信用的關(guān)系
用戶 | 年齡 | 身份特質(zhì) | 行為偏好 | 履約能力 | 人脈關(guān)系 | 信用歷史 | 信用分 |
---|---|---|---|---|---|---|---|
小明 | 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 |
代碼:
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)# 按年齡對(duì)數(shù)據(jù)做升序排序
c = (
Scatter()
.add_xaxis(df.年齡.values.tolist())
.add_yaxis(
"信用分",
df[["信用分","姓名"]].values.tolist(),#傳入信用分與姓名組合焚鹊,方便js回調(diào)函數(shù)顯示標(biāo)簽
label_opts=opts.LabelOpts(
formatter=JsCode(
"function(params){return params.value[2];}" #通過定義JavaScript回調(diào)函數(shù)自定義標(biāo)簽
)
)
)
.set_global_opts(
title_opts=opts.TitleOpts(title="Scatter-多維度數(shù)據(jù)"),
xaxis_opts = opts.AxisOpts(
type_="value",#x軸數(shù)據(jù)類型是連續(xù)型的
min_=20 #x軸范圍最小為20
),
yaxis_opts = opts.AxisOpts(
min_=700 #y軸范圍最小為700
)
)
)
return c
scatter_render().render_notebook()
我們可以看出,信用分與年齡在圖形所顯示范圍內(nèi)大致是成正比的韧献。
2.9末患、繪制組合圖
組合圖就是將兩種不同的圖形繪制到同一圖表中,我們以數(shù)據(jù)分析中常常用到的帕累托圖為例锤窑,展示pyecharts如何繪制組合圖璧针。
帕累托法則又稱為二八法則,即百分之八十的問題是百分之二十的原因造成的渊啰。
帕累托圖(Pareto chart)又叫排列圖探橱、主次圖,是按照發(fā)生頻率大小順序繪制的直方圖绘证,表示有多少結(jié)果是由已確認(rèn)類型或范疇的原因所造成隧膏。
帕累托圖在項(xiàng)目管理中主要用來找出產(chǎn)生大多數(shù)問題的關(guān)鍵原因來解決大多數(shù)問題,是將出現(xiàn)的質(zhì)量問題按照重要程度依次排列的一種圖表嚷那,從而可以直觀地得出影響質(zhì)量問題的主要因素胞枕。
主要特點(diǎn):
1、柱形圖的數(shù)據(jù)按數(shù)值的降序排列魏宽,折線圖上的數(shù)據(jù)有累積百分比數(shù)據(jù)腐泻,并在次坐標(biāo)軸顯示决乎;
2、折線圖的起點(diǎn)數(shù)值為0%派桩,并且位于柱形圖第一個(gè)柱子的最左下角构诚;
3、折線圖的第二個(gè)點(diǎn)位于柱形圖第一個(gè)柱子的最右上角 铆惑;
4范嘱、折線圖最后一個(gè)點(diǎn)數(shù)值為100%,位于整張圖形的最右上角
數(shù)據(jù):
問題數(shù)量(頻數(shù)) | 累計(jì)銷量 | 累計(jì)百分比 | |
---|---|---|---|
0% | |||
產(chǎn)品價(jià)格優(yōu)勢(shì)不突出 | 115 | 115 | 35% |
渠道經(jīng)理服務(wù)不到位 | 99 | 214 | 65% |
營(yíng)銷活動(dòng)頻次不夠 | 59 | 273 | 83% |
區(qū)域消費(fèi)市場(chǎng)不景氣 | 33 | 306 | 93% |
其他 | 23 | 329 | 100% |
代碼:
def bar_overlap_line():
from pyecharts import options as opts #引入配置項(xiàng)
from pyecharts.charts import Bar,Line
?
x_data1 = ["產(chǎn)品價(jià)格優(yōu)勢(shì)不突出","渠道經(jīng)理服務(wù)不到位",
"營(yíng)銷活動(dòng)頻次不夠","區(qū)域消費(fèi)市場(chǎng)不景氣","其他"]
x_data2 = [*range(6)]
y_data1 = [115,99,59,33,23]
y_data2 = [0,35,65,83,93,100]
?
#######################################################################
bar = Bar()
#添加x軸數(shù)據(jù)
bar.add_xaxis(xaxis_data=x_data1)
bar.set_global_opts(xaxis_opts=opts.AxisOpts(type_="category")) #設(shè)置x軸系列
bar.add_yaxis( "問題數(shù)量(頻數(shù))", #設(shè)置y軸系列名稱
yaxis_data=y_data1, #設(shè)置y軸系列數(shù)據(jù)
category_gap=0, #設(shè)置柱的間距
color="blue", #設(shè)置柱形的填充顏色
)
?
bar.extend_axis(
xaxis=opts.AxisOpts( #設(shè)置x軸的參數(shù)
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( #設(shè)置x軸的參數(shù)
is_show=True, #是否顯示坐標(biāo)軸
),
yaxis_opts=opts.AxisOpts( #設(shè)置y軸最大取值范圍
max_=320,
),
title_opts=opts.TitleOpts(title="帕累托圖")
)
##########################################################################
line =Line()
#添加x軸數(shù)據(jù)
line.add_xaxis(x_data2)
#添加y軸數(shù)據(jù)
line.add_yaxis("累計(jì)百分比",
y_data2,
xaxis_index=1, #使用次x坐標(biāo)軸
yaxis_index=1, #使用次y坐標(biāo)軸
label_opts=opts.LabelOpts(is_show=False),
is_smooth=True,
)
bar.overlap(line) #組合柱狀圖與折線圖
return bar
bar_overlap_line().render_notebook()
最終效果圖如下所示:
以上就是數(shù)據(jù)分析常用可視化圖表的pyecharts實(shí)現(xiàn)方法鸭津。