javascript - d3 圆环图与可拖动的外径

标签 javascript d3.js donut-chart

我正在尝试在每个楔形处制作一个半径可变的圆环图。每个楔子都应该是可拖动的,以改变这个楔子的宽度(宽度意味着外半径)。
但是我不知道如何实现这个拖动功能。有人能帮我吗?

这是我的代码:

var width = 760,
    height = 550;

var innerradius = 200;

var color = d3.scale.category20b();     

var cScale = d3.scale.linear().domain([0, 100]).range([0, 2 * Math.PI]);



var dataset = [
      { label: 'Abulia', count: 10, start: 0, end: 10, radius: 10 }, 
      { label: 'Betelgeuse', count: 20, start: 10, end: 20, radius: 20 },
      { label: 'Cantaloupe', count: 30, start: 30, end: 60, radius: 20 },
      { label: 'Dijkstra', count: 40, start: 60, end: 100, radius: 20 }
];



var svg = d3.select('#content').append('svg')
            .attr('width', width)
            .attr('height', height)
            .append('g')
            .attr('transform', 'translate(' + (width / 2) +  ',' + (height / 2) + ')');


var arc = d3.svg.arc()
      .innerRadius(innerradius)             
      .outerRadius(function(d){return d.radius + innerradius;})
      .startAngle(function(d){return cScale(d.start);}) 
      .endAngle(function(d){return cScale(d.end);});

var path = svg.selectAll('path')
      .data(dataset)
      .enter()
      .append('path')
      .attr('d', arc)
      .style("fill", function(d){return color(d.label);});   

var drag = d3.behavior.drag()
             .on('drag', function() {

                    //don't know what to do

                                    }) 

最佳答案

这是我的解决方案。

             .on('drag', function(d) {
             if (d3.event.sourceEvent.button == 0)
                 d.radius += Math.sqrt(d3.event.dx * d3.event.dx + d3.event.dy * d3.event.dy);
             else if (d3.event.sourceEvent.button == 2){
                 d.radius -= Math.sqrt(d3.event.dx * d3.event.dx + d3.event.dy * d3.event.dy);
                 d.radius = Math.max (d.radius, 1);
             }
                path.each(function (d2){
                    if (d == d2){
                        d3.select(this).attr('d', arc);
                    }
                });
                                });

有了这个,左键单击并拖动将增加楔形的半径,而右键单击并拖动将减小它。如果您选择保留此行为,那么您还需要覆盖默认上下文菜单以防止它弹出。

但是,如果您希望能够通过左键单击来扩展和收缩,事情就会变得有点复杂。这是因为该方法依赖于 dxdy drag 的属性事件,无论弧在哪里,都将是相同的方向。要使用单个鼠标按钮使用它,您必须计算 dxdy相对于弧所面对的方向(可能需要为此深入研究一点三 Angular 学)。

关于javascript - d3 圆环图与可拖动的外径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32125865/

相关文章:

ios - 我可以使用什么在 iOS 中实现圆环图?

javascript - 为什么这种从 `e.parameter.variableName` 方法恢复数组的尝试不起作用?

javascript - 避免在 JS 中分配事件处理程序的循环

javascript - 如何将页面背景设置为黑色,顶部显示div消息通知

javascript - 更新过渡中的轴样式

javascript - 使用JS函数生成并渲染光标附近的html内容

传单 divIcon 未显示在 map 上

css - 如何向圆环图的每个切片添加弹出窗口或工具提示

javascript - 使用正则表达式查找特定的 div 并打印内容

javascript - 绘图 D3 可视化中输入数据(CSV 或 JSON 格式)的最大容量?