d3日历视图:如何将all放入一个svg而不是几个svgs

时间:2015-03-18 21:58:03

标签: javascript svg d3.js calendar grouping

我正在尝试为其创建导出功能 D3 Calendar View

但问题是原始代码每个月创建一个svg。然后导出只导出第一个svg。我怎么能让它成为一个大的svg,里面所有的月份作为一组?

有问题的代码是:

var svg = d3.select("body").selectAll("svg")
.data(d3.range(1990, 2011))
.enter().append("svg")
.attr("width", width)
.attr("height", height)
.attr("class", "RdYlGn")
.append("g")
.attr("transform", "translate(" + ((width - cellSize * 53) / 2) + "," + (height - cellSize * 7 - 1) + ")");

感谢您的任何想法。 gb5256

2 个答案:

答案 0 :(得分:2)

这是一个快速重构器,它将它放在一个svg中,每年都会移动到它自己的g

尺寸变为:

var width = 960,
    yearHeight = 136, // height of each year
    height = yearHeight * 20, // height of entire svg
    cellSize = 17; // cell size

附加大高度的初始SVG:

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

每年创建g并转换为位置:

var g = svg.selectAll(".yearG")
    .data(d3.range(1990, 2011))
    .enter().append("g")
    .attr("class","yearG")
    .attr("class", "RdYlGn")
    .attr("transform", function(d,i){
      return "translate(" + ((width - cellSize * 53) / 2) + "," + ((yearHeight - cellSize * 7 - 1) + (yearHeight * i)) + ")";
    });

将元素附加到g s:

g.append("text")
...    
var rect = g.selectAll(".day")
...
g.selectAll(".month")
...

这是一个updated gist

答案 1 :(得分:2)

如果您不受限制将其置于一个组中,您可以将所有svgs嵌套到一个外部svg中。在这种情况下,只需要更改一行。而不是

var svg = d3.select("body").selectAll("svg")

你会去

var svg = d3.select("body").append("svg").selectAll("svg")

您的导出可能只是抓取包含所有嵌套svgs的外部容器svg。