D3JsDay06这包什麽馅,原来是折线—绘制折线图

这次相比长条图使用多一点的资料,阵列如下并且一样先宣告svg变数绘制一个宽800高450的画布

const ary = [130,45,239,20,30,246,72];
const svg = d3.select("body")
    .append("svg")
    .attr("width",800)
    .attr("height",450);

我们先绘制折线图上面的点与上一个长条图的概念类似只不过这次X取的位置是起始点设为30然後间距设为40,一样使用for回圈绘制程序码如下

for (let i = 0; i <ary.length;i++){
    svg.append("circle")
    .attr("cx",30+40*i)
    .attr("cy",450-ary[i])
    .attr("r",3)
    .attr("fill","green");
 }

此时你会看到的图应该是长这样
https://ithelp.ithome.com.tw/upload/images/20210921/20125095Pi8cjLfrzj.png

从画布的最下方开始往上到点的垂直距离会表现出阵列当中的数值

接下来我们要加入线

我们可以尝试着先加入一条线试试看,起始位置从最左下方开始
加入在for回圈外面

 svg.append("line")
    .attr("x1",0)
    .attr("y1",450)
    .attr("x2",30)
    .attr("y2",450-130)
    .style("stroke","black")
    .style("stroke-width","1px");

起始点x1是0而最下方的点就是画布的高,因此y1是450
然後对应到第一个点的位置x是30、y是450-130也就是减去阵列的第一个数值所以x2是30、y2是320。
会看到图长这样
https://ithelp.ithome.com.tw/upload/images/20210921/20125095SlVslnJIqa.png

我们尝试着画第二条线来观察这中间有什麽规则

 svg.append("line")
  .attr("x1",30)
  .attr("y1",450-130)
  .attr("x2",30+40)
  .attr("y2",450-45)
  .style("stroke","black")
  .style("stroke-width","1px");

这时候图片会长类似这样
https://ithelp.ithome.com.tw/upload/images/20210921/20125095Ejar3hrDz5.png
然後我们会发现线段x1和y1的起始位置是来自於上一个点,第一条线段的起始位置是0跟450,x2和y2是当前的点位置
所以我们可以先宣告一个lastX和lastY并且给定初始值并且在for回圈绘制线段完之後将lastX和lastY表示当前的点的位置加入进去,最後在for回圈判断是不是跑最後一圈,做为线断结束到0的位置

程序码如下

let ary = [130,45,239,20,30,246,72];
let svg = d3.select("body")
            .append("svg")
            .attr("width",800)
            .attr("height",450);
let lastX=0;
let lastY=450;

for (let i = 0; i <ary.length;i++){
  svg.append("circle")
  .attr("cx",30+40*i)
  .attr("cy",450-ary[i])
  .attr("r",3)
  .attr("fill","green");

  svg.append("line")
      .attr("x1",lastX)
      .attr("y1",lastY)
      .attr("x2",30+40*i)
      .attr("y2",450-ary[i])
      .style("stroke","black")
      .style("stroke-width","1px");
  lastX =30+40*i;
  lastY = 450-ary[i];
  
  if(i==ary.length-1){
      svg.append("line")
      .attr("x1",lastX)
      .attr("y1",lastY)
      .attr("x2",30+40*(i+1))
      .attr("y2",450)
      .style("stroke","black")
      .style("stroke-width","1px");
  lastX =30+40*i;
  lastY = 450-ary[i];
  }
}

绘制完成图片大概会长这样
https://ithelp.ithome.com.tw/upload/images/20210921/201250956uIEbCwYff.png

以上就是折线图的简单撰写方式,如果要加入文字的话可以参考上一篇长条图。


<<:  Day6 PHP变量

>>:  Day 9【钱包登入区 - Login Interface】你也想起舞吗?

Kotlin Android 第16天,从 0 到 ML - MVVM架构 - ViewModel

前言: 进入Android Jetpack 架构,还是要提一下什麽是MVVM,再来使用ViewMod...

Day 16: 人工神经网路初探 损失函数(上)

损失函数 Loss function 损失/误差函数(loss function)又叫做代价函数(c...

[ Day 35 ] - Electron 应用程序 - 更新自动化 ( 说明篇 )

已经打包拿到客户那的 Electron 应用程序 , 如果有 BUG 需要更新时该怎麽办呢 ? 一般...

Day18 - 使用ViewBinding取代Kotlin Android Extension

今天是预料之外的内容。 Kotlin在1.4.20-M2版本中弃用了Kotlin Android E...

33岁转职者的前端笔记-DAY 29 前端面试题目练习

经过几次的面试,发现在笔试的时候观念非常不熟悉 所以回家的时候自行找出答案增加基本知识 今天就来做个...