【问题标题】:Changing arc outer radius based on data on d3.js根据 d3.js 上的数据更改圆弧外半径
【发布时间】:2015-06-08 19:17:20
【问题描述】:

第一次使用,所以请原谅任何意外违反协议。我正在尝试将形成 D3 生成的弦图外环的弧线转换为各种条形图,每个组的弧线具有不同的外半径。我在 D3 文档中没有发现任何暗示这是不可能的,但我还没有找到解决方案。棘手的部分似乎是获得一个函数来执行并​​从我存储的 csv 文件中检索相关数字,并相应地更改弧的外半径。这是我到目前为止的内容(改编自“Andrew RP's Andrew's Chord Example”):

d3.csv('teams.csv', function(cities) {
d3.json('matrix1.json', function(matrix) {

// Compute the chord layout.
layout.matrix(matrix);

// Add a group per neighborhood.
var group = svg.selectAll(".group")
.data(layout.groups)
.enter().append("g")
.attr("class", "group")
.on("mouseover", mouseover);


// Add the group arc.
var groupPath = group.append("path")
.attr("id", function(d, i) { return "group" + i; })
.attr("d", d3.svg.arc().innerRadius(innerRadius).outerRadius(innerRadius + function(d, i) {return cities[i].conservation;}))
.style("fill", function(d, i) { return cities[i].color; });

但是当我运行程序时,它不显示外弧,并在浏览器的开发人员窗格中提供错误消息,说它无法解析“d”,并显示它在执行 outerRadius(... )。 任何帮助或建议将不胜感激。 谢谢!

【问题讨论】:

    标签: javascript d3.js chord-diagram


    【解决方案1】:

    这段代码不正确:

    .outerRadius(innerRadius + function(d, i) {return cities[i].conservation;})
    

    您正在尝试对 innerRadius + reference to function 求和。 function(d, i) {return cities[i].conservation;} 只是对该函数的指针引用,而不是函数调用。这个函数不是直接调用的,它只是作为参数传递给outerRadius,稍后执行它。 在您的示例中,称为innerRadius + function(d, i) {return cities[i].conservation;}。它们是不兼容的类型(innerRadius 可能是整数和函数(... 是函数类型),因此调用方法 .toString() 并将字符串 "100function (d, i) {return cities[i].conservation;}" 传递给 .outerRadius ,其中 100 是 innerRadius 变量的值。 代码应该是:

    .outerRadius(function(d, i) {return innerRadius + cities[i].conservation;})
    

    【讨论】:

    • 修复了它。非常感谢,非常感谢。我花了 7 个小时搞砸它,但我并不真正了解 D3 以及整个链接的工作原理。您在推进医学研究方面做了一小部分工作,非常感谢。