目录

  • 一. 任务说明
  • 二. 重点提示
  • 三. 示例代码

示例代码托管在:http://www.github.com/dashnowords/blogs

博客园地址:《大史住在大前端》原创博文目录

华为云社区地址:【你要的前端打怪升级指南】

一. 任务说明

使用原生canvasAPI绘制雷达图。(截图以及数据来自于百度Echarts官方示例库【查看示例链接】)。

二. 重点提示

雷达图绘制的看起来并不复杂,无非就是一些路径点的连线,其中的难点都在于一些细节。

  1. 坐标转换

    为了避免在绘制过程中不断根据夹角来计算某个数据点的坐标,我们可以让坐标系先移动到绘图中心,然后在绘制过程中逐步旋转并使用context.lineTo(x,y)来连线即可,这样做的好处是很明显的。比如在绘制背景六边形的时候,每次旋转后,路径点压根就不需要移动,直接在循环中每次都调用context.lineTo( )方法连线至同一个数据点即可,看起来位移没有变,实际上随着坐标系的旋转,连线绕过的是多边形的轨迹。

  2. 文字的对齐

    为了让文字保持正常的方向,我们需要将坐标系的旋转恢复到初始状态再进行绘制。绘制的过程中可以根据绘制点和中心连线相对于x轴的角度来动态修改其绘制时的相对点(left,right,center),否则就会出现下图的结果,也就是文字区域的中心到图形中心的距离的确是一致的,但这并不是我们想要的效果。

  1. canvas坐标系

    请时刻记得canvas坐标系的初始方向是x轴向右,y轴向下,和普通笛卡尔坐标系是不一样的,尤其是在旋转角度和坐标计算的时候,很容易出现和预期角度不相符的结果。

三. 示例代码

//options数据来自于百度Echarts官方示例库
start(options);/*** 绘制图表*/
function start(options) {drawBg(options);drawData(options);//绘制雷达图drawText(options);//绘制文字
}function drawBg(options) {let length = options.radar.indicator.length;let angleStep = -2 * Math.PI / length;context.strokeStyle="#b2b2b2";context.lineWidth = 1;//调整坐标系//移动中心点context.translate(500,300);//将x轴旋转至竖直向上context.rotate(-90 * 2 * Math.PI / 360);//每次以不同旋转半径绘制多个由大到小的图形for(let r = 200; r > 0 ; r -=40){//移动至第一个绘图点context.save();context.beginPath();context.moveTo(r,0);//转动坐标系绘制所有点for(let i = 0; i < length; i++){context.rotate(angleStep);context.lineTo(r,0);}context.closePath();context.stroke();//明暗色替换填充,此处从大到小切换颜色覆盖式绘制即可context.fillStyle = Math.round(r / 40) % 2 ? 'white':'#eaeaea';context.fill();context.restore();}
}/*** 绘制数据*/
function drawData(options) {//解构赋值拿到数据关键点let {radar:{indicator:indicators},series:[{data:data}]} = options;let colors = ['#c43e3a','#364c5a'];let length = indicators.length;let angleStep = -2 * Math.PI / length;for(let i = 0; i < data.length; i++){context.save();context.beginPath();context.moveTo(200 * data[i].value[0] / indicators[0].max,0);//遍历每组数据for(let j = 1; j < data[i].value.length; j++){context.rotate(angleStep);context.lineTo(200 * data[i].value[j] / indicators[j].max,0);}context.restore();context.lineTo(200 * data[i].value[0] / indicators[0].max,0);context.strokeStyle = colors[i];context.lineWidth = 2;context.stroke();}context.restore();
}//绘制文字
function drawText(options) {let {radar:{indicator:indicators}} = options;let length = indicators.length;let angleStep = 2 * Math.PI / length;let r = 220;context.fillStyle = 'black';context.font = "14px bold 黑体";context.textAlign = 'center';context.rotate(90 * Math.PI * 2 / 360);for(let i = 0; i < indicators.length; i++){let curAngle = -90*2*Math.PI/360 - angleStep*i;//根据方向调整文字的对齐点let cos = Math.cos(curAngle);if (Math.abs(cos) < 10e-4) {context.textAlign = 'center';}else if(cos > 0){context.textAlign = 'left';}else{context.textAlign = 'right';}console.log(indicators[i].name, Math.cos(curAngle))context.fillText(indicators[i].name, r * Math.cos(curAngle), r * Math.sin(curAngle));}
}

浏览器中可查看效果:

百度Echarts官方示例库中有这样一个雷达图的示例,展示了在雷达图上表现时间维度的示例,感兴趣的读者可以自行查看。

转载于:https://www.cnblogs.com/dashnowords/p/10656750.html

【带着canvas去流浪(6)】绘制雷达图相关推荐

  1. echarts 雷达图_【带着canvas去流浪】绘制雷达图

    使用原生canvasAPI绘制雷达图.(截图以及数据来自于百度Echarts官方示例库[查看示例链接]). 二. 重点提示 雷达图绘制的看起来并不复杂,无非就是一些路径点的连线,其中的难点都在于一些细 ...

  2. 带着canvas去流浪系列之二 绘制折线图

    [摘要] 用canvasAPI实现echarts简易图表 示例代码托管在:http://www.github.com/dashnowords/blogs 一. 任务说明 使用原生canvasAPI绘制 ...

  3. 带着canvas去流浪系列之六 绘制雷达图

    [摘要] 用canvas原生API实现百度Echarts基本图表. 示例代码托管在:http://www.github.com/dashnowords/blogs 一. 任务说明 使用原生canvas ...

  4. 带着canvas去流浪系列之七 绘制水球图

    [摘要] 用原生canvasAPI实现百度echarts 示例代码托管在:http://www.github.com/dashnowords/blogs 一. 任务说明 使用原生canvasAPI绘制 ...

  5. 带着canvas去流浪系列之五 绘制K线图

    [摘要] 用canvas原生API实现百度Echarts 示例代码托管在:http://www.github.com/dashnowords/blogs 一. 任务说明 使用原生canvasAPI绘制 ...

  6. 【带着canvas去流浪(5)】绘制K线图

    目录 一. 任务说明 二. 重点提示 三. 示例代码 示例代码托管在:http://www.github.com/dashnowords/blogs 博客园地址:<大史住在大前端>原创博文 ...

  7. 带着canvas去流浪系列之四 绘制散点图

    [摘要] 用原生canvasAPI实现百度Echarts图表 示例代码托管在:http://www.github.com/dashnowords/blogs 一. 任务说明 使用原生canvasAPI ...

  8. 带着canvas去流浪系列之一:绘制柱状图

    [摘要] 学习使用canvasAPI来实现数据可视化. 示例代码托管在:http://www.github.com/dashnowords/blogs 一. 任务说明 使用原生canvasAPI绘制柱 ...

  9. 【带着canvas去流浪】 (3)绘制饼图

    目录 一. 任务说明 二. 重点提示 三. 示例代码 四. hover高亮的实现思路 示例代码托管在:http://www.github.com/dashnowords/blogs 博客园地址:< ...

最新文章

  1. php读取文件内容不全,php读取文件内容的三种方法
  2. 网页中英文语言切换解决方案
  3. Error: SyntaxError: DOM Exception 12 ...
  4. python简单爬虫程序分析_[Python专题学习]-python开发简单爬虫
  5. 进程间通信 IPC 的本地过程调用 LPC(Local Procedure Call)和远程过程调用 RPC(Remote Procedure Call)
  6. VMware Vix API 操作虚拟机
  7. ajax数据交互代码,Django中使用jquery的ajax进行数据交互的实例代码
  8. stream().map().collect()用法
  9. 下一个十年,什么样的测试会被大厂争抢?
  10. 【特别版】计算机哲学对学习生活借鉴的几个例子
  11. iOS用户体验之-modal上下文
  12. 2020-10-13
  13. 利用CSS3实现鼠标悬停在图片上图片缓慢缩放的两种方法
  14. 《华为工作法》6 华为的成功不是一个人的
  15. python关键词占比_搜索关键词占比
  16. 百度收录提交 网站快速收录提交方法【附工具】
  17. 计算机是什么信号转换为什么信号,模拟信号转化为数字信号的原理是什么
  18. js执行机制经典面试题(一)
  19. 笔记本启动显示0xc000014c错误--提示缺失win10/system32内部文件
  20. linux操作mysql数据库

热门文章

  1. 通过cordova将vue项目打包成app
  2. cmd 命令提示符常用操作
  3. CVE-2012-4792Microsoft Internet Explorer 释放后使用漏洞
  4. volley三种基本请求图片的方式与Lru的基本使用:正常的加载+含有Lru缓存的加载+Volley控件networkImageview的使用...
  5. Python -- 大小写转换
  6. Ceph rbd cmd练习
  7. Win32 SDK消息处理技巧
  8. 模拟登录新浪微博(Python)
  9. 3dMax-win-64bit软件的安装-配置
  10. CWinApp的应用与理解