极致呈现系列之:Echarts雷达图的魅力与价值

news2024/11/28 14:33:29

目录

  • 什么是雷达图
  • vue3中引入雷达图
  • 绘制简单的雷达图
  • 雷达图的数据处理
    • 什么是数据归一化处理
    • 对chartData的数据进行归一化
    • 将归一化后的数据应用到雷达图中
  • 美化雷达图

什么是雷达图

雷达图是一种基于极坐标系的可视化图表,用于展示多维数据之间的关系。它通过设置不同的角度和半径来表示不同的指标数据,可以直观地展示数据之间的差异和联系。

vue3中引入雷达图

这个就不多说了,都是前期的准备工作,这里直接看代码吧,有不了解的小伙伴可以看我前面的文章。

  1. 安装Echarts
npm install echarts --save
  1. 引入Echarts
import * as echarts from 'echarts';
  1. 在vue中新建RadarChart.vue文件,并在该文件下的模板中新建一个div
<div ref="chart" style="width: 50%;height: 400px;"></div>
  1. 定义一个数组,存放数据
const chartData = [
  { name: '指标一', value: 80 },
  { name: '指标二', value: 90 },
  { name: '指标三', value: 70 },
  { name: '指标四', value: 60 },
  { name: '指标五', value: 50 }
];
  1. 导入vue3的组合式API
import { ref, onMounted } from 'vue'
const chart = ref(null)

前期的工作准备好了,接下来我们就开始绘制雷达图

绘制简单的雷达图

首先我们定义了一个 chartOptions对象,用于设置图表的基本配置,包括标题、图例、坐标轴和数据系列等信息;

const chartOptions = {
  title: {
    text: '雷达图示例'
  },
  tooltip: {},
  legend: {
    data: ['数据']
  },
  radar: {
    indicator: chartData.map(item => ({ name: item.name, max: 100 })),
    radius: '70%',
    center: ['50%', '50%']
  },
  series: [{
    name: '数据',
    type: 'radar',
    data: [
      {
        value: chartData.map(item => item.value),
        name: '数据'
      }
    ]
  }]
};

在这个配置项里,我们配置了标题title,提示框tooltip,图例legend,雷达图的配置项radar和系列配置项series。

其中,在radar配置项中,我们前面定义的chartData数组中的数据通过数组的map函数获取到数组对象中的name,作为指示器配置给radar的indicator属性;radius指定雷达图的半径,center指定雷达图的位置

在series配置项中,我们将前面定义的chartData数组中数据通过map函数获取里面的value值,将其配置给series配置data下的value属性,这样就完成了简单的配置

然后,我们在onMounted函数中,通过echarts的init函数将我们模板中定义的div作为容器传递给Echarts的实例myChart

调用Echarts的setOption函数,将上面定义的配置项传入到myChart实例中
代码如下:

onMounted(() => {
  const myChart = echarts.init(chart.value) 
  myChart.setOption(chartOptions);
})

运行程序,刷新浏览器,可以看到,雷达图已经呈现出来了
在这里插入图片描述

雷达图的数据处理

在实际的项目开发中,我们绘制的雷达图往往比较复杂,这就需要我们先对数据进行一些处理,例如对数据进行归一化处理、设置不同的数据范围等。下面我们对上面实现的雷达图的数据进行归一化处理。

什么是数据归一化处理

数据归一化处理是将不同数据的取值范围映射到相同的区间内,以便进行比较和分析。在数据处理中,由于不同数据的取值范围可能相差较大,这会导致某些指标的权重过大或过小,从而影响分析结果的准确性。通过数据归一化处理,可以消除这种影响,使得不同指标的权重更加均衡,从而提高分析的准确性。常见的归一化方法包括最小-最大归一化、Z-score 归一化等。

最小-最大归一化(Min-Max Normalization)是一种简单的线性归一化方法,它将原始数据映射到一个指定的值域范围内(通常是 [0,1] 或 [-1,1] 区间内),公式为:

x ′ = x − min ⁡ ( x ) max ⁡ ( x ) − min ⁡ ( x ) × ( m a x − m i n ) + m i n x' = \frac{x - \min(x)}{\max(x) - \min(x)} \times (max - min) + min x=max(x)min(x)xmin(x)×(maxmin)+min

其中, x x x 是原始数据, x ′ x' x 是归一化后的数据, min ⁡ ( x ) \min(x) min(x) max ⁡ ( x ) \max(x) max(x) 分别是原始数据的最小值和最大值, m i n min min m a x max max 分别是指定的值域范围的最小值和最大值。

Z-score 归一化(Standardization)是一种基于原始数据的均值和标准差进行归一化的方法,它将原始数据映射到均值为 0,标准差为 1 的分布上,公式为:

x ′ = x − μ σ x' = \frac{x - \mu}{\sigma} x=σxμ

其中, x x x 是原始数据, x ′ x' x 是归一化后的数据, μ \mu μ 是原始数据的均值, σ \sigma σ 是原始数据的标准差。

最小-最大归一化适用于数据取值范围已知的情况下,可以将数据映射到指定的值域范围内,方便进行比较和分析。而 Z-score 归一化则适用于数据分布未知的情况下,可以将数据映射到均值为 0,标准差为 1 的分布上,方便进行比较和分析。

对chartData的数据进行归一化

要对chartData中的数据进行归一化,我们使用上面介绍的最小-最大归一化方法,首先计算出chartData数组中的最大值,并将每个数据项的值除以最大值后乘以 100,从而得到归一化后的数据。然后,我们使用归一化后的数据绘制雷达图。
代码如下:

const maxDataValue = Math.max(...chartData.map(item => item.value));

const normalizedChartData = chartData.map(item => ({
  name: item.name,
  value: item.value / maxDataValue * 100
}));

将归一化后的数据应用到雷达图中

将我们上面计算的归一化后的数据normalizedChartData 替换掉我们在Echarts配置项中的chartData数据

const chartOptions = {
  title: {
    text: '雷达图示例'
  },
  tooltip: {},
  legend: {
    data: ['数据']
  },
  radar: {
    indicator: normalizedChartData.map(item => ({ name: item.name, max: 100 })),
    radius: '70%',
    center: ['50%', '50%']
  },
  series: [{
    name: '数据',
    type: 'radar',
    data: [
      {
        value: normalizedChartData.map(item => item.value),
        name: '数据'
      }
    ]
  }]
};

这样我们就得到了归一化后的数据图表
在这里插入图片描述

美化雷达图

前面我们已经实现了雷达图,但是这个雷达图看起来效果平平,很难吸引人的眼球,下面我从背景色,填充色、透明度、系列样式、雷达图的填充颜色和边框颜色等方面进行优化

const chartOptions = { 
  color: ['#000'],
  backgroundColor: {
    type: 'radial',
    x: 0.4,
    y: 0.4,
    r: 0.35,
    colorStops: [{
      offset: 0,
      color: '#895355' // 0% 处的颜色
    }, {
      offset: .4,
      color: '#593640' // 100% 处的颜色
    }, {
      offset: 1,
      color: '#39273d' // 100% 处的颜色
    }],
    globalCoord: false // 缺省为 false
  },
  title: {
    text: '雷达图示例',
    textStyle:{
      color:'#fff'
    }
  },
  tooltip: {},
  legend: {
    data: ['数据'],
    textStyle:{
      color:'#fff'
    }
  },
  radar: {
    indicator: normalizedChartData.map(item => ({ name: item.name, max: 100 })),
    radius: '70%',
    center: ['50%', '50%'],
    splitArea: {
      areaStyle: {
        color: [
          'rgba(48, 105, 199, .1)',
          'rgba(48, 105, 199, .2)',
          'rgba(48, 105, 199, .4)',
          'rgba(48, 105, 199, .6)',
          'rgba(48, 105, 199, .8)',
          'rgba(48, 105, 199, 1)',
        ].reverse(),
      },
    }, 
    axisLine: {
      //指向外圈文本的分隔线样式
      lineStyle: {
        color: 'rgba(37, 100, 214, 1)',
        width: 2,
      },
    },
    splitLine: {
      lineStyle: {
        width: 2,
        color: 'rgba(37, 100, 214, 1)',
      },
    }, 
  },
  series: [{
    name: '数据',
    type: 'radar',
    symbol: 'circle',
    symbolSize: 10,
    lineStyle: {
      color: "#70EDFC",
      width: 2,
    },
    itemStyle: {
      color: '#ffffff',
      borderColor: "#70EDFC",
      borderWidth: 2,
      opacity: 1,
    },
    data: [
      {
        value: normalizedChartData.map(item => item.value),
        name: '数据',
        itemStyle: { 
            lineStyle: {
              color: 'rgba(112, 237, 252, .5)',
            },
            shadowColor: 'rgba(112, 237, 252, .5)',
            shadowBlur: 1, 
        },
        areaStyle: { 
            color: 'rgba(112, 237, 252, .5)', 
        }, 
      }
    ]
  }]
};

上面代码中,我使用 splitArea 属性设置雷达图的背景,使用 areaStyle属性设置背景的颜色和透明度。然后,使用areaStyle 和 lineStyle属性分别设置雷达图的填充颜色和边框颜色。使用symbol和symbolSize设置雷达图的各个点位圆形。

运行程序,看效果
在这里插入图片描述
好了,关于雷达图的使用就聊到这里,有问题评论区留言

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/646615.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Cross-modal Moment Localization in Videos论文笔记

Cross-modal Moment Localization in Videos论文笔记 0.来源1.摘要2.介绍3.模型3.1语言-时间注意网络3.2损失函数3.2.1对齐损失3.2.2位置损失3.2.2损失函数 4.实验4.1数据集4.2性能比较4.3 ROLE的几种变体 5.未来工作 0.来源 2018年 Cross-modal Moment Localization in Video…

MFC-皮肤颜色集组合界面程序DlgSkinBase

虽然是小程序,编辑的源代码也很少&#xff0c;但其中的编程思想却是大型工程项目的配色经典基础。就如万丈高楼的基础中的钢筋般重要。 或者很多程序员一辈子也难接触到大型项目程序...还是那句话&#xff0c;既然缘分来了&#xff0c;不妨共享出来&#xff0c;希望能对有缘人有…

卖课软文怎么写,揭秘知识付费软文写作技巧

随着互联网的发展&#xff0c;知识付费已经成为了一种趋势。越来越多的人开始关注自我提升和职业发展&#xff0c;而知识付费也成为了他们获取知识和技能的重要途径。在这个背景下&#xff0c;卖课软文也成为了知识付费领域一种重要的推广方式。本文伯乐网络传媒将为大家揭秘卖…

hadoop本地化windows部署

文章目录 前言1. hadoop on windows1.1 安装jdk1.2 安装hadoop1.2.1 解压1.2.2 备用目录1.2.3 修改配置1.2.4 安装winutils-master1.2.5 格式化namenode1.2.6 启动hadoop1.2.7 web-ui登陆hadoop hdfs 2. spark on windows2.1 安装scala2.2 安装spark2.2.1 解压2.2.2 环境变量2.…

2年点工月薪10k,自学自动化年薪突破30W

我是农村出生的家庭&#xff0c;经济并不富裕&#xff0c;一个人奔波在大城市&#xff0c;总是很自卑。那段时间父亲身体不好&#xff0c;家里打电话说要花很多钱&#xff0c;于是我辞掉了一个月薪7k的功能测试&#xff0c;去了一个电子厂&#xff0c;每天加班加满月薪也能拿到…

【SpringCloud-3】Hystrix熔断器

通常情况下&#xff0c;一个请求可能会调用很多个服务。 如果下游某个服务异常&#xff0c;不能正常返回结果&#xff0c;导致上游所有服务等待&#xff0c;最终可能导致大量服务资源耗尽&#xff0c;造成雪崩。 说简单点&#xff0c;撸代码时&#xff0c;一定要保护好自己的服…

【vue3】vue3组件通信方式

一、props 可以实现父子组件通信&#xff0c;子组件通过defineProps获取父组件传递的数据&#xff0c;且在子组件内部不需要引入defineProps方法就可以直接使用&#xff01; 1、父组件给子组件传递数据 <Child hobby"学习" :money"money"></Chil…

Sui Builder House首尔站精彩集锦

6月3–4日&#xff0c;超过400人参加了Sui Builder House首尔站活动&#xff0c;近距离地了解了Sui网络的最新情况和路线图中提供的相关计划。作为主网推出后的第一个Builder House活动&#xff0c;参与者在现场体验了Sui的实现。 此次活动在首尔江南区举行&#xff0c;共设有…

分享一个玉质按钮

先看效果&#xff1a; 再看代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><style>* {-webkit-box-sizing: border-box;-moz-box-sizing: border-box;bo…

SpringBoot用线程池ThreadPoolExecutor处理百万级数据

SpringBoot用线程池ThreadPoolExecutor处理百万级数据 更多优秀文章&#xff0c;请扫码关注个人微信公众号或搜索“程序猿小杨”添加。 一、背景&#xff1a; 使用JDK线程池ThreadPoolExecutor多线程异步执行批量插入、更新等操作方法&#xff0c;提高百万级数据插入效率。 二…

Paper: Attention Is All You Need

目录 Abstract1 Introduction2 Background3 Model Architecture3.1 Encoder and Decoder Stacks3.2 Attention3.2.1 Scaled Dot-Product Attention3.2.2 Multi-Head Attention3.2.3 Applications of Attention in our Model 3.3 Position-wise Feed-Forward Networks3.4 Embedd…

4.4网络模型 4.5协议 4.6网络通信的过程

4.4网络模型 OSI七层参考模型 七层模型&#xff0c;亦称 OSI&#xff08;Open System Interconnection&#xff09;参考模型&#xff0c;即开放式系统互联。参考模型是国际标准化组织&#xff08;ISO&#xff09;制定的一个用于计算机或通信系统间互联的标准体系&#xff0c;…

DDR-SDRAM技术原理总结

DDR SDRAM 全称&#xff1a; Double Date Rate Synchronous Dynamic Random Access Memory 先说RAM&#xff08;Random Access Memory&#xff09;&#xff0c;字面意思&#xff1a;随机访问存储器&#xff0c;其特点是可任意访问一个内存地址&#xff0c;其访问时间是一样的&…

怎样在前端项目中使用MySQL模块操作数据库?

要想在项目中操作数据库&#xff0c; 首先要安装操作 MySQL 数据库的第三方模块(mysql)&#xff0c; 借助mysql 模块连接到 MySQL 数据库&#xff0c; 执行 SQL 语句&#xff0c;具体的流程如下图所示。 安装与配置 mysql 模块 安装 mysql 模块 mysql 模块是托管于 npm 上的第…

继承—JavaSE

文章目录 1.基础知识1.1继承的概念1.2语法 2子类对从父类继承下来的成员的访问2.1对成员变量的访问2.2对成员方法的访问 3.super关键字3.1访问父类的成员变量&#xff08;super.变量&#xff09;3.2访问父类的成员方法&#xff08;super.方法&#xff09;3.3调用父类的构造方法…

手把手教学Android游戏--轮船大战小游戏(文末有代码)

目录 1.1课程设计的目的 1.2本选题的内容要求 1.3 软件开发运行环境 2.1设计思路 2.2软件总体结构图 2.3主要功能模块的设计 3.1 开始界面模块 3.1.1进入游戏设计 3.1.2退出游戏设计 3.1.3开始界面主要代码 3.2 游戏主界面显示模块 3.2.1游戏界面设计 3.2.2游戏界面鱼雷、炸弹、…

【C++---面向对象预备】

C---面向对象预备 一 、内存的分区&#xff1a;1.1 代码区&#xff1a;1.2 全局区&#xff1a;1.3 栈区&#xff1a;1.4 堆区&#xff1a; 二 、引用&#xff1a;2.1、引用注意事项&#xff1a;2.2、引用作函数参数&#xff1a;2.3、引用作函数的返回值&#xff1a;2.4、引用的…

explain | 索引优化的这把绝世好剑,你真的会用吗?

对于互联网公司来说&#xff0c;随着用户量和数据量的不断增加&#xff0c;慢查询是无法避免的问题。 一般情况下如果出现慢查询&#xff0c;意味着接口响应慢、接口超时等问题&#xff0c;如果是高并发的场景&#xff0c;可能会出现数据库连接被占满的情况&#xff0c;直接导…

MAC电脑设置权限

​​​​​​​ click on your background to go to finderclick on go and go to folder /usrright click on local and do get infounlock the lock at the bottomclick sign and add your user to the list and give read/write privilegesclick on the gear sign at the …

Java Map 所有的值转为String类型

可以使用 Java 8 中的 Map.replaceAll() 方法将所有的值转为 String 类型&#xff1a; Map<String, Object> map new HashMap<>(); // 添加一些键值对 map.put("key1", 123); map.put("key2", true); map.put("key3", new Date())…