【问题标题】:d3.js simple csv treemap two columnsd3.js 简单的 csv treemap 两列
【发布时间】:2017-12-14 02:27:57
【问题描述】:

所以我对 d3.js 进行了一段时间的研究,但不想问这样的问题,因为这是一个非常简单的任务,我一直在努力完成。

我想使用包含两列的 CSV 文件创建 d3.js 树形图。姓名和号码。 但是,我遇到的所有版本 4 的树形图都创建了一个层次结构。我不想使用层次结构。我无法从分层中找到解决方法。查看 d3.js 文档,我相信我找不到替代方案。

很简单,我想创建一个 d3。使用此 csv 数据的树形图。 我想知道如何构造它以及如何将它发送到 d3.treemap() 函数。

如果你能帮助我,非常感谢!!!

数据.csv

content,count
apple,10
oranges,20
strawberry,30
pineapple,40
kiwi,50

【问题讨论】:

    标签: javascript csv d3.js


    【解决方案1】:

    以下是 d3.v4 的示例:

    var vWidth = 600;
    var vHeight = 400;
    // Prepare our physical space
    var g = d3.select('svg').attr('width', vWidth).attr('height', vHeight).select('g');
    
    // Get the data from our CSV file
    /*var csv_url = "https://gist.githubusercontent.com/denjn5/bb835c4fb8923ee65a13008832d2efed/raw/9e8d621174aba36624311944a93cdf8d96109099/data.csv";
    d3.csv(csv_url, function(error, vCsvData) {
      if (error) throw error;
      vData = d3.stratify()(vCsvData);
      drawViz(vData);
    });*/
    
    // Get the data from our CSV string
    var csvString = 'content,parent,count\n';
    csvString += 'fruit,\n';
    csvString += 'apple,fruit,10\n';
    csvString += 'oranges,fruit,20\n';
    csvString += 'strawberry,fruit,30\n';
    csvString += 'pineapple,fruit,40\n';
    csvString += 'kiwi,fruit,50\n';
    
    var data = d3.csvParse(csvString);
    var stratify = d3.stratify()
      .id(function(d) { return d.content; })
      .parentId(function(d) { return d.parent; });
    var treeData = stratify(data);
    // assign the name to each node
    treeData.each(function(d) {
        d.name = d.id;
    });
      
    drawViz(treeData, data);
    
    function drawViz(vData, data) {
      // Declare d3 layout
      var vLayout = d3.treemap().size([vWidth, vHeight]).
      paddingOuter(3);
      // Layout + Data
      var vRoot = d3.hierarchy(vData).sum(function (d) {
      	return d.data.count;
      });
      var vNodes = vRoot.descendants();
      vLayout(vRoot);
      var vSlices = g.selectAll('rect').data(vNodes).enter().append('rect');
      // Draw on screen
      vSlices.attr('x', function (d) { return d.x0; })
        .attr('y', function (d) { return d.y0; })
        .attr('width', function (d) { return d.x1 - d.x0; })
        .attr('height', function (d) { return d.y1 - d.y0; });      
        
      g.selectAll('g').data(vNodes).enter()
      .append('text')
      .attr('x', function (d) { return d.x0; })
      .attr('y', function (d) { return d.y0; })
      .text(function(d) { if (d.data.depth>0) return d.data.id; })
      .attr("dy", "1em")
      .attr("dx", "1em");
    }
    rect {
      fill: #8d4705;
      opacity: 0.3;
      stroke: #FF0000;
      stroke-width: 2px;
    }
    
    text {
      stroke: #FF0000;
      stroke-width: 1px;
      font-family: 'Verdana';
      font-size: 12px;
    }
    <script src="https://d3js.org/d3.v4.min.js"></script>
    
    <svg>
        <g></g>
    </svg>

    更新:

    如果CSV数据不是分层形式,可以使用csvParse()中的行转换函数来适配数据:

    var csvString = 'content,count\n';
    csvString += 'apple,10\n';
    csvString += 'oranges,20\n';
    csvString += 'strawberry,30\n';
    csvString += 'pineapple,40\n';
    csvString += 'kiwi,50\n';
    // trasform in hierarchical
    var data = d3.csvParse(csvString, function(d) {
      return {
        content: d.content,
        parent:"fruit",
        count: d.count,
      };
    });
    // add first element
    data.unshift({content: "fruit", parent: "", count: undefined});
    

    小提琴:https://jsfiddle.net/beaver71/061g1j6q/

    【讨论】:

    • 那么对于 csv 文件,我需要有一个水果列,没有它就无法创建树形图?
    • 我认为是的:根据文档,treemap 列出了指定的根 hierarchy
    • 但是您可以使用row conversion function in csvParse() 并在此处添加“父”列。我更新了我的答案,添加了一个新的小提琴。
    • 非常感谢,为 d3 寻找解决方案的研究非常困难!几周以来我一直在努力寻找解决方案,但非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-19
    • 2016-06-03
    • 2012-05-13
    • 2012-11-09
    • 2019-09-04
    相关资源
    最近更新 更多