利用pyecharts绘制雷达图的案例(含参数解释)

目录

一、概念介绍

二、数据导入

三、图像绘制

四、 参数解释

Part 1:背景图添加

Part 2:add_schema

Part 3:绘制雷达链

Part 4 :set_series_opts

一、概念介绍

雷达图(Radar Chart),或称为戴布拉图、蜘蛛网图。图形以一点为中心,每一变量维度为一极坐标轴,n个维度即形成n轴的由内向外放射状图形,形似蜘蛛网。

图形示例:(图源百度)

利用pyecharts绘制雷达图的案例(含参数解释)

分析上图,我们可以得到一家企业或者某个部门在经营管理上的评分分布。

图形的基本构成如下:

利用pyecharts绘制雷达图的案例(含参数解释)

雷达图的应用特点

① 同样是属于比较与分布类型,雷达图与柱状图最明显的差异是, 柱状图在实际场景中通常被用于进行单(多)维度定性数据的可视化,比如一次期中考试,绘制柱状图来对比八个班级的语文平均分;而 雷达图常常用于单(多)个体的多维度数据对比,进而呈现并帮助分析对象的优劣处,比如在这次考试中,绘制雷达图来观察二班的语文、数学、英语、生物、化学、物理科目平均分的优良分布。

② 如果遇到多总体,我们可以使用多幅雷达图,或者单幅雷达图中多层数据线的形式进行总体间对比。

③ 无论是变量特征还是对象总体都不要太多,前者(>10)会使得图像的轴过多,包含信息量过大而弱化了可读性,一眼看去让人感觉很复杂。后者(>5)要么会使得线条交叉密集,要么就是多重覆盖域因附着不同填充色而导致的信息覆盖问题,当然,如果每个总体都是单维突出类型,信息突出效果还是很好的。

④ 雷达图使用的数据是多特征的,会出现一种很常见的情况,比如年龄和收入的量纲或者说取值范围是不一致的。因为雷达图是维度内的粗略对比,我们并不会去根据图形计算一班和二班的数学平均分差究竟是多少,只需要得到二班在这次期中考试中数学比一班考得好的结论就可以,所以为了将各维度数据在一个取值范围内,我们在绘图前会考虑将数据归一化或者标准化。

⑤ 在应用场景上,通常有财务状况综合评价、用户画像、员工评分、医疗症状自评等等

二、数据导入

在本案例中,我们虚构了某部门五位员工的月度评价数据,希望绘制雷达图以向管理或人事部门反映员工们的亮点与不足之处。

利用pyecharts绘制雷达图的案例(含参数解释)
import pandas as pd
data = pd.DataFrame(pd.read_excel('案例数据.xlsx'))

生成绘图series
data_radar = []
for row in range(data.shape[0]):
    dic = {}
    value = []
    for col in range(1,data.shape[1]):
        value.append(int(data.iloc[row,col]))
    dic['name'],dic['value'] = data['员工'][row],value
    data_radar.append([dic])

各特征维度取值范围
scope = []
for col in range(1,data.shape[1]):
    dic = {}
    dic['name'] = data.columns[col]
    dic['max'],dic['min'] = max(data.iloc[:,col]),0
    scope.append(dic)

在这里,为了突出优秀,我们数轴范围最大值来源于样本数据。如果min,max都取决于样本,绘图结果等价于使用了归一法。这个范围是可以自定义的,看你想要展现什么信息,或者作为绘图的调整。

我们需要绘制雷达图的数据结构为:

利用pyecharts绘制雷达图的案例(含参数解释)

如果数据量比较少,希望自己手动输入的话,也可以按如下格式:

data_radar = [
    [{'name':'许一','value':[22,3,3,7,3,5]}],
    [{'name':'刘二','value':[27,2,4,10,4,3]}]
    # ...

     ]

三、图像绘制

为了下文便于解释参数,这里我们将多数调整为显示。使用python编程语言,调用pyecharts包得到以下图形。

利用pyecharts绘制雷达图的案例(含参数解释)

实现代码如下:

from pyecharts import options as opts
from pyecharts.charts import Radar
from pyecharts.commons.utils import JsCode

c = (
      # Radar()
    Radar(init_opts=opts.InitOpts(bg_color={"type": "pattern", "image": JsCode("img"), "repeat": "no-repeat"}))
        .add_js_funcs(    """    var img = new Image();
                          img.src = '背景.jpg';    """)
        .add_schema(
        schema=scope,
        shape="circle",
        center=["50%", "50%"],#宽高:900px*500px
        radius="60%",
        angleaxis_opts=opts.AngleAxisOpts(
            min_=0,
            max_=360,
            is_clockwise=False,
            interval=10,
            axistick_opts=opts.AxisTickOpts(is_show=True),
            axislabel_opts=opts.LabelOpts(is_show=True),
            axisline_opts=opts.AxisLineOpts(is_show=True),
            splitline_opts=opts.SplitLineOpts(is_show=True)
        ),
        radiusaxis_opts=opts.RadiusAxisOpts(
            min_=0,
            max_=30,
            interval=5,
            splitarea_opts=opts.SplitAreaOpts(
                is_show=True, areastyle_opts=opts.AreaStyleOpts(opacity=1)
            ),
        ),
        polar_opts=opts.PolarOpts(),
        splitline_opt=opts.SplitLineOpts(is_show=False)
    )
        .add(
        series_name="许一",
        data=data_radar[0],
        areastyle_opts=opts.AreaStyleOpts(opacity=0.2),
        linestyle_opts=opts.LineStyleOpts(width=2),
        color='#fc5a50'
    )
        .add(
        series_name="刘二",
        data=data_radar[1],
        areastyle_opts=opts.AreaStyleOpts(opacity=0.2),
        linestyle_opts=opts.LineStyleOpts(width=2),
        color='#35ad6b'
    )
        .add(
        series_name="张三",
        data=data_radar[2],
        areastyle_opts=opts.AreaStyleOpts(opacity=0.2),
        linestyle_opts=opts.LineStyleOpts(width=2),
        color='#3d7afd'
    )
        .add(
        series_name="李四",
        data=data_radar[3],
        areastyle_opts=opts.AreaStyleOpts(opacity=0.2),
        linestyle_opts=opts.LineStyleOpts(width=2),
        color='#aa23ff'
    )
        .add(
        series_name="王五",
        data=data_radar[4],
        areastyle_opts=opts.AreaStyleOpts(opacity=0.2),
        linestyle_opts=opts.LineStyleOpts(width=2),
        color='#fcb001'
    )
        .set_series_opts(label_opts=opts.LabelOpts(is_show=False))
        .set_global_opts(title_opts=opts.TitleOpts(title = '员工评价',subtitle = '林老头ss',pos_left='left'))
        .render("雷达图示例.html")
)

四、 参数解释

Part 1:背景图添加

在默认情况下,我们的背景是白板,而initopts给我们提供了背景色、背景图、绘画主题等多种自定义选项。上述代码中负责背景图添加的部分如下,图片我选择的是一只可爱的小鲨鱼。

利用pyecharts绘制雷达图的案例(含参数解释)

如果无需增加背景,则Radar()即可。如果需要增加背景图片,我们只需要在上述代码中更改img.src部分,因为我这里背景图是放在同级目录,所以不需要提供存储路径。

利用pyecharts绘制雷达图的案例(含参数解释)

如果是想要更改背景色、主题等,可以参考地图案例的参数解释。利用pyecharts绘制分级地图的案例_林老头ss的博客-CSDN博客

Part 2:add_schema

add_schema 负责我们雷达图的设置

schema :指定雷达图的特征标签,每个轴的最大最小取值(方便画点),此前我们已经生成了取值范围的scope【{}】型,直接赋值就行。

shape、center、radius

shape即雷达图的外轮廓形状,circle圆形为默认值。

center为中心的位置,[50%,50%]指的是画布宽50%和高50%的位置,默认画布的宽高数据是900px*500px。。

radius是雷达图外圆的半径长度,60%指的是当前画布的宽度和高度中较小者的60%。

AngleAxisOpts :角度坐标选项设置

min_,max_指定角度范围。

is_clockwise=False 角度递增的方向是否按照时钟转动(顺时针)的方向。

interval 径向轴显示的间隔区间大小值,interval=10表示每隔10°划分径向轴角度。

剩下四个参数分别对应如下:

利用pyecharts绘制雷达图的案例(含参数解释)

RadiusAxisOpts :径向轴选项设置

min_,max_ 同理,设置径向轴的取值范围。

interval 用于径向轴上的划分,interval = 5 表示每隔 5 划分径向轴长度。

SplitAreaOpts 用来设置我们的间隔区域,is_show=True才会有灰白相间的效果,opacity指的是不透明度,可以取[0,1] , 数值越大颜色越深。

PolarOpts : 极坐标的设置,我们选择默认值。

splitline_opt :如果设置为True,增加分割线,变化如下图所示(不显示雷达链,免得遮挡)

利用pyecharts绘制雷达图的案例(含参数解释)

— 注意,上面的选项点亮了才会显示对应总体的分布数据线。

Part 3:绘制雷达链

add()用于一条一条自定义绘制总体的雷达链。

series_name :数据序列的名称,即总体名称。在静态图中它不会显示,交互过程中可以看到(如上上图)。

data :对应总体的数据list,格式为[{‘name’:’XX’,’value’:[num,num,num]}],具体参考我们的数据结构。这里需要注意的是,我们value的长度要和特征维度数一致。

areastyle_opts :覆盖域的透明度设置,因为我们这里是五总体,必须要调整填充色的透明度。

linestyle_opts : 雷达链的线条宽度设置

color:指定不同总体雷达图的颜色,这里可以保证边界和内部填充色一致,而饱和度不同。

symbol:设置数据点的形状,默认是空心圆。如果我们以许一的雷达链举例,数据点的形状改为三角形,即在color后面增加symbol = SymbolType.TRIANGLE,得到的结果如下:

利用pyecharts绘制雷达图的案例(含参数解释)

其余的形状可以参考水球图的参数解释部分:利用pyecharts绘制水球图的案例_林老头ss的博客-CSDN博客_水球图pyecharts

Part 4 :set_series_opts

这一部分用于设置数据序列的显示,我们只提 LabelOpts,对数据序列数值标签的设置,默认is_show是True,多总体情况下数字标签多容易显得很混乱,影响视觉观感。

利用pyecharts绘制雷达图的案例(含参数解释)

如果不想把所有雷达链绘制在一幅图中,我们也可以每一个总体画一个然后再排布,此时每个总体的所有label和color用一个颜色也会很好看。

希望对您有所帮助~

Original: https://blog.csdn.net/qq_45400322/article/details/123065757
Author: 林老头ss
Title: 利用pyecharts绘制雷达图的案例(含参数解释)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/693447/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球