<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>坐标点进行连线</title>
<style>
canvas{
border: 1px solid red;
}
</style>
</head>
<body>
<!-- 将今天绘制的坐标点进行连线 -->
<canvas width="600" height="400" id="canvas"></canvas>
</body>
<script>
var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d');
var padding = 30;
var arrowHeight = 20,
arrowWidth = 10;
var x0 = padding,
y0 = canvas.height - padding;
var maxX = canvas.width - padding*2 -arrowHeight,
maxY = canvas.height - padding*2 - arrowHeight;
//绘制坐标轴
//X轴
ctx.moveTo(x0,y0);
ctx.lineTo(x0,y0 - maxY-arrowHeight);
//Y轴
ctx.moveTo(x0,y0);
ctx.lineTo(x0 + maxX +arrowHeight,y0);
ctx.stroke();
//绘制箭头
//X轴
ctx.beginPath();
ctx.moveTo(x0+maxX+arrowHeight,y0);
ctx.lineTo(x0+maxX,y0-arrowWidth*0.5);
ctx.lineTo(x0+maxX+arrowHeight*0.5,y0);
ctx.lineTo(x0+maxX,y0+arrowWidth*0.5);
//Y轴
ctx.moveTo(x0,y0-maxY-arrowHeight);
ctx.lineTo(x0-arrowWidth*0.5,y0-maxY);
ctx.lineTo(x0,y0-maxY-arrowHeight*0.5);
ctx.lineTo(x0+arrowWidth*0.5,y0-maxY);
ctx.fill();
//绘制点
ctx.beginPath();
var data = [ [ 10, 20 ], [ 15, 13 ], [ 17, 30 ], [ 30, 10 ], [ 20, 15 ] ];
//取点的数据
/*将其中X与Y的最大值找出来,因为要做一个比例的转化:
点坐标/max点坐标 = 页面上点坐标/canvas的轴的最大值*/
var pointX = Math.max.apply(null,data.map(function(v){return v[0];}));
var pointY = Math.max.apply(null,data.map(function(v){return v[1];}));
//法一:使用冒泡排序
for(var i =0;i<data.length-1;i++){
for(var j =0;j<data.length-1-i;j++){
if(data[j][0]>data[j+1][0]){
var temp = data[j +1];
data[j+1] = data[j];
data[j] = temp;
}
}
}
//声明一个新数组用于存储数据
var arr = [];
for(var i = 0 ; i < data.length ; i++){
var tempX = data[i][0]/pointX*maxX,
tempY = data[i][1]/pointY*maxY;
//一定要记得坐标的最后一步转换
var X = x0 + tempX,
Y = y0 - tempY;
arr.push([X,Y]);
ctx.moveTo(X-4,Y-4);
ctx.lineTo(X-4,Y+4);
ctx.lineTo(X+4,Y+4);
ctx.lineTo(X+4,Y-4);
}
console.log(arr);
ctx.fill();
//画线
ctx.beginPath();
//比较值,优化直线
arr.forEach(function(v,i){
ctx[['moveTo','lineTo'][i>0?1:0]](v[0],v[1]);
})
/*for(var i = 0 ; i < data.length-1 ; i++){
var tempX = data[i][0]/pointX*maxX,
tempY = data[i][1]/pointY*maxY;
var tempX1 = data[i+1][0]/pointX*maxX,
tempY1 = data[i+1][1]/pointY*maxY;
//一定要记得坐标的最后一步转换
var X = x0 + tempX,
Y = y0 - tempY,
X1 = x0 + tempX1,
Y1 = y0 - tempY1;
ctx.moveTo(X,Y);
ctx.lineTo(X1,Y1);
}*/
ctx.stroke();
</script>
</html>

使用canvas来绘制折线图的更多相关文章

  1. canvas+js绘制折线图

    效果: 源码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...

  2. canvas学习之折线图

    接着上一张柱状图讲,我们是使用折线图: import {canvasPoint} from '../../assets/js/canvas';import {basicInfo,histogramMo ...

  3. 用canvas绘制折线图

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. Android自己定义组件系列【9】——Canvas绘制折线图

    有时候我们在项目中会遇到使用折线图等图形,Android的开源项目中为我们提供了非常多插件,可是非常多时候我们须要依据详细项目自己定义这些图表,这一篇文章我们一起来看看怎样在Android中使用Can ...

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

    目录 一. 任务说明 二. 重点提示 三. 示例代码 3.1 一般折线图 3.2 用贝塞尔曲线绘制平滑折线图 四. 大数据量场景 示例代码托管在:https://github.com/dashnowo ...

  6. Android自定义控件 -Canvas绘制折线图(实现动态报表效果)

    有时候我们在项目中会遇到使用折线图等图形,Android的开源项目中为我们提供了很多插件,但是很多时候我们需要根据具体项目自定义这些图表,这一篇文章我们一起来看看如何在Android中使用Canvas ...

  7. Android自定义组件系列【9】——Canvas绘制折线图

    有时候我们在项目中会遇到使用折线图等图形,Android的开源项目中为我们提供了很多插件,但是很多时候我们需要根据具体项目自定义这些图表,这一篇文章我们一起来看看如何在Android中使用Canvas ...

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

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

  9. 【Canvas】(2)---绘制折线图

    绘制折线图 之前在工作的时候,用过百度的ECharts绘制折线图,上手很简单,这里通过canvas绘制一个简单的折线图.这里将一整个绘制过程分为几个步骤: 1.绘制网格 2.绘制坐标系 3.绘制点 4 ...

随机推荐

  1. 50行代码实现python计算器主要功能

    实现功能:计算带有括号和四则运算的式子   3*( 4+ 50 )-(( 100 + 40 )*5/2- 3*2* 2/4+9)*((( 3 + 4)-4)-4) 基本思路:使用正则表达式提取出每一层 ...

  2. python学习之路---day03

    一:数据类型转换 1:bool-->int 将bool转成 int型 True 是1 False是0 a=True c=int(a) print(c) b=False d=int(b) prin ...

  3. WPF 一 概述

    创建一个项目吧 菜单>文件>新建>项目 看一看目录结构 WPF应用程序”会在“引用”里面自动添加下图中所示的 PresentationCore.PresentationFramewo ...

  4. ZOJ - 2676 01分数规划 浮点ISAP

    题意:求最小割集\(C\),使得\(\frac{\sum_{i∈C} cost_i}{|C|}\)最小 模型就是01分数规划\(\frac{\sum_{i=1}^{m}cost_i*x}{\sum_{ ...

  5. 自动生成缓存Key值的CacheKeyHelper

    /// <summary> /// CacheKeyHelper /// </summary> public class CacheKeyHelper { /// <su ...

  6. java - list 报java.lang.UnsupportedOperationException

    情景 现在有个数组,比如:String[]  array = new String[]{"1","2","3"}; 我们想要往这个数组中添加 ...

  7. 2019.3.25 SQL语句(进阶篇1)

    运算符 基本的加减乘除取余都可以在SQL中使用 新建Employee1表并添加数据 create table Employee1 (eid int primary key auto_increment ...

  8. ubuntu中安装kernel-devel

    kernel-devel is a RedHat and derivatives package. In Ubuntu you may need to install the linux-kernel ...

  9. Macbook使用Gitlab配置SSH Key

    git是分布式代码管理工具,远程代码管理是基于ssh的,代码上传大搜gitlab或者github代码仓储时,需要进行ssh配置. 把本地代码上传到服务器时需要加密处理,git中公钥(id_rsa.pu ...

  10. spark SQL编程

    1.编程实现将 RDD 转换为 DataFrame源文件内容如下(包含 id,name,age): 1,Ella,362,Bob,293,Jack,29 请将数据复制保存到 Linux 系统中,命名为 ...