D3.js學習筆記(四)—— 使用SVG坐標空間


目標

  在這一章,你將要使用D3.js基於一些數據把SVG元素添加到你想要的坐標位置上。

  我們的目標就是使用下面的數據集:

1 var spaceCircles = [30,70,110];

  並使用D3.js來對這些數據進行可視化:

three circles

數學/圖形 坐標空間(Mathematical/Graph Coordinate Space)

  在我們使用D3.js基於一些數據把SVG元素添加到指定的坐標位置之前,我們先來討論下坐標空間。

  我們了解一些基礎數學中的基礎數學圖形(mathematical graphs).

  這些圖形都是畫在長方形的、二維平面空間。

  這些圖形的坐標空間中,x=0,y=0的坐標都是位於左下方。

  coordinate

  這些圖的X坐標軸是有左向右遞增。

  這些圖的Y坐標軸是右下向上遞增。

  也就說,當我們想畫一個坐標為x=30,y=30的圓,我們只要從左下方向右走30個單位,然后再向上走30個單位,就到了目的地。

  x=30 y=30

 SVG坐標空間

  SVG坐標空間與數學圖形坐標空間原理基本一樣,除了下面兩點:

  1-SVG坐標空間中,x=0以及y=0的坐標是在左上方。

  2-SVG坐標空間中,Y坐標軸的增長方式是自上而下。

  SVG coordinate

  也就是說,隨着Y值變大,坐標位置是向下移動的,而不是向上。

  因此,當我們說在SVG坐標空間里畫一個圓,圓心是x=30,y=30,那就要從左上方出發,向右走30單位,然后向下走30單位。

.append('svg'):添加一個坐標空間

  當我們創建一個D3.js的可視化,我們一直使用的代碼是:

1 var svgContainer = d3.select("body").append("svg")
2                                     .attr("width",200)
3                                     .attr("width",200);

  上面的代碼為我們創建了下面的HTNL SVG元素:

  HTML SVG

  到目前為止,我們一直忽略不去探討SVG元素。No longer!

  我們可以把SVG元素看做是一個寬200單位,高200單位的圖(graph)。

  通過在上面的“SVG坐標空間”中,我們了解了X和Y軸的0點是在左上方。

  現在,我們也知道了,隨着Y坐標增大,坐標是從坐標空間自上而下移動。

  為了更清楚的看到,我們對SVG元素設置如下設置其樣式:

1 var svgContainer = d3.select("body").append("svg")
2                                     .attr("width",200)
3                                     .attr("height",200)
4                                     .style("border","1px solid black");

  結果是:

  SVG border

  通過上面得到的結果,有利於我們在數據可視化的時候,更好的使用逆序的Y坐標系統。

把SVG元素布局在SVG坐標空間

  我們可以用下面的代碼,添加一個SVG圓形元素:

1 <svg width="50" height="50">
2   <circle cx="25" cy="25" r="25" fill="purple" />
3 </svg>

  cx代表圓心是在SVG上自左向右移動25單位。

  cy代表圓心是在SVG上自上而下移動25單位。

  回顧我們使用D3.js創建SVG圓形:

1 var circleSelection = svgSelection.append("circle")
2                                   .attr("cx",25)
3                                   .attr("cy",25)
4                                   .attr("r",25)
5                                   .style("fill","purple");

  其中,.attr("cx",25)和.attr("cy",25)讓我們可以設置SVG圓形的屬性。

  正如我們在前一章看到的,我么可以動態的(programmatically)設置這些屬性:

1 var circleAttributes = circles
2                        .attr("cx", 50)
3                        .attr("cy", 50)
4                        .attr("r", function (d) { return d; });

  但是這一次,我們不是在“半徑”r屬性內使用函數,而是在cx和cy屬性中使用函數。

創建一個SVG元素來持有SVG的元素

  依然是從這個基礎頁面開始:

1 <!DOCTYPE html>
2 <html>
3   <head>
4     <script type="text/javascript" src="d3.v2.min.js"></script>
5   </head>
6   <body>
7   </body>
8 </html>

  我們還是使用Chrome瀏覽器,進入開發者工具模式。

  在JavaScript控制台輸入代碼: 

1 var spaceCircles = [30,70,110];
2 
3 var svgContainer = d3.select("body").append("svg")
4                      .attr("width",200)
5                       .attr("height",200);

  上面的代碼定義了數據集,以及用來持有SVG圓形元素的SVG元素:

SVG element

把數據綁定到SVG圓形元素

  接下來我們要把數據綁定到SVG圓形元素上:

 1 var spaceCircles = [30, 70, 110];
 2  
 3 var svgContainer = d3.select("body").append("svg")
 4                                     .attr("width", 200)
 5                                     .attr("height", 200);
 6 
 7 var circles = svgContainer.selectAll("circle")
 8                           .data(spaceCircles)
 9                           .enter()
10                           .append("circle");

  我們在頁面上添加了三個SVG的圓形元素:

add circle

使用綁定的數據來更改SVG圓形的坐標

  現在已經把數據綁定到了SVG的圓形元素上,我們可以使用這些數據來設置x坐標和y坐標。

  D3.js允許我們在“cx”和“cy”屬性中使用函數:

 1 var spaceCircles = [30,70,110];
 2 
 3 var svgContainer = d3.select("body").append("svg")
 4                      .attr("width",200)
 5                      .attr("height",200);
 6 
 7 var circles = svgContainer.selectAll("circle")
 8                .data(spaceCircles)
 9                .enter()
10                .append("circle");
11 
12 var circleAttributes = circles
13               .attr("cx",function(d){return d;})
14               .attr("cy",function(d){return d;})
15               .attr("r",20);

  結果是:

alter cx and cy

  現在我們離目標和很近了,我們已經使用了數據集中的坐標值創建了三個SVG circle元素。最后要做的事,就是根據數據來對SVG圓形着色。

回顧——依據數據設置SVG元素的樣式

  如果你還記得我們前面“根據數據創建SVG元素”章節的話,在那里我們使用綁定數據更改SVG元素的樣式。

  正如我們之前看到的,D3.js允許我們在.style()操作符內部使用函數——這意味着我們可以這么寫代碼:

 1 var spaceCircles = [30,70,110];
 2   
 3 var svgContainer = d3.select("body").append("svg")
 4                        .attr("width",200)
 5                        .attr("height",200);
 6   
 7 var circles = svgContainer.selectAll("circle")
 8                  .data(spaceCircles)
 9                  .enter()
10                  .append("circle");
11  
12 var circleAttributes = circles
13                .attr("cx",function(d){return d;})
14                .attr("cy",function(d){return d;})
15                .attr("r",20)
16                          .style("fill",function(d){
17                     var returnColor;
18                     if(d===30){returnColor = "green";
19                     }else if(d===70){returnColor = "purple";
20                     }else if(d===110){returnColor = "red";}
21                     return returnColor;
22                     });

  在JavaScript控制台中運行后的結果是:

colored circles

Congratulations - You created, styled, and placed SVG elements in the SVG Coordinate Space based on data from a data set!噢耶~~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM