首页 > 编程语言 >[python] 基于matplotlib实现雷达图的绘制

[python] 基于matplotlib实现雷达图的绘制

时间:2022-12-17 20:09:03浏览次数:58  
标签:plt python matplotlib color values angles 类别 ax 绘制


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

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

文章目录

  • ​​1 基础雷达图 Basic radar chart​​
  • ​​2 多类别变量雷达图 Radar chart with several individuals​​
  • ​​3 雷达图分面绘图 Use faceting for Radar chart​​
  • ​​4 参考​​

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]

[python] 基于matplotlib实现雷达图的绘制_数据

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);

[python] 基于matplotlib实现雷达图的绘制_初始化_02

进而填充绘图

# ---------- 步骤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));

[python] 基于matplotlib实现雷达图的绘制_初始化_03

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>

[python] 基于matplotlib实现雷达图的绘制_初始化_04

4 参考

​Radar​

​Area chart and faceting​


标签:plt,python,matplotlib,color,values,angles,类别,ax,绘制
From: https://blog.51cto.com/luohenyueji/5950096

相关文章

  • [编程基础] Python对象的浅拷贝与深拷贝笔记
    Python中的赋值语句不创建对象的副本,它们只将名称绑定到对象。对于不可变的对象,这通常没有什么区别。但是对于处理可变对象或可变对象的集合,您可能需要寻找一种方法来创建这......
  • [编程基础] Python中的绝对导入与相对导入
    如果您从事的Python项目有多个文件,那么您以前可能不得不使用import语句。即使对于拥有多个项目的Python重度使用者(比如我),import也可能会造成混淆!您可能正在阅读本文,因为您想......
  • [编程基础] Python模块和包使用笔记
    本文探讨Python模块和Python包,这两种机制有助于模块化编程。模块化编程是指将大型笨拙的编程任务分解为单独的,较小的,更易于管理的子任务或模块的过程。然后可以像构建模块......
  • [编程基础] Python列表解析总结
    在本教程中,我们将学习使用Python列表解析(listcomprehensions)相关知识文章目录​​1使用介绍​​​​1.1Python列表解析转换列表​​​​1.2从摄氏度计算华氏温度​​......
  • [编程基础] Python装饰器入门总结
    Python装饰器教程展示了如何在Python中使用装饰器基本功能。文章目录​​1使用教程​​​​1.1Python装饰器简单示例​​​​1.2带@符号的Python装饰器​​​​1.3用参......
  • [编程基础] Python随机数生成模块总结
    Python随机数生成模块教程演示如何在Python中生成伪随机数。文章目录​​1介绍​​​​1.1随机数字生成器​​​​1.2Pythonrandom模块​​​​1.3随机种子​​​​2......
  • [编程基础] Python格式化字符串常量f-string总结
    Python格式化字符串常量f-string总结本文主要总结在Python中如何使用格式化字符串常量f-string(Formattedstringliterals)。在Python程序中,大部分时间都是使用%s或fo......
  • Python+QT美颜工具源码
    OverridetheentrypointofanimageIntroducedinGitLabandGitLabRunner9.4.Readmoreaboutthe extendedconfigurationoptions.Beforeexplainingtheav......
  • 【Python】爬虫笔记-ConnectionResetError(10054)
    0x01在对网站图片进行批量爬取的过程中遇到了一个典型问题:requests.exceptions.ConnectionError:('Connectionaborted.',ConnectionResetError(10054,'Anexisting......
  • Python写个“点球大战”小游戏
    大家好,欢迎来到Crossin的编程教室!看过我Python入门教程的朋友应该会看到其中有提到一个点球小游戏的作业。在世界杯决赛即将到来之际,我们再来回顾一下这个小游戏。......