使用d3.js - 我想创建这种时钟接口。
理想情况下,如果有办法将12时钟数据驱动方式合并到此饼图中。
https://jsfiddle.net/qkHK6/2191/
var w = 400;
var h = 400;
var r = h / 2;
var color = d3.scale.category20c();
var data = [{
"label": "Category B",
"value": 70
}, {
"label": "Category A",
"value": 30
}];
var vis = d3.select('#chart').append("svg:svg").data([data]).attr("width", w).attr("height", h).append("svg:g").attr("transform", "translate(" + r + "," + r + ")");
var pie = d3.layout.pie().value(function(d) {
return d.value;
});
// declare an arc generator function
var arc = d3.svg.arc().outerRadius(r);
// select paths, use arc generator to draw
var arcs = vis.selectAll("g.slice").data(pie).enter().append("svg:g").attr("class", "slice");
arcs.append("svg:path")
.attr("fill", function(d, i) {
return color(i);
})
.attr("d", function(d) {
// log the result of the arc generator to show how cool it is :)
console.log(arc(d));
return arc(d);
});
答案 0 :(得分:4)
我认为这个案子没有灵丹妙药。但是,你可以用一些数学来完成目标。
jsfiddle提前here。
可以根据trigonometric functions绘制刻度。如果你害怕大量的公式,只需看看this并使用它们。他非常巧妙地将其描述为伪代码(我猜)。
2
在这种情况下,您可以通过简单的d3 methods来绘制它。
var radius = 80;
var tickLength = 10;
var circleDegree = 360;
clockGroup.append('g')
.attr('class', 'ticks')
.selectAll('path')
.data(splitDegrees(12))
.enter()
.append('path')
.attr('d', function(d) {
var coord = {
outer: getCoordFromCircle(d, 0, 0, radius),
inner: getCoordFromCircle(d, 0, 0, radius - tickLength)
};
return 'M' + coord.outer[0] + ' ' + coord.outer[1] + 'L' + coord.inner[0] + ' ' + coord.inner[1] + 'Z';
});
function degToRad(degrees) {
return degrees * Math.PI / 180;
}
// it'll give you xy-coord by degree from 12(or 0) o'clock
function getCoordFromCircle(deg, cx, cy, r) {
var rad = degToRad(deg);
var x = cx + r * Math.cos(rad);
var y = cy + r * Math.sin(rad);
return [x, y];
}
function splitDegrees(num) {
var angle = circleDegree / num;
var degrees = [];
for (var ang = 0; ang < circleDegree; ang += angle) {
degrees.push(ang);
}
return degrees;
}