目录
一、概念介绍
二、数据导入
三、图像绘制
四、 参数解释
Part 1:背景图添加
Part 2:add_schema
Part 3:绘制雷达链
Part 4 :set_series_opts
雷达图(Radar Chart),或称为戴布拉图、蜘蛛网图。图形以一点为中心,每一变量维度为一极坐标轴,n个维度即形成n轴的由内向外放射状图形,形似蜘蛛网。
图形示例:(图源百度)
分析上图,我们可以得到一家企业或者某个部门在经营管理上的评分分布。
图形的基本构成如下:
雷达图的应用特点:
① 同样是属于比较与分布类型,雷达图与柱状图最明显的差异是,柱状图在实际场景中通常被用于进行单(多)维度定性数据的可视化,比如一次期中考试,绘制柱状图来对比八个班级的语文平均分;而雷达图常常用于单(多)个体的多维度数据对比,进而呈现并帮助分析对象的优劣处,比如在这次考试中,绘制雷达图来观察二班的语文、数学、英语、生物、化学、物理科目平均分的优良分布。
② 如果遇到多总体,我们可以使用多幅雷达图,或者单幅雷达图中多层数据线的形式进行总体间对比。
③ 无论是变量特征还是对象总体都不要太多,前者(>10)会使得图像的轴过多,包含信息量过大而弱化了可读性,一眼看去让人感觉很复杂。后者(>5)要么会使得线条交叉密集,要么就是多重覆盖域因附着不同填充色而导致的信息覆盖问题,当然,如果每个总体都是单维突出类型,信息突出效果还是很好的。
④ 雷达图使用的数据是多特征的,会出现一种很常见的情况,比如年龄和收入的量纲或者说取值范围是不一致的。因为雷达图是维度内的粗略对比,我们并不会去根据图形计算一班和二班的数学平均分差究竟是多少,只需要得到二班在这次期中考试中数学比一班考得好的结论就可以,所以为了将各维度数据在一个取值范围内,我们在绘图前会考虑将数据归一化或者标准化。
⑤ 在应用场景上,通常有财务状况综合评价、用户画像、员工评分、医疗症状自评等等
在本案例中,我们虚构了某部门五位员工的月度评价数据,希望绘制雷达图以向管理或人事部门反映员工们的亮点与不足之处。
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都取决于样本,绘图结果等价于使用了归一法。这个范围是可以自定义的,看你想要展现什么信息,或者作为绘图的调整。
我们需要绘制雷达图的数据结构为:
如果数据量比较少,希望自己手动输入的话,也可以按如下格式:
data_radar = [
[{'name':'许一','value':[22,3,3,7,3,5]}],
[{'name':'刘二','value':[27,2,4,10,4,3]}]
# ...
]
为了下文便于解释参数,这里我们将多数调整为显示。使用python编程语言,调用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")
)
在默认情况下,我们的背景是白板,而initopts给我们提供了背景色、背景图、绘画主题等多种自定义选项。上述代码中负责背景图添加的部分如下,图片我选择的是一只可爱的小鲨鱼。
如果无需增加背景,则Radar()即可。如果需要增加背景图片,我们只需要在上述代码中更改img.src部分,因为我这里背景图是放在同级目录,所以不需要提供存储路径。
如果是想要更改背景色、主题等,可以参考地图案例的参数解释。利用pyecharts绘制分级地图的案例_林老头ss的博客-CSDN博客
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°划分径向轴角度。
剩下四个参数分别对应如下:
④ RadiusAxisOpts :径向轴选项设置
min_,max_ 同理,设置径向轴的取值范围。
interval 用于径向轴上的划分,interval = 5 表示每隔 5 划分径向轴长度。
SplitAreaOpts 用来设置我们的间隔区域,is_show=True才会有灰白相间的效果,opacity指的是不透明度,可以取[0,1] , 数值越大颜色越深。
⑤ PolarOpts : 极坐标的设置,我们选择默认值。
⑥ splitline_opt :如果设置为True,增加分割线,变化如下图所示(不显示雷达链,免得遮挡)
-- 注意,上面的选项点亮了才会显示对应总体的分布数据线。
add()用于一条一条自定义绘制总体的雷达链。
series_name :数据序列的名称,即总体名称。在静态图中它不会显示,交互过程中可以看到(如上上图)。
data :对应总体的数据list,格式为[{'name':'XX','value':[num,num,num]}],具体参考我们的数据结构。这里需要注意的是,我们value的长度要和特征维度数一致。
areastyle_opts :覆盖域的透明度设置,因为我们这里是五总体,必须要调整填充色的透明度。
linestyle_opts : 雷达链的线条宽度设置
color :指定不同总体雷达图的颜色,这里可以保证边界和内部填充色一致,而饱和度不同。
symbol :设置数据点的形状,默认是空心圆。如果我们以许一的雷达链举例,数据点的形状改为三角形,即在color后面增加symbol = SymbolType.TRIANGLE,得到的结果如下:
其余的形状可以参考水球图的参数解释部分:利用pyecharts绘制水球图的案例_林老头ss的博客-CSDN博客_水球图pyecharts
这一部分用于设置数据序列的显示,我们只提LabelOpts,对数据序列数值标签的设置,默认is_show是True,多总体情况下数字标签多容易显得很混乱,影响视觉观感。
如果不想把所有雷达链绘制在一幅图中,我们也可以每一个总体画一个然后再排布,此时每个总体的所有label和color用一个颜色也会很好看。
希望对您有所帮助~