2016-11-04 59 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>