d3.js 可重用饼图,具有动态更新

2023-12-04

我正在尝试创建一个具有动态转换的可重用饼图作为学习任务。我正在研究 Chris Viau 编写的 d3.js 可重用组件电子书。 我遇到的问题基本上是它不更新,而是创建多个饼图。我想知道我是否不理解 d3.dispatch 的工作原理,或者我是否搞砸了饼图应该工作的方式。它创建多个圆圈,而不是使用随机值动态更新单个饼图。

这是我的jsfiddle。

http://jsfiddle.net/seoulbrother/Upcr5/

thanks!

js代码如下:

d3.edge = {};

d3.edge.donut = function module() {

    var width = 460,
        height = 300,
        radius = Math.min(width, height) / 2;

    var color = d3.scale.category20();


   var dispatch = d3.dispatch("customHover");
   function graph(_selection) {
       _selection.each(function(_data) {    
            var pie = d3.layout.pie()
                .value(function(_data) { return _data; })
                .sort(null);

            var arc = d3.svg.arc()
                .innerRadius(radius - 100)
                .outerRadius(radius - 50);

            if (!svg){
                var svg = d3.select(this).append("svg")
                    .attr("width", width)
                    .attr("height", height)
                    .append("g")
                    .attr("transform", "translate(" + width / 2 + "," + height / 2 + ")");
            }
            var path = svg.selectAll("path")
                .data(pie)
              .enter().append("path")
                .attr("fill", function(d, i) { return color(i); })
                .attr("d", arc)
                .each(function(d) {this._current = d;} );

            path.transition()
                  .ease("elastic")
                  .duration(750)
                  .attrTween("d", arcTween);              

            function arcTween(a) {
              var i = d3.interpolate(this._current, a);
              this._current = i(0);
              return function(t) {
                return arc(i(t));
              };
            }
        });

    }
    d3.rebind(graph, dispatch, "on");
    return graph;
}

donut = d3.edge.donut();
var data = [1, 2, 3, 4];
var container = d3.select("#viz").datum(data).call(donut);

function update(_data) {
    data = d3.range(~~(Math.random() * 20)).map(function(d, i) {
        return ~~(Math.random() * 100);
    });
    container.datum(data).transition().ease("linear").call(donut);
}

update();
setTimeout( update, 1000);

出现多个 SVG 的主要原因是您没有检查是否存在正确的 SVG。你依赖于变量svg被定义,但只有在检查是否已定义后才定义它。

更好的方法是选择您要查找的元素并检查该选择是否为空:

var svg = d3.select(this).select("svg > g");
if (svg.empty()){ // etc

此外,除了输入选择之外,您还需要处理代码中的更新和退出选择。完整的jsfiddlehere.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

d3.js 可重用饼图,具有动态更新 的相关文章

  • 如何使用 d3.format 获取可本地化或可定制的 si 代码

    使用 SI 代码绘制图表正是我们想要的 我们的 y 轴值往往是较大的货币值 例如 10 411 504 201 20 缩写这个 至少在美国语言环境中 这应该转换为 10 4B 但是使用 d3 format 的 s 类型表示 SI 代码 这将
  • 合并两个 csv (d3)

    我使用以下代码加载两个 csv 文件 d3 csv sqrt100train csv function error data2 d3 csv sqrt100test csv function error data sqrt100train
  • Dimple.js - 将数据标签添加到条形图的每个条形

    我使用的是dimple js 它基于d3 js 是否可以向本示例中提到的条形图的每个条形添加数据标签http dimplejs org examples viewer html id bars vertical http dimplejs
  • NVD3 - 配置轴上的刻度

    我有一个 nvd3 折线图 它显示时间序列 但无法在 x 轴右侧获取刻度 对于较长的时间跨度 它会按预期工作 但对于较短的时间跨度 此处 12 31 05 至 01 01 06 多个刻度显示相同的日期 请看一下JSFiddle 上此图表的代
  • D3 删除千位的逗号分隔符

    我有一个包含 3 列的 json 其中一列是 年份 该列仅包含年份 没有日期 当我在 x 轴上绘制它时 年份会以逗号分隔符表示数千 所以在 json 中 日期的格式是 Year 1990 在 x 轴上 结果是 1 990 我一直在试图弄清楚
  • D3.以编程方式缩放后使用鼠标滚轮时缩放会跳转

    当我通过单击鼠标缩放到特定位置然后尝试平移或使用鼠标滚轮时 缩放行为会跳跃 看来我的缩放级别正在恢复 就像单击鼠标之前一样 这是我的事件处理程序 function click d var x y k if d centered d var
  • d3.js:在 SVG 线性渐变中过渡颜色?

    正如标题所说 使用D3 js 是否可以实现线性渐变的颜色过渡 例如 如果我有这个渐变 var gradient svg append svg defs append svg linearGradient attr id gradient a
  • 处理重叠 SVG 图层中的鼠标事件

    我正在使用 d3 js 构建地图可视化 我正在为美国各州和县绘制填充多边形 县的 SVG 图层位于州图层下方 状态已填充 但填充不透明度设置为 0 我认为 需要填充来捕获点击事件 我想捕获州级的点击事件 但我想捕获县级的鼠标悬停事件 但是
  • d3.js - 具有树形布局,如何更改 X 轴以使用 D3 中的时间刻度?

    我有这个树布局 需要它在 X 轴上使用时间刻度来将节点固定为日期 另外 我需要保留根节点 它有一个is rootJSON 数据中的属性 在时间范围之外 Here http codepen io anon pen kIJxo是具有树布局工作的
  • 为什么 d3.js-lasso 不读取 svg 变量

    https jsfiddle net t52f1rn7 https jsfiddle net t52f1rn7 我正在尝试制作一个线条末端有圆圈的折线图 我想选择两个点并通过单击绘制线条 然后我找到了套索插件 我尝试将它用于相同的目的 选择
  • d3.js - .exit().remove() 组元素不起作用

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

    This D3示例作为我的出发点 http bl ocks org kerryrodden 7090426 http bl ocks org kerryrodden 7090426 我想更改提供图表的数据 并且我做了以下新示例 http j
  • 更改 d3 强制布局链接样式以匹配 d3-tree 外观

    我正在再次尝试用 d3 绘制家谱 为此 我想使用通常的节点链接图 例如this one https bl ocks org mbostock 1062288 但是使用通常在以下位置找到的链接样式d3 trees http bl ocks o
  • d3.js:将样式应用于单行

    正在尝试可拖动网络 http bl ocks org mbostock 4566102并希望能够对不同的链接使用不同的颜色 当我注释掉这些行时 var link svg append g attr class link selectAll
  • 将 D3 图表另存为图像

    我在应用程序中创建了很多 D3 图表 但现在我的要求是将 D3 图表保存为任何格式 如 png gif 或 pdf 我搜索了很多 每个人都说我们可以使用画布来实现这一点 任何人都可以给出任何示例或链接吗 从概念上讲我很清楚这一点 使用can
  • D3 版本 5,如何将 Promise 链接到图表构建

    我想将 JS Promise 链接到 D3 v5 图表构建 并想在动画之后解决它 但它不起作用 下面的代码还在注释中显示了不同类型的尝试 它们都不起作用 选项 3 导致异常 未捕获 承诺中 类型错误 无法读取未定义的属性 on 选项 2 和
  • D3.js 对力导向图使用什么算法?

    我有兴趣确切地知道 D3 使用什么算法来实现库中的力导向图功能 读过科布罗夫的总结 http www cs brown edu rt gdhandbook chapters force directed pdf力导向图的历史让我有点困惑 不
  • 鼠标悬停时在折线图上画一条线?

    我正在使用 D3 js 构建折线图 当用户将鼠标悬停在图表上时 我想在图表上绘制一条垂直线 突出显示其与图表线的交点 并显示工具提示 如以下屏幕截图所示 我已经在这条路上走了一部分了 这是我在 JSFiddle 上的代码 http jsfi
  • 尝试将 SVG 绘制到画布上,为什么我的 SVG XML 被截断?

    我真正想做的就是将我喜欢的动态创建的 SVG 放入 PDF 中 目前通过 jsPDF 添加 SVG 不起作用 因此我尝试将它们转换为 PNG 以便尝试添加图像 这是 IE11 中的情况 客户端要求 如果我做 var lsvg d3 sele
  • 为 d3.js 中的多个元素生成 ClipPaths

    我正在尝试创建部分填充的圆圈 就像最终的 纽约时报 政治大会可视化中的圆圈一样 http www nytimes com interactive 2012 09 06 us politics convention word counts h

随机推荐