【发布时间】:2015-01-22 08:08:41
【问题描述】:
我正在从事一个处理大型关系数据的可视化表示的项目。我们使用饼图来显示数据组件(按顺序)。由于空间不足,我们一次只显示 10 个。
考虑以下示例:
假设我有 100 个数据组件,在给定时间点我将只显示其中的 10 个。我使用的逻辑是,我将其他 90 个组件的开始和结束角度设置为 0(零)。对于这 10 个组件,我计算的开始和结束角度如下 -
var angle = 360;
var count = 10;
if(data.length > count) angle = angle/count; //data is array of data component names
else angle = angle/data.length;
//Initially I'll be displaying first ten components
for(var i=0; i<data.length; i++){
var startAngle = i * angle;
var endAngle = startAngle + angle;
var pi = = Math.PI/180;
var arc = d3.svg.arc()
.innerRadius(innerRadius) //dynamic value, calculated based on available space
.outerRadius(outerRadius) //dynamic value, calculated based on available space
.startAngle((startAngle)*pi)
.endAngle((endAngle)*pi);
//Hiding rest of the data components
if(i >= count){
arc.startAngle(0);
arc.endAngle(0);
}
arcGroup.append("path")
.attr("d", arc)
.attr("stroke", "#2E2E2E")
.attr("stroke-width", "1")
.attr("fill","gold");
var text = arcGroup.append("text")
.attr("transform", "translate(" + arc.centroid() + ")")
.attr("text-anchor", "middle")
.attr("font-family","noto_sansregular")
.attr("font-size", 40)
.attr("font-weight","Bold")
.attr("fill", "#000000")
.attr("y",0)
.style("visibility", "visible")
.text(data[i]);
//Hiding text of hidden arcs
if(i >= count) text.style("visibility", "hidden");
}
如果用户想要查看其余组件,我提供了两个按钮来旋转(时钟或反时钟)内容。
如果当前视图是 -> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
顺时针旋转一个单元格时,结果视图应为 -> 100, 1, 2, 3, 4, 5, 6, 7, 8, 9
在这种情况下,我需要隐藏组件“10”并显示组件“100”,并移动其余单元格。为了实现这一点,我只需要改变弧的开始和结束角度。我可以创建具有计算角度的新圆弧对象。
这里的问题是我不知道如何获取圆弧的内半径和外半径,这是动态创建的。
【问题讨论】: