zoukankan      html  css  js  c++  java
  • d3实现折线图

    如果觉得作者写的对你有用,可以打赏作者哦!owo  多少不限,支持而已。

    实现折线图不得不说的是d3的线段生成器:

    假设data=[1,2,5,7,5,8,2,6]
    var line = d3.svg.line(data)/*定义了一个叫line的线段生成器,line()是一个函数,会访问
    传入参数的每一项的内容,data代表数据*/ .x(function(d,i){return i})/*x和y都是参数,规定了路径的x坐标和y坐标,
    .x()和.y()规定了访问数据的方式,内置的无名函数是帮助访问数据而定义的*/ .y(function(d){return d}) .interpolate();//插值函数:用于优化折线形状,给折线生成更优路径
    function(d,i)//这个是d3的无名函数
    变量d,i在无名函数中是可用变量。
    第一个参数d表示这个元素的数据绑定,它的值就是与当前元素关联的数据的值,第二个参数i指当前元素在
    整个选集中的索引值。 i是从0开始的,每次迭代依次增加1。
    这两个变量是由D3.js提供的,除此之外还有一个隐含的参数this,this指向当前DOM元素的引用。
    详细内容参考d3的API:https://d3js.org/
     
    画图必不可少需要坐标轴,说到坐标轴那就不得不说d3的比例尺了:
    比例尺:可以看做是一个缩放函数,将过大的图像缩小,将过小的图像放大。
        也可以就看做是一种计算关系:将某一区域的值映射到另一区域,其大小关系不变。
    来,我们定义一个线性比例尺:
    var linear = d3.scale.linear()
          .domain([范围])//需要指定范围大小
          .range([范围]);
    我盟定义的范围是根据画布大小和我实际要求定义的,不是随意的。

    理解:比例尺,很像数学中的函数。

      例如,对于一个一元二次函数,有 x 和 y 两个未知数,当 x 的值确定时,y 的值也就确定了。数学中x 的范围被称为定义域,y 的范围被称为值域

      D3 中的比例尺,也有定义域和值域,分别被称为 domainrange。开发者需要指定 domain 和 range 的范围,如此即可得到一个计算关系。

    知道有比例尺这个好东西之后我们一定会想,有几种比例尺呢,应用场景分别是哪些呢?

      好吧,这就满足你。比例尺大致分为两类:数值比例尺和序数比例尺

      如果想要知道应用场景和使用方法,动起手来画一个坐标轴就啥都明白了哈。

    <!DOCTYPE html>
    <!--混合嵌入式代码的集合-->
    <html>
        <head>
            <meta charset="utf-8">
            <title>画布制作</title>
            <style>
                #container{
                    background: #ddd;
                    width: 500px;
                    height: 250px;
                }
                path{
                    fill: none;
                    stroke: black;
                    stroke-width: 2;
                }
            </style>
        </head>
        <body>
            <div id="container"> </div>
            <script src="https://cdn.bootcss.com/d3/3.5.15/d3.js"></script><!--d3在线引用文档-->
            <script>
            var width = 500,
                height = 250,
                margin={left:50,top:30,right:20,bottom:20},
                g_w = width-margin.left-margin.right,
                g_h = height-margin.top-margin.bottom;
                var data=[1,5,2,8,9,2,4,6];
            var svg=d3.select("#container")/*使用select选择了div(container)元素*/                
            .append("svg")//在container元素中使用append函数添加了一个svg画布
            .attr("width",width)//attr是attribute的缩写,so,可以使用attr给svg添加属性
            .attr("height",height);/*在svg中我把宽高分别设置为了450、200px;
            特意与div(container)元素加以区分,以理解D3图表在html中的结构*/
            var g=d3.select("svg")//此时选中的svg是上面定义的svg及其复加的内容
                .append("g")//添加g元素
                .attr("transform","translate("+margin.left+","+margin.top+")");//设置偏移量
            var xscale=d3.scale.linear()//定义了一个类型为(linear)的比例尺
                .domain([0,data.length-1])//定义域,数据的域
                .range([0,g_w]);//映射域:画布区域
            var yscale=d3.scale.linear()
                .domain([0,d3.max(data)])
                .range([0,g_h]);
            
            var line = d3.svg.line()//线段生成器
                .x(function(d,i){return xscale(i)})//设置路径的x值,xscale是个映射函数,使我们画的图更饱满
                .y(function(d,i){return yscale(d)})//设置路径的y值
                .interpolate("cardinal");//设置拟合方式
            d3.select("g")
                .append("path" )//path是g中的元素,含有属性d。path其实就是曲线。
                .attr("d",line(data));
            </script>
        </body>
    </html>

     看到I这儿,有没有同学对最后一段代码不太明白呢,那我们再来说说“path”:

    这段代码表明了我们向g元素中添加了一个path元素,然后使用attr给d属性值添加数值(添加数值这件事,我们使用line(data)这个函数来实现)

    d代表了path data;这行代码的作用就是生成这段字符串,用于画出曲线。

          

    当我们在开发者工具上选择了path元素时,浏览器告诉我们,在图象上path的表现形式是如上图所示的。

    到这里我们的主体图形就画出来了,作为一个折线图我们是不是还差一些东西呢?

    没错啦,我们还差一个坐标轴呢;不过说坐标轴之前我们得要先说说其他的。

        我们来了解一下d3.select和d3.selectAll:

        刚才的代码中我们曾多次用到d3.seclet,你注意到没有呢。

    1.var svg=d3.select("#container")
    2.var g=d3.select("svg")
    3.d3.select("g")
       .append("path" )
       .attr("d",line(data));

    简单来说select是选择第一个元素,selectAll是选择相同类型的所有元素,所以我们在使用select的时候,如果有相同元素,我们的排序就很重要了。如果你不想那么麻烦,那么给你的元素加一个名字也是个好方法,比如:

    d3.select("svg").append("g")
    var g=d3.select("svg").append("g")
    我们定义了两个“g”元素,一个命名为g一个没有命名,如果我们直接这样写
    d3.select("g")
       .append("path" )
       .attr("d",line(data));
    你猜我们会选中那个g;
    真聪明!我们说过select会选择两个相同的元素的第一个,所以我们选择的是d3.select("svg").append("g")
    如果我们想选择第二个g该怎么办呢?
    好吧,你可以这样:g
             .append("path" )
             .attr("d",line(data));
    如果我是用的selectAll呢,会出现什么现象呢,
    d3.selectAll("g")
       .append("path" )
       .attr("d",line(data));
    好吧,恭喜你你选中了两个g,哈哈哈。
    不过如果你想正真的理解,我还是希望你亲自敲一下代码理解一下。

    select  All       说好的坐标轴呢0w0,哈哈哈,太累了,下篇博客再写吧,哈哈哈

    如果觉得作者写的对你有用,想要夸奖作者的话,可以扫描下方二维码打赏作者哦。

    博客著作权归作者所有,未经作者同意不得擅自转载商用,希知。

     

      

  • 相关阅读:
    Response.Redirect、Server.Transfer、Server.Execute的区别
    js删除Array指定位置元素方法
    用Json.NET将json字符串反序列化为json匿名对象
    Asp.net中编程方式调用ashx(通过webRequest)
    Server.Transfer中传递ViewState方法
    Ext.Net中Ext.net.DirectMethods无法找到DirectMethod
    IFrame网页加载完成事件
    oracle中grant授权说明
    深度剖析Byteart Retail案例:前言
    深度剖析Byteart Retail案例:仓储(Repository)及其上下文(Repository Context)
  • 原文地址:https://www.cnblogs.com/gti2baby/p/11267055.html
Copyright © 2011-2022 走看看