在Raphael饼图中更新饼图切片大小

时间:2010-09-22 19:52:27

标签: javascript raphael pie-chart

我正在制作一张饼图,显示一段时间内的结果。因此,它需要在状态之间设置动画以显示不同切片的变化。我已经想出如何整体更改所有切片(使用this example作为起点),但我希望能够选择和管理特定切片(或Raphael称之为扇区)时间。有没有人想出怎么做?我发现如果var饼是我的饼图,那么我可以得到一个特定的切片:

var pie = r.g.piechart(200, 200, 150, dataArray);
slice = pie.series[0];

但是当我尝试用动画(特别是改变它的大小)来改变切片时,那就失败了(段不是正确的方法?):

slice.animate({segment: [200, 200, 0, 100]}, 800);

任何操纵单个切片的见解都会非常有用。

1 个答案:

答案 0 :(得分:7)

我非常尴尬地意识到,segment属性是一个自定义属性,我在一个例子中创建并使用它来更新饼图切片的路径,从而更新它的大小。它看起来像这样:

  var r = Raphael("holder");
  r.customAttributes.segment = function (x, y, r, a1, a2) {
      var flag = (a2 - a1) > 180,
          clr = (a2 - a1) / 360;
      a1 = (a1 % 360) * Math.PI / 180;
      a2 = (a2 % 360) * Math.PI / 180;
      return {
          path: [["M", x, y], ["l", r * Math.cos(a1), r * Math.sin(a1)], ["A", r, r, 0, +flag, 1, x + r * Math.cos(a2), y + r * Math.sin(a2)], ["z"]],
          fill: "hsb(" + clr + ", .75, .8)"
      };
  };

以下是上下文中的内容:我有三个值[10,20,15]总计为45.假设一个宽度和高度为250的圆圈,我可以使用段自定义填充切片的圆圈像这样的属性(假设我的页面上有一个id为持有者的div):

var r = Raphael("holder");
r.customAttributes.segment = function (x, y, r, a1, a2) {
    var flag = (a2 - a1) > 180,
        clr = (a2 - a1) / 360;
    a1 = (a1 % 360) * Math.PI / 180;
    a2 = (a2 % 360) * Math.PI / 180;
    return {
        path: [["M", x, y], ["l", r * Math.cos(a1), r * Math.sin(a1)], ["A", r, r, 0, +flag, 1, x + r * Math.cos(a2), y + r * Math.sin(a2)], ["z"]],
        fill: "hsb(" + clr + ", .75, .8)"
    };
};
points = [10, 20, 15];
total = 45;
start = 0;
paths = [];
for(i=0; i<=2; i++) {
  size = 360 / total * points[i];
  var slice = r.path();
  slice.attr({segment: [250, 250, 200, start, start + size], stroke: "#000", title: "Slice "+i});
  paths.push(slice);
  start += size;
}

然后,我可以通过设置段属性的动画来随时为我的路径数组中的切片设置动画:

newPoints = [5, 20, 20];
start = 0;
for(i=0; i<=2; i++) {
  size = 360 / total * newPoints[i];
  paths[i].animate({segment: [250, 250, 200, start, start + size]}, 800);
  paths[i].angle = start - size / 2;
  start += size;
}

我理解其中的一些,其中一些我没有。但上面的代码可以工作(我查了一下)。