d3.js入门

本来一直是使用echarts来画图的,结果画好了以后,公司又要使用d3来画,没有对它进行特别的深入,只是了解了一下,能完成需求.
还有就是虽然有d3的官网可以学习,但是我不翻墙的话网站基本上是没办法进去的 ,为了以后可以方便的使用d3的一些东西,我觉得自己有必要把它写下来.
先看效果图


image.png

是不是感觉和echarts画出来的一毛一样,我也这么觉得......下次再研究两者有啥区别吧.

代码直接贴过来

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        #container{
            background-color: #ddd;
            width: 500px;
            height: 350px;
        }
        path{
            fill: none;
            stroke: #4682B4;
            stroke-width: 2 ;
        }
        .domain,.tick line{
            stroke: gray;
            stroke-width: 1;
        }
    </style>
</head>
<body>
<div id="container"></div>
<script src="d3.js"></script>
<script>
    var width = 500,
        height = 300,
        margin = {left:50,top:30,right:20,bottom:20},
        g_width = width-margin.left-margin.right,
        g_height = height-margin.top-margin.bottom;
    var svg = d3.select("#container")
        .append("svg")
        .attr("width",width)
        .attr("height",height)
    var g = d3.select("svg")
        .append("g")
       .attr("transform","translate("+margin.left+","+margin.top+")")
    var dataset = [
        {x: 0, y: 11}, {x: 1, y: 35},
        {x: 2, y: 23}, {x: 3, y: 78},
        {x: 4, y: 55}, {x: 5, y: 18},
        {x: 6, y: 98}, {x: 7, y: 100},
        {x: 8, y: 22}, {x: 9, y: 65}
    ];

    var scale_x = d3.scale.linear()
        .domain(d3.extent(dataset, function(d) {
            return d.x;
        }))
        .range([0,g_width])
    var scale_y = d3.scale.linear()
        .domain([0, d3.max(dataset,function(d) {
            return d.y;
        })])
        .range([g_height,0])
    var x_axis = d3.svg.axis().scale(scale_x),
        y_axis = d3.svg.axis().scale(scale_y).orient("left");
    g.append("g")
        .call(x_axis)
        .attr("transform","translate(0,"+g_height+")")
    g.append("g")
        .call(y_axis)
        .append("text")
        .text("Price($)")
        .attr("transform","rotate(-90)")
        .attr("text-anchor","end")
        .attr("dy","1em")

     //绘制曲线
        var line_generator = d3.svg.line()
            .x(function(d){
                return scale_x(d.x);
            })
            .y(function(d){
                return scale_y(d.y);
            })
       
            .interpolate("cardinal");
        d3.select("g")
            .append("path")
            .attr("d",line_generator(dataset))
</script>
</body>

上面的代码同样html css js三部分

HTML部分


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
     css代码
</head>
<body>
<div id="container"></div>

<script src="d3.js"></script>
<script>
      js代码
</script>
</body>

css部分

    <style>
        #container{
            background-color: #ddd;
            width: 500px;
            height: 350px;
        }
        path{
            fill: none;//可以对曲线进行填充色
            stroke: #4682B4;/*曲线的颜色*/
            stroke-width: 2 ;/*曲线的宽度*/
        }
        .domain,.tick line{/*刻度尺的样式*/
            stroke: gray;
            stroke-width: 1;
        }
    </style>

path 是对曲线进行的一系列样式设置

JS部分

  • 0 模拟数据
   var dataset = [
        {x: 0, y: 11}, {x: 1, y: 35},
        {x: 2, y: 23}, {x: 3, y: 78},
        {x: 4, y: 55}, {x: 5, y: 18},
        {x: 6, y: 98}, {x: 7, y: 100},
        {x: 8, y: 22}, {x: 9, y: 65}
    ];

  • 1 设置图表大小:首先要设置画布的大小,然后用margin来存储图表的边距信息,计算出图表的宽度和高度
 var width = 500,
        height = 300,
        // SVG画布边缘与图表内容的距离
        margin = {left:50,top:30,right:20,bottom:20},
        g_width = width-margin.left-margin.right,
        g_height = height-margin.top-margin.bottom;
  • 2 添加画布
 //svg  // 创建一个分组用来组合要画的图表元素
    var svg = d3.select("#container")
        .append("svg")
        //属性:宽、高
        .attr("width",width)
        .attr("height",height)
    //g元素
    var g = d3.select("svg")
        .append("g")
        // // 设置该分组的transform属性
        .attr("transform","translate("+margin.left+","+margin.top+")")

d3.select("#container")选择container元素.往这个里面添加一个子元素"svg".,给这个svg设定一些属性,再往“svg”中添加一个”g”元素并设定一些属性。

  • 3 设置横轴方向和纵轴方向的区域(Domains)和范围(Ranges)
    画布添加好了 可是我要怎么画呢 ?首先要确定定义域和值域
 //设置比例缩放
    //创建x轴的比例尺(线性比例尺)
    var scale_x = d3.scale.linear()//创建了线性比例尺
        .domain(d3.extent(dataset, function(d) {//定义定义域
            return d.x;
        }))
        .range([0,g_width])//定义值域
    // 创建y轴的比例尺(线性比例尺)
    var scale_y = d3.scale.linear()
        .domain([0, d3.max(dataset,function(d) {//定义定义域
            return d.y;
        })])
        .range([g_height,0])//定义值域

这段代码是为了让我们导入的数据与图表的大小相适应,range知道是图表范围的大小,他是一个尺寸大小。这段代码告诉D3我们要画些东西在x轴上,这些东西是时间/日期的一个实体。

而domain指的是数据的区域,extent返回的是最小的x或y到最大的x或y这样一个跨度,所以,最小的x或y就对应于上面range的最小值0

对于y轴的值域,g_height 表示的是当数据为最大值即“8”的时候,输出最高点为g_height。这里要注意由于浏览器从左到右、从上到下的坐标系数值是逐渐增到,因此我们将range的值设成[g_height,0]即可实现整一个的翻转
//,因为SVG画布的y轴与传统认知上的y轴的方向是反着来的,所以在定义y轴的定义域和值域对应关系时,也需要反着来

  • 4 设置x,y坐标轴
    设置好坐标比例问题,就要开始创建坐标轴,添加坐标轴函数:axis()
  //创建x轴 添加坐标轴函数:axis()
    var x_axis = d3.svg.axis().scale(scale_x),
        // 创建y轴
        y_axis = d3.svg.axis().scale(scale_y).orient("left").ticks(5);;

坐标轴axis初始化方法通过d3.svg.axis()来调用,然后调用.scale(scale_x)用前面定义的scale_x来给坐标轴设定刻度, .orient()设定刻度相对坐标轴的位置,.ticks()告诉D3在坐标轴上设定差不多几个刻度就够了,比方说你要D3给你的Y轴设定大概20个刻度 y_axis = d3.svg.axis().scale(scale_y).orient("left").ticks(20);

image.png
  • 5 添加x,y坐标轴
    既然比例设置好了,坐标轴也设置好了,画布也添加完成了,那么就先把坐标轴画出来
    //依次添加X、Y坐标轴,并通过偏移量的设置使得X坐标轴往下移
    // 添加SVG元素并与x轴进行“绑定”
    g.append("g")
        .call(x_axis)
        .attr("transform","translate(0,"+g_height+")")
    // 添加SVG元素并与y轴进行“绑定”
    g.append("g")
        .call(y_axis)
        .append("text")
        .text("Price($)")
        .attr("transform","rotate(-90)")
        .attr("text-anchor","end")
        .attr("dy","1em")
  • 6 绘制曲线
    什么都准备好了,就可以绘制曲线了
//绘制曲线
        var line_generator = d3.svg.line()
            .x(function(d){
                return scale_x(d.x);
            })
            .y(function(d){
                return scale_y(d.y);
            })
            // 选择线条的类型
            .interpolate("cardinal");
    // 添加path元素,并通过line_generator()计算出值来赋值
        d3.select("g")
            .append("path")
            .attr("d",line_generator(dataset))

这样,一个曲线图就完成啦 !!

如果想在曲线上添加点的话,就加入下面的代码

d3.select("g").selectAll('circle')
        .data(dataset)
        .enter()
        .append('circle')
        .attr('cx', function(d) {
            return scale_x(d.x);
        })
        .attr('cy', function(d) {
            return scale_y(d.y);
        })
        .attr('r', 3)
        .attr('fill', function(d) {
            return "white";
        });

这样画出来的曲线图就有点啦


image.png

有曲线图当然也有面积图 ,如果你想绘制面积图表,注意需要三个参数,y0将原来的线型图变成了封闭的面积图咯 将上述步骤6中绘制曲线的代码直接换成一下代码就可以实现了

 var myArea = d3.svg.area()
            .x(function (d) {
                return scale_x(d.x)
            })
            .y0(g_height)
            .y1(function(d){
                return scale_y(d.y)
            })
            .interpolate("cardinal")

        d3.select("g")
            .append("path")
            .attr("d",myArea(dataset))
            .style("fill","pink")
image.png

完成了这些基本上就可以应付一些简单的d3画图啦

官网:http://www.w3.org
不过我老是访问不了 汗(⊙﹏⊙)b!!!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,651评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,468评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,931评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,218评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,234评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,198评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,084评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,926评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,341评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,563评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,731评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,430评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,036评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,676评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,829评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,743评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,629评论 2 354

推荐阅读更多精彩内容

  • D3.js 入门教程(连载) 近年来,可视化越来越流行,许多报刊杂志、门户网站、新闻媒体都大量使用可视化技术,使得...
    极客学院Wiki阅读 12,340评论 2 25
  • 本教程是一个简单的入门教程,能够帮助初学者快速掌握D3的基础知识。 本节内容介绍了添加元素、绑定数据、使用数据、矢...
    笨笨的笨小孩阅读 2,021评论 0 1
  • D3是用于数据可视化的Javascript库。使用SVG,Canvas和HTML。结合强大的可视化技术和数据驱动的...
    Evelynzzz阅读 7,894评论 7 5
  • 2017-6-18学经汇报: 一、学经日期:2017年6月18日 农历五月廿五 阴 星期日 宝...
    b0a4ca4b06a4阅读 515评论 0 0
  • 穷人是被匮乏的生活遮蔽了视野才一直处于贫困中?历史学家布雷格曼说,不对,穷人之所以穷就是因为缺钱。这个答案有...
    会飞的猫666阅读 400评论 0 0