python绘制雷达数据图,怎么用python画动态雷达图

  python绘制雷达数据图,怎么用python画动态雷达图

  大家好,本文主要讲用python绘制极地雷达图。有兴趣的同学过来看看,如果对你有帮助记得收藏。

  00-1010多代理雷达图的绘制代码和分析图概述以及多个单代理雷达图的绘制

  

目录

  Python的matplotlib图片库非常强大,可以绘制很多种图片,包括我们日常生活中遇到的雷达图。

  雷达图也叫网络图、蜘蛛图、星图等。这是一个不规则的多边形。雷达可以形象的展现同一事物的多维指标,应用场景很多,比如这个博客,用来展现玩家不同能力的差异。

  Plotlib库中的雷达图绘制基于极坐标,因此所有数据和标签都必须根据角度计算位置。

  本博客将详细讲解绘制雷达图过程中各个函数方法的思路、流程和详细分析。如有不正确之处,请指正~

  

综述

  

绘图代码和解析

  所谓多主体雷达地图,就是将多个多边形组成的属性地图显示在一张地图上,形成直观的对比。

  预处理

  对应的包好,然后解决中文和符号显示问题,设置默认字体,修改画图风格;

  加载数据集(这里我的数据集来源:一个绿色足球app),从字典中提取键和值,分别保存在标签和分数中。

  将numpy作为np导入

  将matplotlib.pyplot作为plt导入

  PLT . RC params[ font . sans-serif ]=[ Kaiti ]#指定默认字体

  PLT . RC params[ axes . unicode _ MINUS ]=false #解决保存的图像显示为带负号-的正方形的问题

  Plt.style.use(ggplot) #设置ggplot的主题样式

  #原始数据集并获取数据集长度

  成绩=[{ 速度 3360 68,投篮 3360 91,传球 3360 83,运球 3360 83,防守 3360 47,力量 3360 82},

  { 速度 3360 88,投篮 3360 87,传球 3360 82,运球 3360 86,防守 3360 42,力量 3360 69},

  { 速度 3360 58,投篮 3360 55,传球 3360 70,运球 3360 67,防守 3360 86,力量 3360 77}]

  data_length=len(结果[0])

  #将极坐标按数据长度等分,形成角度列表。

  angles=np.linspace(0,2 * np.pi,data_length,endpoint=False)

  #分隔属性字段和数据

  labels=[key for key in results[0]。keys()]

  score=[[v for v in result . values()]for results]

  封闭雷达图

  因为我们画的图是一个封闭的多边形,而且我们提取的分数、标签、角度这些数据的每一项都不是首尾相连的,所以我们需要复制每个列表的第一项,然后添加到列表的末尾。

  angles=np.concatenate((angles,[angles[0]]))

  labels=np.concatenate((标签,[标签[0]]))

  score_Harry=np.concatenate((分数[0],[分数[0][0]]))

  score_Son=np.concatenate((分数[1],[分数[1][0]]))

  score _鸢=np.concatenate((分数[2],[分数[2][0]]))

  在这里,因为我得到了三个球员的数据,所以有三个比分数据。

  我来提一下np.concatenate函数,这是一个在numpy库中合并多个数组的函数。参数格式为:Concatenate ((ARR1,ARR2,ARR3),axis=0)。要合并的数组在第一个括号里,可以填入任意数字。第二个轴参数与合并方法有关,不使用就不在这里赘述了。

  rong>绘制图像

  绘制图像基本跟绘制条形图的步骤差不多,有几个可以注意的点:

  plot函数中,绘制条形图是按照横坐标-纵坐标来填写第一和第二个参数的,由于我们雷达图是基于极坐标的,matplotlib也很智能的提供了角度-半径的极坐标参数填写方式;

  plot中的颜色只管边框颜色,fill函数中的颜色是填充颜色,可以自由组合追求美观;

  fill函数中的alpha参数指的是覆盖区的透明度,越小表示越透明,区间0-1;

  plt.legend图例函数中的loc,是描述图例位置的

  代码如下:

  

# 设置图形的大小

  fig = plt.figure(figsize=(8, 6), dpi=100)

  # 新建一个子图

  ax = plt.subplot(111, polar=True)

  # 绘制雷达图并填充颜色

  ax.plot(angles, score_Harry, color=orange)

  ax.fill(angles, score_Harry, y, alpha=0.4)

  ax.plot(angles, score_Son, color=b)

  ax.fill(angles, score_Son, cyan, alpha=0.4)

  ax.plot(angles, score_Tobi, color=r)

  ax.fill(angles, score_Tobi, salmon, alpha=0.4)

  # 设置雷达图中每一项的标签显示

  ax.set_thetagrids(angles * 180 / np.pi, labels, fontsize=15)

  ax.set_theta_zero_location(E) # 设置0度坐标轴起始位置,东西南北

  ax.set_rlim(0, 100) # 设置雷达图的坐标刻度范围

  ax.set_rlabel_position(270) # 设置雷达图的坐标值显示角度,相对于起始角度的偏移量

  ax.set_title("热刺球员能力对比图")

  plt.legend(["哈里·凯恩", "孙兴愍", "托比"], loc=lower left)

  plt.show()

  

  完整代码:

  

import numpy as np

  import matplotlib.pyplot as plt

  # 解决中文显示问题

  plt.rcParams[font.sans-serif] = [KaiTi] # 指定默认字体

  plt.rcParams[axes.unicode_minus] = False # 解决保存图像是负号-显示为方块的问题

  plt.style.use(ggplot) # 设置ggplot样式

  # 原始数据集并获取数据集长度

  results = [{"速度": 68, "射门": 91, "传球": 83, "盘带": 83, "防守": 47, "力量": 82},

   {"速度": 88, "射门": 87, "传球": 82, "盘带": 86, "防守": 42, "力量": 69},

   {"速度": 58, "射门": 55, "传球": 70, "盘带": 67, "防守": 86, "力量": 77}]

  data_length = len(results[0])

  angles = np.linspace(0, 2 * np.pi, data_length, endpoint=False) # 将极坐标根据数据长度进行等分

  # 分离属性字段和数据

  labels = [key for key in results[0].keys()]

  score = [[v for v in result.values()] for result in results]

  # 使雷达图数据封闭

  angles = np.concatenate((angles, [angles[0]]))

  labels = np.concatenate((labels, [labels[0]]))

  score_Harry = np.concatenate((score[0], [score[0][0]]))

  score_Son = np.concatenate((score[1], [score[1][0]]))

  score_Tobi = np.concatenate((score[2], [score[2][0]]))

  # 设置图形的大小

  fig = plt.figure(figsize=(8, 6), dpi=100)

  # 新建一个子图

  ax = plt.subplot(111, polar=True)

  # 绘制雷达图并填充颜色

  ax.plot(angles, score_Harry, color=orange)

  ax.fill(angles, score_Harry, y, alpha=0.4)

  ax.plot(angles, score_Son, color=b)

  ax.fill(angles, score_Son, cyan, alpha=0.4)

  ax.plot(angles, score_Tobi, color=r)

  ax.fill(angles, score_Tobi, salmon, alpha=0.4)

  # 设置雷达图中每一项的标签显示

  ax.set_thetagrids(angles * 180 / np.pi, labels, fontsize=15)

  ax.set_theta_zero_location(E) # 设置0度坐标轴起始位置,东西南北

  ax.set_rlim(0, 100) # 设置雷达图的坐标刻度范围

  ax.set_rlabel_position(270) # 设置雷达图的坐标值显示角度,相对于起始角度的偏移量

  ax.set_title("热刺球员能力对比图")

  plt.legend(["哈里·凯恩", "孙兴愍", "托比"], loc=lower left)

  plt.show()

  

  最后得到的雷达图:

  

  还是挺好看的(?)

  

  

绘制多张单主体雷达图

  数据处理部分跟上面一样,我们直接从画图讲起。

  建立子图

  首先我们用plt.figure绘制好基本画布之后,需要建立三个子图(因为有三个球员):

  

ax1 = plt.subplot(131, polar=True)

  ax2 = plt.subplot(132, polar=True)

  ax3 = plt.subplot(133, polar=True)

  

  我们把整个画布看作一个矩阵,有m行n列;

  第一个参数是一个三位数,第一位表示该子图在整个画布的行位置,1表示总共把画布划分为1行;第二位表示列,3表示总共把画布划分为3列;第三个表示索引值,指的是具体的位置,按照从上到下从左到右排列,比如在一个2*2的画布中,索引值为3表示在第二行第一个;

  循环遍历画每个子图

  首先把画图用的子图、数据、标签、颜色都用列表存起来,方便遍历;

  遍历每一个子图:

  首先画角度坐标轴和框线,’-.'表示框线的样式是有一个小线段加一个点组成,lw是linewidth的缩写,表示线的粗细;

  先绘制沿半径方向的等值线,再绘制角度轴;

  绘图并填充颜色,跟上面一样;

  标出数据下标,ha和va是调整水平和垂直方向的位置

  最后调整labels、坐标值范围等参数

  

ax, data, name, color = [ax1, ax2, ax3], [score_Harry, score_Son, score_Tobi], ["哈里·凯恩", "孙兴愍", "托比"], ["orange", "cyan", "green"]

  for i in range(3):

   # 绘制角度轴和框线

   for j in np.arange(0, 100+20, 20):

   ax[i].plot(angles, 7*[j], -., lw=0.5, color=black) # 沿半径方向的等值线

   for j in range(5):

   ax[i].plot([angles[j], angles[j]], [0, 100], -., lw=0.5, color=black) # 绘制角度轴

   # 绘制图像并填充颜色

   ax[i].plot(angles, data[i], color=color[i])

   ax[i].fill(angles, data[i], color=color[i], alpha=0.4)

   # 数据下标

   for a, b in zip(angles, data[i]):

   ax[i].text(a, b+5, %.00f % b, ha=center, va=center, fontsize=10, color=black)

   # 参数设置

   ax[i].set_thetagrids(angles*180/np.pi, labels)

   ax[i].set_theta_zero_location(N)

   ax[i].set_rlim(0, 100)

   ax[i].set_rlabel_position(0)

   ax[i].set_title(name[i])

  

  最后得到效果(个人审美有限,不喜勿喷):

  

  总体来说,强大的matplotlib + 灵活运用代码 + 美化 = 一幅好看的雷达图~

  

  

总结

  到此这篇关于用python绘制极坐标雷达图的文章就介绍到这了,更多相关python坐标雷达图内容请搜索盛行IT软件开发工作室以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT软件开发工作室!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: