2016-11-04 98 views
-1

我有一個D3圖表其層次結構是這樣的:D3圖表選擇部分

svg 
    g <- this is row labels 
    g <- this is col labels 
    g <- this is actual chart 

我的問題是,我想實際的圖表部分(第3 <g>元素)轉換成PNG文件時沒有行col標籤。 所以基本上我需要一個d3.selection只能選擇<svg>元素和它的第三個<g>元素,前面的2個<g>被從選擇中剝離,所以當這個選擇被轉換爲XML字符串並且在<canvas>上繪製時,沒有標籤。

目前我實現超過XML做文本處理:

var source = (new XMLSerializer()).serializeToString(d3.select("svg").node()); 
var xmldoc = $.parseXML(source); 
$(xmldoc).find("g:eq(1), g:eq(2)").remove(); 
var src2 = (new XMLSerializer()).serializeToString(xmldoc); 

,但我想知道是否有更方便,更優雅的方式。謝謝。

+0

爲何不給克元素類值,然後通過選擇類。或唯一的ID並通過ID選擇。 –

回答

0

既然沒有答案,我會在這裏發佈我的解決方案,不知道它是否是最好的方法。目前,我通過在XML做文本處理實現:

var source = (new XMLSerializer()).serializeToString(d3.select("svg").node()); 
var xmldoc = $.parseXML(source); 
$(xmldoc).find("g:eq(1), g:eq(2)").remove(); 
var src2 = (new XMLSerializer()).serializeToString(xmldoc); 
1

另一種可能是從修訂SVG CSS選擇器:

d3.select("svg") 

到:

d3.select("svg > g:nth-child(3)") 

這將返回第三<g>標籤屬於SVG父項,並且可以讓您不必從稍後的XML中移除前兩個元素。實施例示出了選擇:

var svg = d3.select("svg"), 
 
    margin = { 
 
    top: 20, 
 
    right: 20, 
 
    bottom: 30, 
 
    left: 40 
 
    }, 
 
    width = +svg.attr("width") - margin.left - margin.right, 
 
    height = +svg.attr("height") - margin.top - margin.bottom; 
 
var g1 = svg.append("g").attr("transform", "translate(50,50)"); 
 
var g2 = svg.append("g").attr("transform", "translate(150,50)"); 
 
var g3 = svg.append("g").attr("transform", "translate(250,50)"); 
 
g1.append("rect").attr("id", 1).attr("width", 25).attr("height", 25).attr("fill", "purple"); 
 
g2.append("rect").attr("id", 2).attr("width", 25).attr("height", 25).attr("fill", "blue"); 
 
g3.append("rect").attr("id", 3).attr("width", 25).attr("height", 25).attr("fill", "orange"); 
 

 
var thirdGroup = d3.select("svg > g:nth-child(3)"); 
 

 
thirdGroup.select("rect") 
 
    .transition().duration(600).ease("quad") 
 
    .attr("width", 50).attr("height", 50);
<script src="http://d3js.org/d3.v3.min.js" charset="utf-8"></script> 
 
<svg width="960" height="500"></svg>