资讯专栏INFORMATION COLUMN

canvas系列教程05-柱状图项目3

vboy1010 / 827人阅读

摘要:书接上文,我们提前做些准备工作,比如画图前先把坐标边距做出来,还有各种字体大小算出来。

书接上文,我们提前做些准备工作,比如画图前先把坐标边距做出来,还有各种字体大小算出来。

这里需要一点面向对象的知识,

</>复制代码

  1. "use strict";
  2. //模仿 http://echarts.baidu.com/demo.html#bar-gradient
  3. window.onload = function(){
  4. var data = [
  5. {"label":"一月","value":getRandomInt(0,400)},
  6. {"label":"一月","value":getRandomInt(1,400)},
  7. {"label":"一月","value":getRandomInt(1,400)}
  8. ];
  9. var targetId = "bchart";
  10. var cw = 800;
  11. var ch = 600;
  12. function Bcharts(targetId,cw,ch,data){
  13. //基础信息
  14. var c = this;//为啥这么做?我懒,c = chart = this;
  15. c.targetId = targetId;
  16. c.cw = cw;
  17. c.ch = ch;
  18. c.data = data;
  19. //坐标准备,为啥要准备?因为坐标和字体都应该是动态算出来的不能是写死的否则实用性不够
  20. c.axeRadio = 10;//定义一个比例,为啥是10,看图大体是这个随便定的,别忒离谱就好
  21. c.horGap = (cw*axeRadio)/100;
  22. c.verGap = (ch*axeRadio)/100;
  23. //标识准备
  24. c.fontRadio = 3;//原因同上
  25. c.horFontSize = (cw*fontRadio)/100;
  26. c.verFontSize = (ch*fontRadio)/100;
  27. }
  28. var charts = new Bcharts(targetId,cw,ch,data);
  29. };
  30. //https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Math/random
  31. // 偷个懒,基础函数不写了
  32. function getRandomInt(min, max) {
  33. min = Math.ceil(min);
  34. max = Math.floor(max);
  35. return Math.floor(Math.random() * (max - min)) + min; //The maximum is exclusive and the minimum is inclusive
  36. }

说一点,你如果不懂就先按照我写的弄出来,别自己发明创造,写多了你也就知道为什么我这么写了。当然上面这个写法挺恶心的,让我想起了,没有整理过的女生宿舍,

</>复制代码

  1. "use strict";
  2. //模仿 http://echarts.baidu.com/demo.html#bar-gradient
  3. window.onload = function(){
  4. var data = [
  5. {"label":"一月","value":getRandomInt(0,400)},
  6. {"label":"一月","value":getRandomInt(1,400)},
  7. {"label":"一月","value":getRandomInt(1,400)}
  8. ];
  9. var targetId = "bchart";
  10. var cw = 800;
  11. var ch = 600;
  12. function Bcharts(targetId,cw,ch,data){
  13. //基础信息
  14. var c = this;//为啥这么做?我懒,c = chart = this;
  15. c.configureChart(targetId,cw,ch,data);
  16. }
  17. Bcharts.prototype.configureChart = function(targetId,cw,ch,data){
  18. var c = this;
  19. c.setCanvasParameters(targetId,cw,ch,data);
  20. c.setChartParameters(targetId,cw,ch,data);
  21. };
  22. Bcharts.prototype.setCanvasParameters = function(targetId,cw,ch,data){
  23. var c = this;
  24. c.targetId = targetId;
  25. c.cw = cw;
  26. c.ch = ch;
  27. c.data = data;
  28. };
  29. Bcharts.prototype.setChartParameters = function(targetId,cw,ch,data){
  30. var c = this;
  31. c.axeRadio = 10;//定义一个比例,为啥是10,看图大体是这个随便定的,别忒离谱就好
  32. c.horGap = (c.cw*c.axeRadio)/100;
  33. c.verGap = (c.ch*c.axeRadio)/100;
  34. //标识准备
  35. c.fontRadio = 3;//原因同上
  36. c.horFontSize = (c.cw*c.fontRadio)/100;
  37. c.verFontSize = (c.ch*c.fontRadio)/100;
  38. };
  39. var charts = new Bcharts(targetId,cw,ch,data);
  40. };
  41. //https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Math/random
  42. // 偷个懒,基础函数不写了
  43. function getRandomInt(min, max) {
  44. min = Math.ceil(min);
  45. max = Math.floor(max);
  46. return Math.floor(Math.random() * (max - min)) + min; //The maximum is exclusive and the minimum is inclusive
  47. }

忽然感觉就像整理过的女生宿舍有么有,太整齐了!

好,整理好了代码,先怼一个canvas画布进去,这里注意我也用的面向对象方式,定义了一个init函数,注意我把targetId改了一下,之前写错了。

最终代码如下,

</>复制代码

  1. "use strict";
  2. //模仿 http://echarts.baidu.com/demo.html#bar-gradient
  3. window.onload = function(){
  4. var data = [
  5. {"label":"一月","value":getRandomInt(0,400)},
  6. {"label":"一月","value":getRandomInt(1,400)},
  7. {"label":"一月","value":getRandomInt(1,400)}
  8. ];
  9. var targetId = "div1";
  10. var cw = 800;
  11. var ch = 600;
  12. function Bcharts(targetId,cw,ch,data){
  13. //基础信息
  14. var c = this;//为啥这么做?我懒,c = chart = this;
  15. c.configureChart(targetId,cw,ch,data);
  16. c.init();
  17. }
  18. Bcharts.prototype.configureChart = function(targetId,cw,ch,data){
  19. var c = this;
  20. c.setCanvasParameters(targetId,cw,ch,data);
  21. c.setChartParameters(targetId,cw,ch,data);
  22. };
  23. Bcharts.prototype.setCanvasParameters = function(targetId,cw,ch,data){
  24. var c = this;
  25. c.id = targetId;
  26. c.cw = cw;
  27. c.ch = ch;
  28. c.data = data;
  29. };
  30. Bcharts.prototype.setChartParameters = function(targetId,cw,ch,data){
  31. var c = this;
  32. c.axeRadio = 10;//定义一个比例,为啥是10,看图大体是这个随便定的,别忒离谱就好
  33. c.horGap = (c.cw*c.axeRadio)/100;
  34. c.verGap = (c.ch*c.axeRadio)/100;
  35. //标识准备
  36. c.fontRadio = 3;//原因同上
  37. c.horFontSize = (c.cw*c.fontRadio)/100;
  38. c.verFontSize = (c.ch*c.fontRadio)/100;
  39. };
  40. //初始化
  41. Bcharts.prototype.init = function(){
  42. var c = this;
  43. c.createCanvas();
  44. };
  45. Bcharts.prototype.createCanvas = function(){
  46. var c = this;
  47. var canvas = document.createElement("canvas");
  48. canvas.id = c.id + "-" + Math.random();
  49. canvas.width = c.cw;
  50. canvas.height = c.ch;
  51. document.getElementById(c.id).innerHTML = "";
  52. document.getElementById(c.id).appendChild(canvas);
  53. c.canvas = canvas;
  54. c.context = c.canvas.getContext("2d");
  55. };
  56. var charts = new Bcharts(targetId,cw,ch,data);
  57. };
  58. //https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Math/random
  59. // 偷个懒,基础函数不写了
  60. function getRandomInt(min, max) {
  61. min = Math.ceil(min);
  62. max = Math.floor(max);
  63. return Math.floor(Math.random() * (max - min)) + min; //The maximum is exclusive and the minimum is inclusive
  64. }

这里注意,准备canvas完毕我们就准备两个函数一个是后台数据过来处理函数,一个是处理完的数据针对图表重新计算的函数。

</>复制代码

  1. "use strict";
  2. //模仿 http://echarts.baidu.com/demo.html#bar-gradient
  3. window.onload = function(){
  4. var data = [
  5. {"label":"一月","value":getRandomInt(0,400)},
  6. {"label":"二月","value":getRandomInt(1,400)},
  7. {"label":"三月","value":getRandomInt(1,400)}
  8. ];
  9. var targetId = "div1";
  10. var cw = 800;
  11. var ch = 600;
  12. function Bcharts(targetId,cw,ch,data){
  13. //基础信息
  14. var c = this;//为啥这么做?我懒,c = chart = this;
  15. c.configureChart(targetId,cw,ch,data);
  16. c.init();
  17. }
  18. Bcharts.prototype.configureChart = function(targetId,cw,ch,data){
  19. var c = this;
  20. c.setCanvasParameters(targetId,cw,ch,data);
  21. c.setChartParameters(targetId,cw,ch,data);
  22. };
  23. Bcharts.prototype.setCanvasParameters = function(targetId,cw,ch,data){
  24. var c = this;
  25. c.id = targetId;
  26. c.cw = cw;
  27. c.ch = ch;
  28. c.data = data;
  29. };
  30. Bcharts.prototype.setChartParameters = function(targetId,cw,ch,data){
  31. var c = this;
  32. c.axeRadio = 10;//定义一个比例,为啥是10,看图大体是这个随便定的,别忒离谱就好
  33. c.horGap = (c.cw*c.axeRadio)/100;
  34. c.verGap = (c.ch*c.axeRadio)/100;
  35. //标识准备
  36. c.fontRadio = 3;//原因同上
  37. c.horFontSize = (c.cw*c.fontRadio)/100;
  38. c.verFontSize = (c.ch*c.fontRadio)/100;
  39. };
  40. //初始化
  41. Bcharts.prototype.init = function(){
  42. var c = this;
  43. c.createCanvas();
  44. //这里只是把后台给你的数据整理好了,并不是图表直接能画的数据
  45. //比如最大值是234,其实我们要花240,不可能是不整齐的
  46. c.handleData();
  47. //所以需要处理数据
  48. c.prepareData();
  49. console.log(c);
  50. };
  51. Bcharts.prototype.createCanvas = function(){
  52. var c = this;
  53. var canvas = document.createElement("canvas");
  54. canvas.id = c.id + "-" + Math.random();
  55. canvas.width = c.cw;
  56. canvas.height = c.ch;
  57. document.getElementById(c.id).innerHTML = "";
  58. document.getElementById(c.id).appendChild(canvas);
  59. c.canvas = canvas;
  60. c.context = c.canvas.getContext("2d");
  61. };
  62. Bcharts.prototype.handleData = function(){
  63. //因为后台肯定给你标准的数组格式一堆,但是你没法直接用,得自己666一把
  64. var c = this;
  65. c.label = [];//这个数组放循环内容的名字,比如[一月,二月]
  66. c.values = [];//放值[200,45……]
  67. c.data.forEach(function(item){
  68. c.label.push(item.label);
  69. c.values.push(item.value);
  70. });
  71. };
  72. Bcharts.prototype.prepareData = function(){
  73. var c = this;
  74. c.itemNum = c.data.length;
  75. c.MaxValue = Math.max.apply(null,c.values);
  76. c.MinValue = Math.min.apply(null,c.values);
  77. //算坐标宽高
  78. c.horAxiWidth = c.cw - 2*c.horGap;
  79. c.verAxiWidth = c.ch - 2*c.verGap;
  80. //计算最大上边界,比如最大数是234,坐标得到240,而不是234
  81. //确定横竖格子数
  82. c.verBound = Math.ceil(c.MaxValue/10)*10;
  83. c.horFeq = c.verBound/c.itemNum;
  84. c.verFeq = c.horAxiWidth/c.itemNum;
  85. };
  86. var charts = new Bcharts(targetId,cw,ch,data);
  87. };
  88. //https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Math/random
  89. // 偷个懒,基础函数不写了
  90. function getRandomInt(min, max) {
  91. min = Math.ceil(min);
  92. max = Math.floor(max);
  93. return Math.floor(Math.random() * (max - min)) + min; //The maximum is exclusive and the minimum is inclusive
  94. }

其实图表的绘画最难的不是绘画,而是数据的整理,到这一步,基本上最难的就结束了,后面我们开始画,就轻松多了。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/90345.html

相关文章

  • canvas系列教程03-柱状项目1

    摘要:弄了一堆线方块和函数,感觉挺玄乎,然并卵。我们直接写个项目看看。一个比较拽的应用就是图表和游戏,我们从浅入深,先玩图表,图表我们今天说一个最简单柱状图。第三件事,数据我用的模拟,实际项目一般是后台提供。 弄了一堆线方块和函数,感觉挺玄乎,然并卵。我们直接写个项目看看。 canvas一个比较拽的应用就是图表和游戏,我们从浅入深,先玩图表,图表我们今天说一个最简单柱状图。showImg(h...

    xiaolinbang 评论0 收藏0
  • canvas系列教程06-柱状项目4

    摘要:最终效果图下面代码只有一个难点怎么算横轴纵轴坐标位置其余就容易多了,有一个注意问题,我其实写复杂了各种位置都是动态算的,因为实际项目你用写死的数值浏览器适配就会出问题。 上一篇文章我已经说过数据准备好画图就非常简单了,如果你担心不回话好办,我给你个最简单的小例子, 你先练练。showImg(https://segmentfault.com/img/remote/146000001252...

    wangym 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<