D3.js学习总结


一、选择、插入和删除操作

选择使用select或者selectAll,分别是选择一个和选择全部
append("插入节点"):在选择集末尾插入元素
insert("插入节点", "选定的元素"):在选择集前面插入元素
remove();
上面四个操作是建立在选项集的基础上的
<body>
  <p>apple</p>
  <p id="del">Pear</p>
  <p>Banana</p>
  <script type="text/javascript">
    var body = d3.select("body");
    body.select("#del").style("color", "green");
    var p1 = body.select("p");
    p1.style("color", "red");

    p1.append("p").text("this is a append element");
    body.insert("p", "#del").text("this is a insert element");
    body.select("#del").remove();
  </script>
</body>

二、D3给DOM中数据赋值

datum() 赋值一个数据到选项集中
data()  赋值一个数组到选项集中
示例:
# html代码:
<p>Apple</p>
<p>Pear</p>
<p>Banana</p>


# JS代码———使用datum()
var body = d3.select("body");
var p = body.selectAll("p");
p.datum(str);
p.text(function(d, i){
  return "第 "+ i + " 个元素绑定的数据是 " + d;
});
# 执行结果0 个元素绑定的数据是 China
第 1 个元素绑定的数据是 China
第 2 个元素绑定的数据是 China


#JS代码———使用data()
var dataset = ["I like dogs","I like cats","I like snakes"];
var body = d3.select("body");
var p = body.selectAll("p");
p.data(dataset)
  .text(function(d, i){
      return d;
  });
# 执行结果
like dogs
I like cats
I like snakes

三、D3比例尺的使用

  • 线性比例尺,能将一个连续的区间,映射到另一区间。要解决柱形图宽度的问题,就需要线性比例尺。
var dataset = [1.2, 2.3, 0.9, 1.5, 3.3];
//将dataset中最小的值,映射成0;将最大的值,映射成300。
var min = d3.min(dataset);
var max = d3.max(dataset);
//两个函数能够求数组的最大值和最小值,是 D3 提供的。

var linear = d3.scale.linear()
//d3.scale.linear()返回一个线性比例尺。
        .domain([min, max])
        .range([0, 300]);
//domain()和range()分别设定比例尺的定义域和值域

linear(0.9);    //返回 0
linear(2.3);    //返回 175
linear(3.3);    //返回 300
  • 序数比例尺
//有时候,定义域和值域不一定是连续的。例如,有两个数组:

var index = [0, 1, 2, 3, 4];
var color = ["red", "blue", "green", "yellow", "black"];

//我们希望 0 对应颜色 red,1 对应 blue,依次类推。
//但是,这些值都是离散的,线性比例尺不适合,需要用到序数比例尺。
var ordinal = d3.scale.ordinal()
        .domain(index)
        .range(color);
ordinal(0); //返回 red
ordinal(2); //返回 green
ordinal(4); //返回 black
//用法与线性比例尺是类似的。

柱状图+序数比例尺示例:

var width = 300;
var height = 300;
var svg = d3.select("body")
  .append("svg")
  .attr("width", width)
  .attr("height", height);

//var dataset = [250, 210, 170, 130, 90, 200, 234];

var dataset = [2.5, 2.1, 1.7, 1.3, 0.9];
var linear = d3.scale.linear()
  .domain([0, d3.max(dataset)])
  .range([0, 250]);

var rectHeight = 25;
//var svg = body.select("svg");
svg.selectAll("rect")
  .data(dataset)
  .enter()
  .append("rect")
  .attr("x", 20)
  .attr("y", function(d, i) {
    return i * rectHeight;
  })
  .attr("width", function(d){
    return linear(d);
  })
  .attr("height", rectHeight - 2)
  .attr("fill", "steelblue");

注意:enter()数的作用是返回一个新的D3()对象集合,这个集合包含了所有没有被可视化啊的数据。这是D3将数据与图形的联系定义的一种模式(enter-update-exit)叫作Enter Mode


四、定义坐标轴

// 数据
var dataset = [ 2.5 , 2.1 , 1.7 , 1.3 , 0.9 ];
// 定义比例尺
var linear = d3.scale.linear()
      .domain([0, d3.max(dataset)])
      .range([0, 250]);

var axis = d3.svg.axis()
      .scale(linear)      //指定比例尺
      .orient("bottom")   
      //指定刻度的方向,bottom 表示在坐标轴的下方显示。
      .ticks(7);          //指定刻度的数量
定义了坐标轴之后,只需要在 SVG 中添加一个分组元素 ,再将坐标轴的其他元素添加到这个 里即可。代码如下:
svg.append("g").call(axis);
//在D3中,call() 的参数是一个函数。调用之后,将当前的选择集作为参数传递给此函数。

参考资料:ourd3js.com

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值