3

我正在尝试创建部分填充的圆圈,就像最终纽约时报政治大会可视化中的圆圈一样:http ://www.nytimes.com/interactive/2012/09/06/us/politics/convention-word-counts.html

在此处输入图像描述

我为 d3 中的 clipPaths 找到的两个最清晰的代码示例(https://gist.github.com/1067636http://bl.ocks.org/3422480)为每个剪辑路径创建具有唯一 id 的单个 div 元素然后将这些路径应用于单个元素。

我不知道如何从这些示例转到可视化,该可视化具有基于数据值的一组元素中的每个元素的唯一圆形 clipPath,以便我可以创建我的效果。

这是我到目前为止所拥有的:

给定具有以下结构的数据:

data = [        
    {value: 500, pctFull: 0.20, name: "20%"}, 
    {value: 250, pctFull: 0.75, name: "75%"},
    {value: 700, pctFull: 0.50, name: "50%"},        
]

1) 为数据集中的每个对象创建一个带有圆圈的力图。圆的面积来自对象值。

2) 使用 mbostock 示例http://bl.ocks.org/3422480中的算法从每个数据点的比例 (pctFull) 计算 k (和 h)

3) 使用 k 为覆盖圆的适当区域的每个数据点生成一个矩形。

我认为如果我可以将每个矩形的可见性限制在其各自的圆圈内,那么这个插图就可以完成,但这就是我被卡住的地方。我尝试了很多东西,但都没有奏效。

这是jsfiddle:http: //jsfiddle.net/G8YxU/2/

在此处输入图像描述

4

1 回答 1

7

在这里看到一个工作小提琴:http: //jsfiddle.net/nrabinowitz/79yry/

在此处输入图像描述

// blue circle
node.append("circle")
    .attr("r", function(d, i) {return rVals[i];})
    .style("fill", "#80dabe")                
    .style("stroke", "#1a4876");   

// clip path for the brown circle
node.append("clipPath")
    // make an id unique to this node
    .attr('id', function(d) { return "clip" + d.index })
  // use the rectangle to specify the clip path itself 
  .append('rect')
    .attr("x", function(d, i){ return rVals[i] * (-1);})
    .attr("width", function(d, i){ return rVals[i] * 2;})
    .attr("y", function(d, i) {return rVals[i] - (2  * rVals[i] * kVals[i]);})
    .attr("height", function(d, i) {return 2  * rVals[i] * kVals[i];});

// brown circle
node.append("circle")
    // clip with the node-specific clip path
    .attr("clip-path", function(d) { return "url(#clip" + d.index + ")"})
    .attr("r", function(d, i) {return rVals[i];})
    .style("fill", "#dabe80")                
    .style("stroke", "#1a4876");   
  • 看起来为元素指定剪辑路径的唯一方法是使用属性url(IRI)中的符号clip-path,这意味着您需要根据节点数据为每个剪辑路径提供一个唯一的 ID。我使用了clip<node index>id 的形式——所以每个节点都有自己的剪辑路径,节点的其他子元素可以引用它。

  • 按照 Mike 的示例,制作两个不同颜色的圆并使用矩形本身作为剪辑路径似乎最简单,而不是制作基于圆圈的剪辑路径。但无论哪种方式,你都可以做到。

于 2012-09-12T22:11:51.300 回答