雷达图(也称为蜘蛛图或星形图)是一种可视化视图,用于使用一致的比例尺显示三个或更多维度上的多元数据。并非每个人都是雷达图的忠实拥护者,但我认为雷达图能够以视觉上吸引人的方式比较不同类别各个特征的值。本文主要讲述通过matplotlib绘制雷达图。本文所有代码见:Python-Study-Notes

# 去掉警告
import warnings
warnings.filterwarnings("ignore")
# 多行输出
from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = "all"

1 基础雷达图 Basic radar chart

雷达图显示一个或几个实体的几个数值变量的值。下面是一个简单的示例,仅显示一个类别5个变量的值。据我所知,Matplotlib中没有允许生成雷达图的内建函数。因此,我们必须使用基本函数来构建它,这使得这有些小麻烦。以下实例输入数据是一个pandas数据框架,其中每一行表示一个类别,每一列表示一个变量。

# Libraries
import matplotlib.pyplot as plt
import pandas as pd
from math import pi # Set data
# 设定数据
df = pd.DataFrame({
'group': ['A', 'B', 'C', 'D'],
'var1': [38, 1.5, 30, 4],
'var2': [29, 10, 9, 34],
'var3': [8, 39, 23, 24],
'var4': [7, 31, 33, 14],
'var5': [28, 15, 32, 14]
}) # number of variable
# 变量类别
categories = list(df)[1:]
# 变量类别个数
N = len(categories) # plot the first line of the data frame.
# 绘制数据的第一行
values = df.loc[0].drop('group').values.flatten().tolist()
# 将第一个值放到最后,以封闭图形
values += values[:1]
print(values) # 设置每个点的角度值
angles = [n / float(N) * 2 * pi for n in range(N)]
angles += angles[:1] # Initialise the spider plot
# 初始化极坐标网格
ax = plt.subplot(111, polar=True) # Draw one axe per variable + add labels labels yet
# 设置x轴的标签
plt.xticks(angles[:-1], categories, color='grey', size=8) # Draw ylabels
# 设置标签显示位置
# 具体见https://www.bbsmax.com/A/x9J2DRwNd6/
ax.set_rlabel_position(0)
# 设置y轴的标签
plt.yticks([10, 20, 30], ["10", "20", "30"], color="grey", size=7)
plt.ylim(0, 40) # Plot data
# 画图
ax.plot(angles, values, linewidth=1, linestyle='solid') # Fill area
# 填充区域
ax.fill(angles, values, 'b', alpha=0.1); plt.show();
[38.0, 29, 8, 7, 28, 38.0]

2 多类别变量雷达图 Radar chart with several individuals

这个例子跟上图一样,一旦你理解了这个方法,就很容易把它应用到多类别变量。注意,如果超过2到3个类别,我强烈建议使用分面绘图,而不是在同一个图上显示所有类别,这样会导致雷达图变得难以阅读。

首先创建一个坐标轴背景。

# Libraries
import matplotlib.pyplot as plt
import pandas as pd
from math import pi # Set data
df = pd.DataFrame({
'group': ['A', 'B', 'C', 'D'],
'var1': [38, 1.5, 30, 4],
'var2': [29, 10, 9, 34],
'var3': [8, 39, 23, 24],
'var4': [7, 31, 33, 14],
'var5': [28, 15, 32, 14]
}) # ---------- 步骤1 创建背景 # number of variable
# 变量类别
categories = list(df)[1:]
# 变量类别个数
N = len(categories) # 设置每个点的角度值
angles = [n / float(N) * 2 * pi for n in range(N)]
angles += angles[:1] # Initialise the spider plot
# 初始化极坐标网格
ax = plt.subplot(111, polar=True) # If you want the first axis to be on top:
# 设置角度偏移
ax.set_theta_offset(pi / 2)
# 设置顺时针还是逆时针,1或者-1
ax.set_theta_direction(-1) # Draw one axe per variable + add labels labels yet
# 设置x轴的标签
plt.xticks(angles[:-1], categories) # Draw ylabels
# 画标签
ax.set_rlabel_position(0)
plt.yticks([10, 20, 30], ["10", "20", "30"], color="grey", size=7)
plt.ylim(0, 40);

进而填充绘图

# ---------- 步骤1 创建背景

# number of variable
# 变量类别
categories = list(df)[1:]
# 变量类别个数
N = len(categories) # 设置每个点的角度值
angles = [n / float(N) * 2 * pi for n in range(N)]
angles += angles[:1] # Initialise the spider plot
# 初始化极坐标网格
ax = plt.subplot(111, polar=True) # If you want the first axis to be on top:
# 设置角度偏移
ax.set_theta_offset(pi / 2)
# 设置顺时针还是逆时针,1或者-1
ax.set_theta_direction(-1) # Draw one axe per variable + add labels labels yet
# 设置x轴的标签
plt.xticks(angles[:-1], categories) # Draw ylabels
# 画标签
ax.set_rlabel_position(0)
plt.yticks([10, 20, 30], ["10", "20", "30"], color="grey", size=7)
plt.ylim(0, 40) # ---------- 步骤1 绘制数据 # 单独绘制每一组数据
# Ind1
values = df.loc[0].drop('group').values.flatten().tolist()
values += values[:1]
ax.plot(angles, values, linewidth=1, linestyle='solid', label="group A")
ax.fill(angles, values, 'b', alpha=0.1) # Ind2
values = df.loc[1].drop('group').values.flatten().tolist()
values += values[:1]
ax.plot(angles, values, linewidth=1, linestyle='solid', label="group B")
ax.fill(angles, values, 'r', alpha=0.1) # Add legend
# 添加图例
plt.legend(loc='upper right', bbox_to_anchor=(0.1, 0.1));

3 雷达图分面绘图 Use faceting for Radar chart

以上例子显示了如何制作一个或几个类别的雷达图。但是,建议不要在同雷达图上绘制多个类别,会导致雷达图难以阅读。当多类别绘图推荐分面绘图,即单独绘制每一个类别的雷达图,这样能够让每一个类别的雷达图保持清晰,并可以可以比较每个图的形状。

import matplotlib.pyplot as plt
import pandas as pd
from math import pi # Set data
df = pd.DataFrame({
'group': ['A','B','C','D'],
'var1': [38, 1.5, 30, 4],
'var2': [29, 10, 9, 34],
'var3': [8, 39, 23, 24],
'var4': [7, 31, 33, 14],
'var5': [28, 15, 32, 14]
}) # ---------- 步骤1 创建背景
def make_spider( row, title, color): # number of variable
# 变量类别
categories = list(df)[1:]
# 变量类别个数
N = len(categories) # 设置每个点的角度值
angles = [n / float(N) * 2 * pi for n in range(N)]
angles += angles[:1] # Initialise the spider plot
# 分图
ax = plt.subplot(2,2,row+1, polar=True, ) # If you want the first axis to be on top:
# 设置角度偏移
ax.set_theta_offset(pi / 2)
# 设置顺时针还是逆时针,1或者-1
ax.set_theta_direction(-1) # Draw one axe per variable + add labels labels yet
# 设置x轴的标签
plt.xticks(angles[:-1], categories, color='grey', size=8) # Draw ylabels
# 画标签
ax.set_rlabel_position(0)
plt.yticks([10,20,30], ["10","20","30"], color="grey", size=7)
plt.ylim(0,40) # Ind
# 填充数据
values=df.loc[row].drop('group').values.flatten().tolist()
values += values[:1]
ax.plot(angles, values, color=color, linewidth=2, linestyle='solid')
ax.fill(angles, values, color=color, alpha=0.4) # Add a title
# 设置标题
plt.title(title, size=11, color=color, y=1.1) # ---------- 步骤2 绘制图形
my_dpi=96
plt.figure(figsize=(1000/my_dpi, 1000/my_dpi), dpi=my_dpi) # Create a color palette:
# 设定颜色
my_palette = plt.cm.get_cmap("Set2", len(df.index)) # Loop to plot
for row in range(0, len(df.index)):
make_spider( row=row, title='group '+df['group'][row], color=my_palette(row))
<Figure size 1000x1000 with 0 Axes>

4 参考

[python] 基于matplotlib实现雷达图的绘制的更多相关文章

  1. [python] 基于matplotlib实现圆环图的绘制

    圆环图本质上是一个中间切出一块区域的饼状图.可以使用python和matplotlib库来实现.本文主要介绍基于matplotlib实现圆环图.本文所有代码见:Python-Study-Notes # ...

  2. [python] 基于matplotlib_venn实现维恩图的绘制

    文章目录 VENN DIAGRAM(维恩图) 1. 具有2个分组的基本的维恩图 Venn diagram with 2 groups 2. 具有3个组的基本维恩图 Venn diagram with ...

  3. Matplotlib学习---用matplotlib画雷达图(radar chart)

    雷达图常用于对多项指标的全面分析.例如:HR想要比较两个应聘者的综合素质,用雷达图分别画出来,就可以进行直观的比较. 用Matplotlib画雷达图需要使用极坐标体系,可点击此链接,查看对极坐标体系的 ...

  4. python+matplotlib制作雷达图3例分析和pandas读取csv操作

    1.例一 图1 代码1 #第1步:导出模块 import numpy as np import matplotlib.pyplot as plt from matplotlib import font ...

  5. pyhton中matplotlib箱线图的绘制(matplotlib双轴图、箱线图、散点图以及相关系数矩阵图))

    //2019.07.23 1.箱形图,又称为盒式图,一般可以很好地反映出数据分布的特征,也可以进行多项数据之间分布特征的比较,它主要包含五个基础数据:中位数,两个上下分位数以及上下边缘线数据 其中的一 ...

  6. python中matplotlib画折线图实例(坐标轴数字、字符串混搭及标题中文显示)

    最近在用python中的matplotlib画折线图,遇到了坐标轴 "数字+刻度" 混合显示.标题中文显示.批量处理等诸多问题.通过学习解决了,来记录下.如有错误或不足之处,望请指 ...

  7. [python] 基于matplotlib实现树形图的绘制

    树形图Tree diagram (代码下载) 本文旨在描述如何使用Python实现基本的树形图.要实现这样的树形图,首先需要有一个数值矩阵.每一行代表一个实体(这里是一辆汽车).每列都是描述汽车的变量 ...

  8. python基于matplotlib绘图

    import math import numpy as np import matplotlib.pyplot as plt from matplotlib.font_manager import F ...

  9. python3绘图示例5(基于matplotlib:正弦图等)

    #!/usr/bin/env python# -*- coding:utf-8 -*- import numpy as npimport pylab as pyimport matplotlib as ...

随机推荐

  1. Bing 广告平台迁移到 .net6

    原文链接 https://devblogs.microsoft.com/dotnet/bing-ads-campaign-platform-journey-to-dotnet-6/ 广告组件平台对于微 ...

  2. 分布式存储系统之Ceph集群CephFS基础使用

    前文我们了解了ceph之上的RBD接口使用相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/16753098.html:今天我们来聊一聊ceph之上的另一 ...

  3. 纯Vue实现网页日常任务清单小功能(数据存储在浏览器)

    任务清单可以极大提高我们的工作效率.哪些事情办了.哪些事情代办.哪些是紧急需要办的事情等等. 在组件化编码实战3的基础上进一步改进.将原先的数据保存的浏览器中.就可以做到关闭网页也不会丢失数据的情况 ...

  4. springboot+bootstrap实现图书商城管理(大三下学期课程设计)

    在csdn上记一次自己的课程设计过程(已经实习两个月了.感觉这个很容易做.支付可能需要多花点时间.): 在此框架基础之上权限认证管理设置成功:https://blog.csdn.net/weixin_ ...

  5. vue+spirngboot 分离技术实现图书信息的增删改查(改造这学期的课程设计【1】)

    1.前端项目的创建 vue init webpack bookshopvue 安装axios http://www.axios-js.com/ npm install --save axios vue ...

  6. 齐博x1标签之异步加载标签数据

    为什么要异步加载标签?他有什么好处 如果一个页面的标签太多,又或者是页面中某一个标签调用数据太慢的话,就会拖慢整个页面的打开,非常影响用户体验.这个时候,用异步加载的话,就可以一块一块的显示,用户体验 ...

  7. HTML元素大全(1)

    01.基础元素 <h1/2/3/4/5/6>标题 从大h1到小h6,块元素,有6级标题.是一种标题类语义标签,内置了字体.边距样式. 合理使用h标签,主要用于标题,不要为了加粗效果而随意使 ...

  8. Linxu常用命令

    一.Linux权限的概念 Linux下有两种用户:普通用户和超级用户: 普通用户:在linux下做有限的事情: 超级用户:可以在linux系统下做任何事情,不受限制. 普通用户的提示符是"$ ...

  9. DevOps|乱谈开源社区、开源项目与企业内部开源

    之前的一篇文章<从特拉斯辞职风波到研发效能中的荒唐事>中关于企业内源的内容在研发效能群内引起了大家的热烈讨论.有的小伙伴不同意,有的小伙伴非常不同意,我觉得这都是非常正常的反馈,话不说不透 ...

  10. 记一次node节点无法加入K8S集群

    #问题现象:root@small-virtual-machine:~# kubeadm join 10.0.0.133:6443 --token d2hyl5.5qt5fzjsdbxm2k5o     ...