javascript - D3.js -- 加载和操作外部数据

标签 javascript json d3.js hierarchy sunburst-diagram

我是 D3.js 的新手,正在研究各种教程/练习/等等,但我对 D3 的基本需求是加载外部数据(通常是 JSON)并根据该数据绘制一些交互式图表。

基本的森伯斯特例子是here :

enter image description here

我成功地将它适配到我自己的数据上。但是,我希望简化数据的传递并处理 D3.js 中的一些操作。例如,我想提供一个可以根据需要由 D3 操作的平面数据文件,而不是为旭日图准备的分层数组。

但是,我不确定如何在 D3 的数据函数之一之外绘制旭日图。我尝试了下面的代码,而不是通过 json 加载数据,而是将其内联包含在内,因此结构是可见的(不出所料,它不起作用):

var w = 960, 
    h = 700, 
    r = Math.min(w, h) / 2, 
    color = d3.scale.category20c();

var vis = d3.select("#chart").append("svg:svg") 
    .attr("width", w) 
    .attr("height", h) 
       .append("svg:g") 
    .attr("transform", "translate(" + w / 2 + "," + h / 2 + ")");

var partition = d3.layout.partition() 
    .sort(null) 
    .size([2 * Math.PI, r * r]) 
    .value(function(d) { return 1; }); 
var arc = d3.svg.arc() 
    .startAngle(function(d) { return d.x; }) 
    .endAngle(function(d) { return d.x + d.dx; }) 
    .innerRadius(function(d) { return Math.sqrt(d.y); }) 
    .outerRadius(function(d) { return Math.sqrt(d.y + d.dy); }); 
var data = [ 
                        {'level1': 'Right Triangles and an Introduction to Trigonometry', 
'level2': '', 'level3': '', 'level4': '', 'branch': 'TRI', 'subject': 
'MAT'}, 
                        {'level1': '', 'level2': 'The Pythagorean Theorem', 'level3': '', 
'level4': '', 'branch': 'TRI', 'subject': 'MAT'}, 
                        {'level1': '', 'level2': '', 'level3': 'The Pythagorean Theorem', 
'level4': '', 'branch': 'TRI', 'subject': 'MAT'}, 
                        {'level1': '', 'level2': '', 'level3': 'Pythagorean Triples', 
'level4': '', 'branch': 'TRI', 'subject': 'MAT'} 
                        ]; 
console.log(data); // looks good here 
var nest = d3.nest() 
        .key(function(d) { return d.subject;}) 
        .key(function(d) { return d.branch;}) 
        .entries(data); 
console.log(nest); // looks good here 
var path = vis.selectAll("path") 
      .data(nest) 
    .enter().append("svg:path") 
      .attr("display", function(d) { return d.depth ? null : 
"none"; }) // hide inner ring 
      .attr("d", arc) 
      .attr("fill-rule", "evenodd") 
      .style("stroke", "#fff") 
      .style("fill", function(d) { return color((d.children ? d : 
d.parent).name); }); 

这是 HTML 的样子:

<div class="gallery" id="chart">
    <svg width="960" height="700">
        <g transform="translate(480,350)">
            <path display="none" d="MNaN,NaNANaN,NaN 0 1,1 NaN,NaNL0,0Z" fill-rule="evenodd" style="stroke: #ffffff; "/>
        </g>
    </svg>
</div>

我确定我做错了一些非常简单的事情,但是如果我不嵌套绘图函数,我很难理解 D3 将如何遍历所有数据并绘制出图表在像 d3.json 这样的函数中。

有什么想法吗?

最佳答案

您似乎忘记了调用 partition.nodes(nest) 以使用适当的布局位置填充数据以呈现路径。

sunburst example您链接到的 JSON 数据是这样绑定(bind)的:

var path = vis.data([json]).selectAll("path")
    .data(partition.nodes)
  .enter().append("path")
    // …

这相当于:

var path = vis.selectAll("path")
    .data(partition.nodes(json))
  .enter().append("path")
    // …

这两种方法都可行,但您需要调用 partition.nodes某处,否则数据将没有位置。

另请注意,具有指定嵌套的示例数据将生成具有单个节点的层次结构,因为所有指定的嵌套字段都是相同的。

关于javascript - D3.js -- 加载和操作外部数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7519285/

相关文章:

javascript - 更改时的 setState

javascript - 如果条件从未满足,因此简单条形图中的条形始终为蓝色,而我希望它们对于低于特定数字的值为红色

d3.js - 类似铅笔的功能

javascript - Vue.js 在组件之间传递数据

javascript - 如何启用 CORS

javascript - 如何在 Array.map 中获取正确的 "this"?

javascript - 在我的网站中显示来自 MongoLab 的数据

ios - 当我将 NSString 转换为 JSON 时,我得到 null

安卓 : Synchronous way to use asyncttask : Json upload issue

javascript - D3 : Tree diagram with images and circles as nodes