d3.js饼图时钟

3

使用d3.js - 我想创建这种类型的时钟界面。

理想情况下,如果有一种方法可以将12小时钟表数据驱动方式融入到这个饼图中。

enter image description here

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);
  });

希望最好能够在某个时候使其响应式 - http://jsfiddle.net/RodEsp/fdzbv6vg/ - The Old County
这是一个简单的时钟表盘。http://jsfiddle.net/c9jorqje/6/ 如何添加刻度和饼图范围,以显示时间范围? - The Old County
时钟面上的“馅饼范围”具体是什么意思? - Jinyoung Kim
我认为这个切片应该从早上9点开始,然后到下午6点结束。 - The Old County
1个回答

5
我认为这种情况并没有什么捷径可走,但你可以通过一些数学方法来实现目标。
这里提前给出了jsfiddle示例。

刻度线

根据三角函数可以绘制刻度线。如果你对大量公式感到害怕,只需查看这篇文章并使用其中的伪代码(我猜测那是在描述)即可轻松掌握。
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;
}

弧形范围

在这种情况下,您可以通过简单的d3方法绘制它。

var fromClock = 9;
var toClock = 6;

var arc = d3.svg.arc()
  .innerRadius(0)
  .outerRadius(radius)
  .startAngle(clockToRad(fromClock, -1))
  .endAngle(clockToRad(toClock, 1));

clockGroup.append('path')
  .attr('d', arc)
  .style('fill', 'orange');

function clockToRad(clock, direction) {
  var unit = circleDegree / 12;
  var degree = direction > 0 ? unit * clock : unit * clock - circleDegree;
  return degToRad(degree);
}

@TheOldCounty,您不想让时钟动画化吗? - Jinyoung Kim
1
@TheOldCounty 如果正确的话,您只需要关闭 setInterval 函数并将 minuteArchourArcstartAngleendAngle 更改为您想要的值。http://jsfiddle.net/jkiimm/3uz3nzpx/4/ - Jinyoung Kim
你能修好时钟吗? - The Old County
@TheOldCounty 最近我没有足够的时间来修复它,但是我抽出了一点时间。我已经更新了你的fiddle,并尝试重用一些函数而不是进行大规模重构。scale函数已经制作好了,你可以扩展它们的使用。http://jsfiddle.net/3uz3nzpx/8/ - Jinyoung Kim
哪里出错了?橙色弧形区域不是在9:15至18:00之间绘制的吗? - Jinyoung Kim
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接