【问题标题】:How can I use CSV data in a zoomable sunburst chart?如何在可缩放的旭日形图中使用 CSV 数据?
【发布时间】:2015-10-15 13:53:19
【问题描述】:

我有 sunburst 可视化,它与this CodePen 中的代码结构基本相同(来自this question on stackoverflow。我还尝试包括不仅可以放大,还可以在内部缩小旭日形(点击到旭日形中间时)。我已经尝试了以下步骤,但到目前为止这些步骤都没有奏效,我不知道如何做到这一点(抱歉,如果这是一件很容易做到的事情,我我对 JS 很陌生)。

包括在开头:

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

var y = d3.scale.linear()
  .range([0, radius]);

将圆弧参数改为:

var arc = d3.svg.arc()
.startAngle(function(d) { return Math.max(0, Math.min(2 * Math.PI, x(d.x))); })
.endAngle(function(d) { return Math.max(0, Math.min(2 * Math.PI, x(d.x + d.dx))); })
.innerRadius(function(d) { return Math.max(0, y(d.y)); })
.outerRadius(function(d) { return Math.max(0, y(d.y + d.dy)); }); 

arcTween() 函数更改为:

function arcTween(d){
var xd = d3.interpolate(x.domain(), [d.x, d.x + d.dx]),
  yd = d3.interpolate(y.domain(), [d.y, 1]),
  yr = d3.interpolate(y.range(), [d.y ? 20 : 0, radius]);
return function(d, i) {
return i
    ? function(t) { return arc(d); }
    : function(t) { x.domain(xd(t)); y.domain(yd(t)).range(yr(t)); return arc(d); };
};
};

但这不起作用。

谁能帮帮我?

【问题讨论】:

  • 看起来您从here 检索到 arcTween 代码...您没有使用该示例作为您的基础是否有原因?您是否尝试保持悬停行为?
  • 另外,一支完整的笔或你的代码会很有帮助
  • 更新后的答案对您有用吗?如果确实如此,请接受它;)
  • 感谢您的帮助,Skip Jack,接受! :)(抱歉回复晚了!)
  • 哈哈,没问题,谢谢...我将再编辑一下答案,以便其他任何偶然发现此问题的人都清楚。您可能想将问题更改为“如何在可缩放的旭日形图中使用 CSV 数据?”

标签: javascript d3.js sunburst-diagram


【解决方案1】:

不确定您是否仍然需要它,但我很确定 this pen 会回答您的问题。

您发布的代码:

...

var arc = d3.svg.arc()
  .startAngle(function(d) { return Math.max(0, Math.min(2 * Math.PI, x(d.x))); })
  .endAngle(function(d) { return Math.max(0, Math.min(2 * Math.PI, x(d.x + d.dx))); })
  .innerRadius(function(d) { return Math.max(0, y(d.y)); })
  .outerRadius(function(d) { return Math.max(0, y(d.y + d.dy)); }); 

...

一切看起来都是正确的,正如我在评论中所说,它似乎与 Mike Bostock 的 Sunburst Example 相匹配。因此,如果没有看到您的其余代码,我无法确切地告诉您问题出在哪里。

The pen 我创建的,上面提到的,包括缩放(双向)、面包屑和弧形渐变。

我没有像您一直使用的 example 那样设置它的样式,但添加起来应该不会太难(不确定您需要什么)。另外,我认为保持简单可能会使它更容易理解。希望这对您有所帮助,如果您需要澄清某些事情或者您在查看笔时遇到问题,请告诉我。

更新

This penone I built 和另一个 example 的组合,以 CSV 数据而不是解析的 JSON 开头。

另一个示例使用 'size' 作为 value 键而不是 'value'。我在 buildHierarchy 函数中更改了这一点,并添加了一个唯一的 id 来修复悬停行为:

...
childNode = {"name": nodeName, "value": size, id: create_id() };
...

create_id 函数只是我 found 为树中的每个项目创建唯一 ID:

function create_id() {
  return '_' + Math.random().toString(36).substr(2, 9);
};

【讨论】:

  • 感谢 Skip Jack 的帮助!我正在使用的代码是我提到的example 中的代码(我将只使用相同格式的差异输入数据)。这是pen,其中包含我所做的更改。我不明白如何将您的建议包含在“我的游戏笔”中。如果您能进一步帮助我,我将不胜感激。
  • 嘿没问题,经过进一步检查,问题是编写您正在使用的示例的人没有使用 x 或 y 比例来生成弧线或 arcTween 函数,而是手动进行这些计算.我正在努力调整他们的原件,看看我是否可以让它工作......但是我真的建议使用我的pen,因为代码少得多,格式也更简洁,特别是如果你是新手d3
  • 除了代码和结构的数量之外,example 笔中还存在其他错误,例如单击外环之一(整个图表消失)
  • 再次感谢您,Skip Jack!如果我将使用您的代码作为起点,我将如何将它与 csv 数据输入一起使用?我在this pen 试过,但它不起作用(奇怪的是,当我在本地运行它时,我只能看到最里面的圆圈)。
  • 我明白了,这是您需要的 CSV 部分...我现在正在使用适用于 csv 数据的笔版本来编辑我的答案。
猜你喜欢
  • 2015-01-18
  • 2014-08-21
  • 2018-08-09
  • 2014-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多