循序渐进,学会用pyecharts绘制玫瑰图

Python 碎片

共 5450字,需浏览 11分钟

 · 2022-10-20

玫瑰图简介



玫瑰图全称南丁格尔玫瑰图,是英国护士和统计学家弗罗伦斯·南丁格尔发明的,又名为极区图。


南丁格尔自己常昵称这类图为鸡冠花图(coxcomb),用以表达军医院季节性的死亡率,提供给那些不太能理解传统统计报表的公务人员。


在疫情期间经常看到那种盘旋的像玫瑰一样的、用来展示不同地区的新增等数据的图形,就是玫瑰图。


玫瑰图是一种圆形的直方图,即有饼图的特征,也有直方图的特征。


在Python中,可以使用pyecharts库中绘制饼图的组件Pie实现玫瑰图,本文就循序渐进地介绍一步步将饼图演变成玫瑰图。


绘图准备



  • 安装pyecharts库


pip install pyecharts


  • 准备示例数据


本文用十种水果的热量(kcal/100g)值对比来做演示。(数据来源于网络)


# 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


绘制饼图



先根据初始数据,绘制一个基本的饼图。


绘制饼图使用pyecharts中的Pie组件,先初始化一个Pie对象,调用add()方法添加绘图用的数据,再链式调用set_series_opts()、set_global_opts()设置饼图的标签、标题、图例等,最后链式调用render()方法将图形渲染到HTML文件中,可以用浏览器打开绘图结果。


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="{b}: {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')



此时绘制了一个普通的饼图,已经可以对比展示数据了。


绘制环形饼图



要将一个饼图设置成环形饼图,在添加数据的add()方法中使用radius参数设置。


radius参数接收一个列表或元组,列表由两个数值或百分比组成,如radius=['40%', '60%'],分别表示饼图的内半径和外半径,大部分情况用百分比。


饼图的内半径默认为0,外半径默认为画布高宽中较小的一项的一半,所以饼图默认是从圆心开始的,大小根据画布大小自适应。


# 环形饼图
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="{b}: {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')



设置radius参数后饼图变成了环形饼图。当然,玫瑰图并不一定是“空心”的,不用先修改成环形饼图也可以。


绘制玫瑰图



在饼图的基础上,在add()方法中添加rosetype="radius"参数,就可以绘制出玫瑰图。


rosetype参数用于设置是否展示成南丁格尔玫瑰图,默认None(不展示成玫瑰图)。

rosetype有'radius'和'area'两种模式:


  • radius模式:用扇形圆心角展现数据的百分比,通过半径展现数据大小。


  • area模式:所有扇形圆心角相同,仅通过半径展现数据大小。


# 玫瑰图
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="{b}: {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'模式,用扇形圆心角展现数据的百分比,具有饼图的特征,通过半径展现数据大小,具有直方图的特征。


优化玫瑰图



玫瑰图已经完成了,在展示时可以进行一些优化。


  • 先对数据进行排序。


使用pandas中的sort_values()方法先将数据排序,再绘制玫瑰图,这样图像的半径依次变大,对比效果更直观。


  • 调整radius的范围。


根据数据的变化调整radius参数中的内半径和外半径值,改变图形的展示范围,使图像更协调美观。


  • 设置扇形颜色渐变。


链式调用set_colors()方法来设置玫瑰图的颜色,为了使不同的扇形颜色依次渐变,可以通过设置RGB(red,green,blue)值的变化来实现,如下方代码控制不同数据的R值和B值,将颜色调为红蓝渐变。具体代码如下。


# 玫瑰图美化
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="{b}: {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,{b})'.format(r=255-20*(len(s_fruits)-x+1), b=255-15*x) for x in range(len(s_fruits))]
).render('fruits_calorie4.html')



经过以上几个步骤的演进,一个不错的玫瑰图完成了。这样一步一步地调整和演进,可以方便大家学习。


如果本文对你有帮助,欢迎点赞、在看和分享。


参考文档: 

[1] pyecharts官方文档:https://pyecharts.org/#/zh-cn/basic_charts

浏览 34
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报