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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章