d3如何调整饼图的内半径

2023-12-31

我需要将饼图动画制作成圆环图(或环形图)。 这是我的代码:

  var arc = d3.svg.arc().outerRadius(radius-margin).innerRadius(0)
  var arc2 = d3.svg.arc().outerRadius(radius-margin).innerRadius(60)

  var path = pie_chart.selectAll('path')
    .data(pie(data))
    .enter()
    .append('path')
    .attr('d', arc)
    .attr('fill', function(d, i) {
      return color_scale(d.data.device)
    })
    .transition().attr('d', arc2)

有时它有效,但有时却无效。我尝试将过渡应用于圆弧但不起作用。

 var arc2 = d3.svg.arc().outerRadius(radius-margin).innerRadius(0).transition().innerRadius(60)

我会写我自己的arcTween http://bl.ocks.org/mbostock/5100636函数来完全控制转换:

function arcTween(d) {
  var i = d3.interpolateNumber(0, radius-70); //<-- radius of 0 to donut
  return function(t) {
    var r = i(t),
        arc = d3.svg.arc()
          .outerRadius(radius - 10)
          .innerRadius(r); //<-- create arc
    return arc(d); //<-- return arc path
  };
}

完整代码:

<!DOCTYPE html>
<meta charset="utf-8">
<style>
  .arc text {
    font: 10px sans-serif;
    text-anchor: middle;
  }
  
  .arc path {
    stroke: #fff;
  }
</style>

<body>
  <script src="//d3js.org/d3.v3.min.js"></script>
  <script>
    var width = 500,
      height = 500,
      radius = Math.min(width, height) / 2;

    var color = d3.scale.category10();

    var arc = d3.svg.arc()
      .outerRadius(radius - 10)
      .innerRadius(0);

    var pie = d3.layout.pie()
      .sort(null)
      .value(function(d) {
        return d;
      });

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

    var data = [10, 20, 30, 40];

    var g = svg.selectAll(".arc")
      .data(pie(data))
      .enter().append("g")
      .attr("class", "arc");

    g.append("path")
      .attr("d", arc)
      .style("fill", function(d, i) {
        return color(i);
      })
      .transition()
      .delay(100)
      .duration(5000)
      .attrTween("d", arcTween);
      
    function arcTween(d) {
      var i = d3.interpolateNumber(0, radius-70);
      return function(t) {
        var r = i(t),
            arc = d3.svg.arc()
              .outerRadius(radius - 10)
              .innerRadius(r);
        return arc(d);
      };
    }
      
  </script>
</body>

或者只是让某人头疼:

<!DOCTYPE html>
<meta charset="utf-8">
<style>
  .arc text {
    font: 10px sans-serif;
    text-anchor: middle;
  }
  
  .arc path {
    stroke: #fff;
  }
</style>

<body>
  <script src="//d3js.org/d3.v3.min.js"></script>
  <script>
    var width = 500,
      height = 500,
      radius = Math.min(width, height) / 2;

    var color = d3.scale.category10();

    var arc = d3.svg.arc()
      .outerRadius(radius - 10)
      .innerRadius(0);

    var pie = d3.layout.pie()
      .sort(null)
      .value(function(d) {
        return d;
      });

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

    var data = [10, 20, 30, 40];

    var g = svg.selectAll(".arc")
      .data(pie(data))
      .enter().append("g")
      .attr("class", "arc");

    var arcs = g.append("path")
      .attr("d", arc)
      .style("fill", function(d, i) {
        return color(i);
      });
    
    (function repeat() {
      arcs.transition()
        .duration(500)
        .attrTween("d", arcTweenOut)
        .transition()
        .duration(500)
        .attrTween("d", arcTweenIn)
        .each('end', repeat)
    })();
    
    function arcTweenOut(d) {
      var i = d3.interpolateNumber(0, radius-70);
      return function(t) {
        var r = i(t),
            arc = d3.svg.arc()
              .outerRadius(radius - 10)
              .innerRadius(r);
        return arc(d);
      };
    }
    
    function arcTweenIn(d) {
      var i = d3.interpolateNumber(radius-70, 0);
      return function(t) {
        var r = i(t),
            arc = d3.svg.arc()
              .outerRadius(radius - 10)
              .innerRadius(r);
        return arc(d);
      };
    }
      
  </script>
</body>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

d3如何调整饼图的内半径 的相关文章

  • 动画 D3 地球仪 (d3.geo.azimuthal)

    我对 d3 javascript 库有疑问 我想使用方位角 http mbostock github com d3 talk 20111018 azimuthal html地球 我想从地球上的经度和纬度坐标插入点 并使地球动画化 而无需使用
  • 如何在 d3 中使用SimulationLinkDatum和SimulationNodeDatum

    我在使用SimulationLinkDatum 类型时遇到问题 我创建了两个类 Node 和 Link 来实现SimulationNodeDatum 和SimulationLinkDatum 当我尝试使用SimulationLinkDatu
  • 使用 classed("active",true) 鼠标悬停时 D3 颜色变化

    我是 js 和 D3 的新手 我已经生成了某种热图 并且想使用 D3 的 on mouseover 更改图块的颜色 我可以显式更改颜色 但想使用 CSS 活动规则 可能是一些简单的东西可以修复 任何帮助将不胜感激 完整代码如下 Thanks
  • 如何制作一条带有边框的 SVG“线”?

    我有一个小 svg 小部件 其目的是显示角度列表 参见图片 现在 角度是线元素 只有描边 没有填充 但现在我想要一个 内部填充 颜色和周围的 描边 边框 我猜 line 元素无法处理这个问题 那么我应该使用什么来代替呢 请注意 线条笔划的线
  • D3.js 从 file:/// 加载本地数据文件

    我知道D3 js支持使用XHR和JSONP加载数据文件requests https github com mbostock d3 wiki Requests 但就我而言 我将通过从文件系统双击 html 文件来运行它们 这将像file fo
  • 根据 D3 中的属性值对对象进行排序

    我有一系列在 D3 中使用的对象 例如 var cities city London country United Kingdom index 280 city Geneva country Switzerland index 259 ci
  • 学习 SVG 的书籍/教程 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Android和播放SVG动画

    我正在编写一个 Android 应用程序 我想播放一个简单的 SVG 动画 我知道 Android 不提供 SVG 支持 我在这里有什么选择 从 Android Lollipop API 级别 21 开始 可以使用动画矢量Drawable
  • JS / d3.js:突出显示相邻链接的步骤

    再会 我之前对该项目的问题是 D3 js 根据相同的 json 值动态生成源和目标 https stackoverflow com questions 41138515 d3 js dynamically generate source a
  • Typescript 中未定义的 d3.scale

    我是 Typescript 的新手 2 周 我正在从事包装 d3 js 框架的项目 我在使用 d3 d ts 命名空间 导出模块 导入时遇到问题 我的问题 当我尝试使用 d3 scale linear 时 浏览器控制台中出现错误 TypeE
  • 可以在 d3.js 中使用具有固定圆圈大小的圆圈包布局吗?

    此圆形包布局示例 http bl ocks org 4063269 http bl ocks org 4063269 非常适合我正在从事的项目 但是它会调整所有圆圈相对于彼此的大小 有没有一种简单的方法来指定每个圆的固定半径 我已经搜索了源
  • 如何使用 d3.js 沿 GeoJSON 路径对对象进行动画处理?

    我正在使用 D3 js 从 GeoJSON 文件生成并渲染路径 效果很好 但现在我想沿着该路径为对象设置动画 我知道如何使用 D3 和标准 SVG 来做到这一点 创建过渡并设置其持续时间 对于过渡的每一帧 使用 Complete 查找沿路径
  • d3.js - 具有树形布局,如何更改 X 轴以使用 D3 中的时间刻度?

    我有这个树布局 需要它在 X 轴上使用时间刻度来将节点固定为日期 另外 我需要保留根节点 它有一个is rootJSON 数据中的属性 在时间范围之外 Here http codepen io anon pen kIJxo是具有树布局工作的
  • For 循环不适用于 JavaScript 动画

    我正在尝试编写一个 for 循环 以在单击形状按钮时重复 爆炸 路径的动画 但 for 循环无法工作 执行 而且我看不出哪里出了问题 for循环的目的 循环动画路径的过程 然后将动画反转回其原始路径 我知道问题出在 for 循环中的某个地方
  • nvd3散点图中自定义无数据标签

    我正在尝试使用自定义消息而不是显示的 无可用数据 消息 我正在使用 nvd3 散点图 气泡图 我遇到了一个建议here https stackoverflow com questions 17458236 nvd3 showing empt
  • 自 JRE 1.7.0_25 起,Batik 无法进行转换

    自从我更新到 JAVA 1 7 0 25 以来 蜡染在应用转换时会抛出异常 堆栈跟踪是 java awt image ImagingOpException Unable to transform src image at java awt
  • 将 SVG 的高度设置为行高?

    我想将我的 SVG 图像作为图标包含在标题旁边 h1 img src icon sell svg class icon Verkaufen h1 字体大小为h1 is 36px和line heigt is 1 1 我使用检查器工具发现计算出
  • 如何使用 SVG 形状进行图像裁剪?

    任何人都可以指导我如何使用 SVG 独特的形状制作 CSS 图像剪辑路径 有些人建议使用第三方插件 例如 SVG Injector 等 任何人都可以帮助我如何完成这项适用于所有浏览器的任务 我给出了一张示例图片以使其更好地理解 请检查下图
  • d3.js - .exit().remove() 组元素不起作用

    我正在构建一个动态条形图 查看肯尼亚和坦桑尼亚男孩和女孩的考试成绩 用户可以从下拉菜单中选择他们想要查看哪个国家 肯尼亚 坦桑尼亚 和哪一年 2010 年 2011 年 的分数 我已清理所有数据并将其组织到单独的国家 地区年份 csv 文件
  • 如何使用div绘制曲线?

    我需要使用 CSS 绘制两条曲线 我尝试过组装一些divs 使用CSSborder radius绘制弧形面板 但结果很糟糕 还有更好的算术吗 正如我之前在评论中提到的 请不要使用CSS用于实现复杂的曲线和形状 虽然仍然可以使用 CSS 来实

随机推荐