入门-初学使用d3.js完成折线图与曲线图

入门-初学使用d3.js完成折线图与曲线图

上一节我们简单的完成了一个柱状图的构造,今天继续学习d3.js,今天的目标是完成一个折线图和一个曲线图,曲线图只不过是在完成曲线图后在添加一个.interpolate("cardinal")属性就可以了。

先学习一点新知识

在学习柱状图的的时候我们学习几个获取元素与绑定数据的方法,如不知道的可以看我之前的写的柱状图文章

今天完成折线图也会有几个新的方法:

  1. d3.scale.linear().domain().range(),d3.js的V4.?.?以上的版本可以写成d3.scaleLinear().domain().range(),scale我们暂且叫它“比例”吧,而scaleLinear,我们称它为“线性比例尺”。
    domain()是定义域,就是坐标系下的值(输入范围)
    range()是值域,就是映射到svg画布上的值 (输出范围)
  2. 设置样式的方法:
    fill 设置填充的颜色,none 不填充颜色。
    stroke 设置线条的颜色
    stroke-width 设置线条的宽度

完成折线图主要就需要这几个方法,现在我们看代码是如何实现的。

代码实现

首先我们先定一个盒子来装我们要做的折线图,并设置一部分样式,代码如下:

<div id="container"></div>
#container{
             background: #ddd;
             width: 500px;
             height: 250px;
        }

然后我们给这个盒子里添加一个svg画布,代码如下:

 d3.select("#container")
    .append("svg")
    .attr("width",500)//这里不用加单位
    .attr("height",250)

在在这个svg画布中创建一个g等会来显示我们的折线图,并给它设置一定的偏移量,在这里获取的svg画布必须是实际存在的:代码如下

var g=d3.select("svg")//实际存在的
    .append("g")
    .attr("transform","translate(50,30)")

我们看下网页中是如何显示的:
在这里插入图片描述
如图,我们已经给盒子里添加上了svg画布,和即将承接折线图的g

接下来我们就要定义一些数据并让这些数据显示在画布上,代码如下:

    var data=[1,2,1,2,1,2]
    
    var line_generator=d3.svg.line()
    .x(function(d,i){return scale_x(i)})//0,1,2。。。
    .y(function(d){return scale_y(d)})//1,2,1,2。。。

	 d3.select("g")
    .append("path")
    .attr("d",line_generator(data))

可能这段代码不好理解,我们来先看下在网页中是怎么显示的:
在这里插入图片描述
注意看箭头部分,M0,1L1,2L2,1L3,2L4,1L5,2这段代码的意思是:起点是0,第一个显示的是1,第二个显示的是2,第三个显示的是1 。。。,而“L”的的意思是这些点用直线链接起来。我们要生成这样一串代码就需要我么上面定义line_generator这个函数来把data转换成这种格式。
此时实际我们的折线图已经完成了,如图:
在这里插入图片描述
大家可看到就像一个不规则的污渍一样,这是什么鬼哟,可能你会想,你这个糟老头子坏的很,骗人。为什么会是这个样子的呢?因为我们设置的数据比较小,所以接下来我们要做的就是让折线图在g里等比例放大,大家看代码:
对代码进行了一个重构:

    var width=500;
    var height=250;
    var margin = { top: 30, right: 20, bottom: 20, left: 50 },
        g_width = width - margin.left - margin.right,
        g_height = height - margin.top - margin.bottom;
    //以上代码的意思是:定义变量来表示画布的宽度,给g设置了偏移量,然后准确的求出g的高度和宽度。
    d3.select("#container")
    .append("svg")
    .attr("width",width)
    .attr("height",height)

    var g=d3.select("svg")//实际存在的
    .append("g")
    .attr("transform","translate(50,30)")

    var data=[1,2,1,2,1,2]

    var scale_x= d3.scale//X轴等比例放大函数
      .linear()
      .domain([0,data.length-1])
      .range([0,g_width]);

    var scale_y= d3.scale//Y轴等比例放大函数
        .linear()
        .domain([0,d3.max(data)])//d3.max()获取数据的最大值
        .range([0,g_height]);
    
    var line_generator=d3.svg.line()
    .x(function(d,i){return scale_x(i)})
    .y(function(d){return scale_y(d)})
    .interpolate("cardinal")

    d3.select("g")
    .append("path")
    .attr("d",line_generator(data))

这样我们的折线图就完成了:
在这里插入图片描述
这又是什么鬼,这是因为我们的折线图默认填充了,我们需要给它设置一定的样式,代码如下:

 path{
            fill: none;
            stroke: aquamarine;
            stroke-width: 2;
        }

此时我们的折线图真的就已经完成了:
在这里插入图片描述
如图,可能大家会疑问这显示的不太正确吧,那是因为在d3.js中X轴是水平向右的,Y轴是垂直向下的,知识点要考的。那如果我们要一个曲线图应该怎么办呢,只要在line_generator方法下添加一个方法即可。

 var line_generator=d3.svg.line()
    .x(function(d,i){return scale_x(i)})
    .y(function(d){return scale_y(d)})
    .interpolate("cardinal")

效果如图:
在这里插入图片描述
好了此时我们的折线图,曲线图已经全部完成了。对于D3.js我也是初次接触,学一点分享一点,有些地方说的不是很清楚,还请见谅。欢迎各路大神批评指正。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
智慧校园整体解决方案是响应国家教育信息化政策,结合教育改革和技术创新的产物。该方案以物联网、大数据、人工智能和移动互联技术为基础,旨在打造一个安全、高效、互动且环保的教育环境。方案强调从数字化校园向智慧校园的转变,通过自动数据采集、智能分析和按需服务,实现校园业务的智能化管理。 方案的总体设计原则包括应用至上、分层设计和互联互通,确保系统能够满足不同用户角色的需求,并实现数据和资源的整合与共享。框架设计涵盖了校园安全、管理、教学、环境等多个方面,构建了一个全面的校园应用生态系统。这包括智慧安全系统、校园身份识别、智能排课及选课系统、智慧学习系统、精品录播教室方案等,以支持个性化学习和教学评估。 建设内容突出了智慧安全和智慧管理的重要性。智慧安全管理通过分布式录播系统和紧急预案一键启动功能,增强校园安全预警和事件响应能力。智慧管理系统则利用物联网技术,实现人员和设备的智能管理,提高校园运营效率。 智慧教学部分,方案提供了智慧学习系统和精品录播教室方案,支持专业级学习硬件和智能化网络管理,促进个性化学习和教学资源的高效利用。同时,教学质量评估中心和资源应用平台的建设,旨在提升教学评估的科学性和教育资源的共享性。 智慧环境建设则侧重于基于物联网的设备管理,通过智慧教室管理系统实现教室环境的智能控制和能效管理,打造绿色、节能的校园环境。电子班牌和校园信息发布系统的建设,将作为智慧校园的核心和入口,提供教务、一卡通、图书馆等系统的集成信息。 总体而言,智慧校园整体解决方案通过集成先进技术,不仅提升了校园的信息化水平,而且优化了教学和管理流程,为学生、教师和家长提供了更加便捷、个性化的教育体验。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

琞、小菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值