驚嘆,Pyecharts繪制餅圖原來可以如此漂亮!
利用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} <br/>: {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} <br/>: {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()


PS:公號內(nèi)回復「Python」即可進入Python 新手學習交流群,一起 100 天計劃!
老規(guī)矩,兄弟們還記得么,右下角的 “在看” 點一下,如果感覺文章內(nèi)容不錯的話,記得分享朋友圈讓更多的人知道!


【神秘禮包獲取方式】
