【Python基礎】驚嘆,Pyecharts繪制餅圖原來可以如此漂亮!
?來源:Python數(shù)據(jù)之道
作者:Peter
整理:Lemon
利用Pyecharts玩轉(zhuǎn)餅圖
餅圖在實際的可視化要求中是非常常見的,它能夠很好顯示個體的占比或者數(shù)據(jù)情況。本文中講解的是如何利用 pyecharts 來繪制各種滿足不同需求的餅圖,包含:
基礎餅圖+改變餅圖位置顏色 環(huán)狀餅圖 內(nèi)嵌餅圖 多餅圖 玫瑰圖

開始之前,先來看看部分效果:
注:文末提供本文的源碼獲取方式,供大家練習
導入庫
本文中使用的還是 pandas+pyecharts 組合,在jupyter notebook 中進行繪圖。首先導入所需要的各種庫:

基礎餅圖
模擬數(shù)據(jù)
我們自行模擬了一份消費數(shù)據(jù),包含5個消費項目:住宿+餐飲+交通+服裝+紅包,具體數(shù)據(jù)如下:
#?生成數(shù)據(jù)
df?=?pd.DataFrame({"消費":["住宿","餐飲","交通","服裝","紅包"],
???????????????????"數(shù)據(jù)":[2580,1300,500,900,1300]
??????????????????})
df

將消費和數(shù)據(jù)中的具體數(shù)據(jù)轉(zhuǎn)成列表形式:

繪圖
代碼的具體解釋見注釋:
c?=?(
????Pie()
????.add("",?[list(z)?for?z?in?zip(x_data,?y_data)])???#?zip函數(shù)兩個部分組合在一起list(zip(x,y))----->?[(x,y)]
????.set_global_opts(title_opts=opts.TitleOpts(title="Pie-月度開支"))??#?標題
????.set_series_opts(label_opts=opts.LabelOpts(formatter=":?{c}"))??#?數(shù)據(jù)標簽設置
)
c.render_notebook()??

改變位置和顏色
上面生成的餅圖是使用 pyecharts 自帶的顏色和位置,有時候我們需要做下改變:

現(xiàn)在我們生成的餅圖如下顯示:
顏色變成了我們設置的顏色 位置更靠左了

改變圖例位置
數(shù)據(jù)生成
上面的圖例是水平方向排列的,而且個數(shù)比較少。如果我們的圖例比較多,需要改成豎直方向,同時實現(xiàn)翻頁滾動功能。
在這里我們使用的是 pyecharts 中自帶的數(shù)據(jù):
1、Faker.choose() :是用來生成數(shù)據(jù)標簽,有3種不同的取值情況

2、Faker.values() 是用來生成具體的數(shù)據(jù),隨機生成

繪圖
還是通過上面的繪圖方法,加入數(shù)據(jù)同時添加各種配置項:


環(huán)狀餅圖
環(huán)狀餅圖主要是通過 add 方法中的 radius 參數(shù)來實現(xiàn)的。實現(xiàn)過程如下:
x_data?=?["小明",?"小紅",?"張三",?"李四",?"王五"]
y_data?=?[335,?310,?234,?135,?548]
c?=?(
????Pie(init_opts=opts.InitOpts(width="1600px",?height="1000px"))???#?圖形的大小設置
????.add(
????????series_name="訪問來源",
????????data_pair=[list(z)?for?z?in?zip(x_data,?y_data)],
????????radius=["15%",?"50%"],???#?餅圖內(nèi)圈和外圈的大小比例
????????center=["30%",?"40%"],???#?餅圖的位置:左邊距和上邊距
????????label_opts=opts.LabelOpts(is_show=True),???#?顯示數(shù)據(jù)和百分比??
????)
????.set_global_opts(legend_opts=opts.LegendOpts(pos_left="left",?orient="vertical"))???#?圖例在左邊和垂直顯示
????.set_series_opts(
????????tooltip_opts=opts.TooltipOpts(
????????????trigger="item",?formatter="{a}?
:?{c}?(go7utgvlrp%)"
????????),
????)
c.render_notebook()
可以看到圖形的中間是空的

內(nèi)嵌餅圖
內(nèi)嵌餅圖是指將兩個甚至多個環(huán)狀餅圖放在一起,實現(xiàn)代碼過程如下:
import?pyecharts.options?as?opts
from?pyecharts.charts?import?Pie
from?pyecharts.globals?import?ThemeType
#?內(nèi)部餅圖
inner_x_data?=?["直達",?"營銷廣告",?"搜索引擎","產(chǎn)品"]
inner_y_data?=?[335,?679,?548,?283]
inner_data_pair?=?[list(z)?for?z?in?zip(inner_x_data,?inner_y_data)]
#?[['直達',?335],?['營銷廣告',?679],?['搜索引擎',?1548],?[‘產(chǎn)品’,?283]]
#?外部環(huán)形(嵌套)
outer_x_data?=?["搜索引擎",?"郵件營銷",?"直達",?"營銷廣告",?"聯(lián)盟廣告",?"視頻廣告",?"產(chǎn)品",?"百度",?"谷歌","郵件營銷",?"聯(lián)盟廣告"]
outer_y_data?=?[335,?135,?147,?102,?220,?310,?234,?135,?648,?251]
outer_data_pair?=?[list(z)?for?z?in?zip(outer_x_data,?outer_y_data)]
c?=?(
?????#?初始化
????Pie(init_opts=opts.InitOpts(
????????width="900px",??#?設置圖形大小
????????height="800px",
????????theme=ThemeType.SHINE))??#?選擇主題
????#?內(nèi)部餅圖
????.add(
????????series_name="版本3.2.1",??#?圖形名稱
????????center=["50%",?"35%"],??#?餅圖位置
????????data_pair=inner_data_pair,??#?系列數(shù)據(jù)項,格式為?[(key1,?value1),?(key2,?value2)]
????????radius=["25%",?"40%"],??#?餅圖半徑?數(shù)組的第一項是內(nèi)半徑,第二項是外半徑
????????label_opts=opts.LabelOpts(position='inner'),?#?標簽設置在內(nèi)部
????)
????#?外部嵌套環(huán)形圖
????.add(
????????series_name="版本3.2.9",??#?系列名稱
????????center=["50%",?"35%"],??#?餅圖位置
????????radius=["40%",?"60%"],??#?餅圖半徑?數(shù)組的第一項是內(nèi)半徑,第二項是外半徑
????????data_pair=outer_data_pair,?#?系列數(shù)據(jù)項,格式為?[(key1,?value1),?(key2,?value2)]
????????#?標簽配置項?
????????label_opts=opts.LabelOpts(
????????????position="outside",
????????????formatter="{a|{a}}{abg|}\n{hr|}\n?{b|:?}{c}??{per|go7utgvlrp%}??",
????????????background_color="#eee",
????????????border_color="#aaa",
????????????border_width=1,
????????????border_radius=4,
????????????rich={
????????????????"a":?{"color":?"#999",
??????????????????????"lineHeight":?22,
??????????????????????"align":?"center"},
????????????????"abg":?{
????????????????????"backgroundColor":?"#e3e3e3",
????????????????????"width":?"100%",
????????????????????"align":?"right",
????????????????????"height":?22,
????????????????????"borderRadius":?[4,?4,?0,?0],
????????????????},
????????????????"hr":?{
????????????????????"borderColor":?"#aaa",
????????????????????"width":?"100%",
????????????????????"borderWidth":?0.5,
????????????????????"height":?0,
????????????????},
????????????????"b":?{"fontSize":?16,?"lineHeight":?33},
????????????????"per":?{
????????????????????"color":?"#eee",
????????????????????"backgroundColor":?"#334455",
????????????????????"padding":?[2,?4],
????????????????????"borderRadius":?2,
????????????????},
????????????},
????????),
????)
????#?全局配置項
????.set_global_opts(
????????xaxis_opts?=?opts.AxisOpts(is_show?=?False),???#隱藏X軸刻度
????????yaxis_opts?=?opts.AxisOpts(is_show?=?False),????#隱藏Y軸刻度
????????legend_opts?=?opts.LegendOpts(is_show?=?True),??#隱藏圖例
????????title_opts?=?opts.TitleOpts(title?=?None),????#隱藏標題
????????????????????)
????#?系統(tǒng)配置項
????.set_series_opts(
????????tooltip_opts=opts.TooltipOpts(
????????????trigger="item",
????????????formatter="{a}?
:?{c}?(go7utgvlrp%)"
????????),
????????label_opts=opts.LabelOpts(is_show=True)??#?隱藏每個觸角標簽
????)
)
c.render_notebook()

多餅圖
有時候我們需要將多個圖形放在一個大畫布中,需要用到子圖的制作。
在下面的代碼中每個 add() 都是一個圖形的繪制,我們繪制了4個餅圖;同時center指定每個圖形的位置,radius指定每個餅圖內(nèi)外圈的大小
c?=?(
????Pie()
????.add(
????????"",
????????[list(z)?for?z?in?zip(["劇情",?"其他"],?[30,?70])],
????????center=["20%",?"30%"],??#?位置
????????radius=[60,?80],???#?每個餅圖內(nèi)外圈的大小
????)
????.add(
????????"",
????????[list(z)?for?z?in?zip(["奇幻",?"其他"],?[40,?60])],
????????center=["55%",?"30%"],
????????radius=[60,?80],
????)
????.add(
????????"",
????????[list(z)?for?z?in?zip(["愛情",?"其他"],?[24,?76])],
????????center=["20%",?"70%"],
????????radius=[60,?80],
????)
????.add(
????????"",
????????[list(z)?for?z?in?zip(["驚悚",?"其他"],?[11,?89])],
????????center=["55%",?"70%"],
????????radius=[60,?80],
????)
????.set_global_opts(
????????title_opts=opts.TitleOpts(title="Pie-多餅圖基本示例"),
????????legend_opts=opts.LegendOpts(
????????????type_="scroll",?pos_top="20%",?pos_left="80%",?orient="vertical"
????????),
????)
)
c.render_notebook()

玫瑰圖
玫瑰圖中每個部分的大小和粗細都是不同的
v?=?Faker.choose()
c?=?(
????Pie()
????.add(
????????"",
????????[list(z)?for?z?in?zip(v,?Faker.values())],???#?兩個值
????????radius=["30%",?"60%"],??#?大小
????????center=["25%",?"50%"],??#?位置
????????rosetype="radius",???
????????label_opts=opts.LabelOpts(is_show=False),??#?不在圖形上顯示數(shù)據(jù)
????)
????.add(
????????"",
????????[list(z)?for?z?in?zip(v,?Faker.values())],
????????radius=["30%",?"60%"],
????????center=["75%",?"50%"],
????????rosetype="area",
????)
????.set_global_opts(title_opts=opts.TitleOpts(title="Pie-玫瑰圖示例"))
)
c.render_notebook()


作者簡介
Peter,碩士畢業(yè)僧一枚,從電子專業(yè)自學Python入門數(shù)據(jù)行業(yè),擅長數(shù)據(jù)分析及可視化。喜歡數(shù)據(jù),堅持跑步,熱愛閱讀,樂觀生活。個人格言:不浮于世,不負于己
個人站點:www.renpeter.cn,歡迎常來小屋逛逛
源碼文件獲取
為方便大家練習,已將整理好的源代碼(jupyter notebook文件)分享給各位同學,大家可以在作者的公眾號?「檸檬數(shù)據(jù)」?回復?pie2020?來獲取。
往期精彩回顧
獲取本站知識星球優(yōu)惠券,復制鏈接直接打開:
https://t.zsxq.com/qFiUFMV
本站qq群704220115。
加入微信群請掃碼:
