循序漸進,學(xué)會用pyecharts繪制玫瑰圖
玫瑰圖簡介
玫瑰圖全稱南丁格爾玫瑰圖,是英國護士和統(tǒng)計學(xué)家弗羅倫斯·南丁格爾發(fā)明的,又名為極區(qū)圖。
南丁格爾自己常昵稱這類圖為雞冠花圖(coxcomb),用以表達軍醫(yī)院季節(jié)性的死亡率,提供給那些不太能理解傳統(tǒng)統(tǒng)計報表的公務(wù)人員。
在疫情期間經(jīng)??吹侥欠N盤旋的像玫瑰一樣的、用來展示不同地區(qū)的新增等數(shù)據(jù)的圖形,就是玫瑰圖。
玫瑰圖是一種圓形的直方圖,即有餅圖的特征,也有直方圖的特征。
在Python中,可以使用pyecharts庫中繪制餅圖的組件Pie實現(xiàn)玫瑰圖,本文就循序漸進地介紹一步步將餅圖演變成玫瑰圖。
繪圖準備
- 安裝pyecharts庫
pip install pyecharts
- 準備示例數(shù)據(jù)
本文用十種水果的熱量(kcal/100g)值對比來做演示。(數(shù)據(jù)來源于網(wǎng)絡(luò))
# coding=utf-8
import pandas as pd
fruits = {'香蕉': 115, '梨': 79, '椰子': 241, '柿子': 74, '鮮棗': 125,
'榴蓮': 147, '石榴': 72, '菠蘿蜜': 105, '牛油果': 143, '山楂': 102}
s_fruits = pd.Series(fruits)
print(s_fruits)
香蕉 115
梨 79
椰子 241
柿子 74
鮮棗 125
榴蓮 147
石榴 72
菠蘿蜜 105
牛油果 143
山楂 102
dtype: int64
繪制餅圖
先根據(jù)初始數(shù)據(jù),繪制一個基本的餅圖。
繪制餅圖使用pyecharts中的Pie組件,先初始化一個Pie對象,調(diào)用add()方法添加繪圖用的數(shù)據(jù),再鏈式調(diào)用set_series_opts()、set_global_opts()設(shè)置餅圖的標簽、標題、圖例等,最后鏈式調(diào)用render()方法將圖形渲染到HTML文件中,可以用瀏覽器打開繪圖結(jié)果。
from pyecharts.charts import Pie
from pyecharts import options as opts
# 餅圖
pie = Pie(init_opts=opts.InitOpts(width='800px', height='600px', bg_color='white'))
pie.add(
'', [list(z) for z in zip([fruit for fruit in s_fruits.index], s_fruits)], center=['50%', '50%']
).set_series_opts(
label_opts=opts.LabelOpts(formatter=": {c}"),
).set_global_opts(
title_opts=opts.TitleOpts(title='水果的熱量對比(kcal/100g)', pos_left='300', pos_top='20',
title_textstyle_opts=opts.TextStyleOpts(color='black', font_size=16)),
legend_opts=opts.LegendOpts(is_show=False)
).render('fruits_calorie1.html')
此時繪制了一個普通的餅圖,已經(jīng)可以對比展示數(shù)據(jù)了。
繪制環(huán)形餅圖
要將一個餅圖設(shè)置成環(huán)形餅圖,在添加數(shù)據(jù)的add()方法中使用radius參數(shù)設(shè)置。
radius參數(shù)接收一個列表或元組,列表由兩個數(shù)值或百分比組成,如radius=[‘40%’, ‘60%’],分別表示餅圖的內(nèi)半徑和外半徑,大部分情況用百分比。
餅圖的內(nèi)半徑默認為0,外半徑默認為畫布高寬中較小的一項的一半,所以餅圖默認是從圓心開始的,大小根據(jù)畫布大小自適應(yīng)。
# 環(huán)形餅圖
pie = Pie(init_opts=opts.InitOpts(width='800px', height='600px', bg_color='white'))
pie.add(
'', [list(z) for z in zip([fruit for fruit in s_fruits.index], s_fruits)],
radius=['40%', '60%'], center=['50%', '50%']
).set_series_opts(
label_opts=opts.LabelOpts(formatter=": {c}"),
).set_global_opts(
title_opts=opts.TitleOpts(title='水果的熱量對比(kcal/100g)', pos_left='300', pos_top='20',
title_textstyle_opts=opts.TextStyleOpts(color='black', font_size=16)),
legend_opts=opts.LegendOpts(is_show=False)
).render('fruits_calorie2.html')
設(shè)置radius參數(shù)后餅圖變成了環(huán)形餅圖。當(dāng)然,玫瑰圖并不一定是“空心”的,不用先修改成環(huán)形餅圖也可以。
繪制玫瑰圖
在餅圖的基礎(chǔ)上,在add()方法中添加rosetype="radius"參數(shù),就可以繪制出玫瑰圖。
rosetype參數(shù)用于設(shè)置是否展示成南丁格爾玫瑰圖,默認None(不展示成玫瑰圖)。
rosetype有’radius’和’area’兩種模式:
-
radius模式:用扇形圓心角展現(xiàn)數(shù)據(jù)的百分比,通過半徑展現(xiàn)數(shù)據(jù)大小。
-
area模式:所有扇形圓心角相同,僅通過半徑展現(xiàn)數(shù)據(jù)大小。
# 玫瑰圖
pie = Pie(init_opts=opts.InitOpts(width='800px', height='600px', bg_color='white'))
pie.add(
'', [list(z) for z in zip([fruit for fruit in s_fruits.index], s_fruits)],
radius=['10%', '70%'], center=['50%', '50%'], rosetype="radius"
).set_series_opts(
label_opts=opts.LabelOpts(formatter=": {c}")
).set_global_opts(
title_opts=opts.TitleOpts(title='水果的熱量對比(kcal/100g)', pos_left='300', pos_top='20',
title_textstyle_opts=opts.TextStyleOpts(color='black', font_size=16)),
legend_opts=opts.LegendOpts(is_show=False)
).render('fruits_calorie3.html')
本文使用’radius’模式,用扇形圓心角展現(xiàn)數(shù)據(jù)的百分比,具有餅圖的特征,通過半徑展現(xiàn)數(shù)據(jù)大小,具有直方圖的特征。
優(yōu)化玫瑰圖
玫瑰圖已經(jīng)完成了,在展示時可以進行一些優(yōu)化。
-
先對數(shù)據(jù)進行排序。
使用pandas中的sort_values()方法先將數(shù)據(jù)排序,再繪制玫瑰圖,這樣圖像的半徑依次變大,對比效果更直觀。
-
調(diào)整radius的范圍。
根據(jù)數(shù)據(jù)的變化調(diào)整radius參數(shù)中的內(nèi)半徑和外半徑值,改變圖形的展示范圍,使圖像更協(xié)調(diào)美觀。
-
設(shè)置扇形顏色漸變。
鏈式調(diào)用set_colors()方法來設(shè)置玫瑰圖的顏色,為了使不同的扇形顏色依次漸變,可以通過設(shè)置RGB(red,green,blue)值的變化來實現(xiàn),如下方代碼控制不同數(shù)據(jù)的R值和B值,將顏色調(diào)為紅藍漸變。具體代碼如下。
# 玫瑰圖美化
s_fruits = s_fruits.sort_values()
pie = Pie(init_opts=opts.InitOpts(width='800px', height='600px', bg_color='white'))
pie.add(
'', [list(z) for z in zip([fruit for fruit in s_fruits.index], s_fruits)],
radius=['10%', '70%'], center=['50%', '50%'], rosetype="radius"
).set_series_opts(
label_opts=opts.LabelOpts(formatter=": {c}"),
).set_global_opts(
title_opts=opts.TitleOpts(title='水果的熱量對比(kcal/100g)', pos_left='300', pos_top='20',
title_textstyle_opts=opts.TextStyleOpts(color='black', font_size=16)),
legend_opts=opts.LegendOpts(is_show=False)
).set_colors(
['rgb({r},0,)'.format(r=255-20*(len(s_fruits)-x+1), b=255-15*x) for x in range(len(s_fruits))]
).render('fruits_calorie4.html')
經(jīng)過以上幾個步驟的演進,一個不錯的玫瑰圖完成了。這樣一步一步地調(diào)整和演進,可以方便大家學(xué)習(xí)。
如果本文對你有幫助,歡迎點贊、收藏和關(guān)注。文章來源:http://www.zghlxwxcb.cn/news/detail-422498.html
參考文檔:
[1] pyecharts官方文檔:https://pyecharts.org/#/zh-cn/basic_charts文章來源地址http://www.zghlxwxcb.cn/news/detail-422498.html
到了這里,關(guān)于循序漸進,學(xué)會用pyecharts繪制玫瑰圖的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!