2013-12-09 3 views
1

Я пытаюсь создать диаграмму Sankey из файла csv. Я использую код, предоставленный своевременным портфолио, а также код с сайта d3 (и даже образцы csv-файлов). Однако, когда я пытаюсь запустить код в Chrome, я получаю пустую страницу Html, указывая на то, что код сбой. Я попытался перенаправить исходные коды на файлы на моем рабочем столе, но я все еще сталкиваюсь с теми же проблемами. (Я работаю на компьютере с Windows XP)Получение диаграммы Sankey в D3 из файла csv

Я вставил код ниже:

<!DOCTYPE html> 
    <meta charset="utf-8"> 
    <title>SANKEY Experiment</title> 
    <style> 

    .node rect { 
     cursor: move; 
     fill-opacity: .9; 
     shape-rendering: crispEdges; 
    } 

    .node text { 
     pointer-events: none; 
     text-shadow: 0 1px 0 #fff; 
    } 

    .link { 
     fill: none; 
     stroke: #000; 
     stroke-opacity: .2; 
    } 

    .link:hover { 
     stroke-opacity: .5; 
    } 

    </style> 
    <body> 

    <p id="chart"> 

    <script src="http://d3js.org/d3.v3.js"></script> 
    <script src="C:\Documents and Settings\jennifer.ducz\Desktop\sankey.js"></script> 
    <script> 

    var units = "Units"; 

    var margin = {top: 10, right: 10, bottom: 10, left: 10}, 
     width = 1400 - margin.left - margin.right, 
     height = 740 - margin.top - margin.bottom; 

    var formatNumber = d3.format(",.0f"), // zero decimal places 
     format = function(d) { return formatNumber(d) + " " + units; }, 
     color = d3.scale.category20(); 

    // append the svg canvas to the page 
    var svg = d3.select("#chart").append("svg") 
     .attr("width", width + margin.left + margin.right) 
     .attr("height", height + margin.top + margin.bottom) 
     .append("g") 
     .attr("transform", 
       "translate(" + margin.left + "," + margin.top + ")"); 

    // Set the sankey diagram properties 
    var sankey = d3.sankey() 
     .nodeWidth(36) 
     .nodePadding(10) 
     .size([width, height]); 

    var path = sankey.link(); 

    // load the data with d3.csv instead of d3.json 
    //for another much simpler example uncomment the below 
    d3.csv("C:\Documents and Settings\jennifer.ducz\Desktop\sankey.csv", function(error, data) { 
    //d3.csv("d3noob_energy.csv", function(error, data) { 
      //set up graph in same style as original example but empty 
      graph = {"nodes" : [], "links" : []}; 

        data.forEach(function (d) { 
         graph.nodes.push({ "name": d.source }); 
         graph.nodes.push({ "name": d.target }); 

         graph.links.push({ "source": d.source, "target": d.target, "value": +d.value }); 
        }); 

        //thanks Mike Bostock https://groups.google.com/d/msg/d3-js/pl297cFtIQk/Eso4q_eBu1IJ 
        //this handy little function returns only the distinct/unique nodes 
        graph.nodes = d3.keys(d3.nest() 
          .key(function (d) { return d.name; }) 
          .map(graph.nodes)); 

        //it appears d3 with force layout wants a numeric source and target 
        //so loop through each link replacing the text with its index from node 
        graph.links.forEach(function (d, i) { 
         graph.links[i].source = graph.nodes.indexOf(graph.links[i].source); 
         graph.links[i].target = graph.nodes.indexOf(graph.links[i].target); 
        }); 

        //now loop through each nodes to make nodes an array of objects rather than an array of strings 
        graph.nodes.forEach(function (d, i) { 
         graph.nodes[i] = { "name": d }; 
        }); 

     sankey 
      .nodes(graph.nodes) 
      .links(graph.links) 
      .layout(32); 

    // add in the links 
     var link = svg.append("g").selectAll(".link") 
      .data(graph.links) 
     .enter().append("path") 
      .attr("class", "link") 
      .attr("d", path) 
      .style("stroke-width", function(d) { return Math.max(1, d.dy); }) 
      .sort(function(a, b) { return b.dy - a.dy; }); 

    // add the link titles 
     link.append("title") 
      .text(function(d) { 
      return d.source.name + " → " + 
        d.target.name + "\n" + format(d.value); }); 

    // add in the nodes 
     var node = svg.append("g").selectAll(".node") 
      .data(graph.nodes) 
     .enter().append("g") 
      .attr("class", "node") 
      .attr("transform", function(d) { 
       return "translate(" + d.x + "," + d.y + ")"; }) 
     .call(d3.behavior.drag() 
      .origin(function(d) { return d; }) 
      .on("dragstart", function() { 
       this.parentNode.appendChild(this); }) 
      .on("drag", dragmove)); 

    // add the rectangles for the nodes 
     node.append("rect") 
      .attr("height", function(d) { return d.dy; }) 
      .attr("width", sankey.nodeWidth()) 
      .style("fill", function(d) { 
       return d.color = color(d.name.replace(/ .*/, "")); }) 
      .style("stroke", function(d) { 
       return d3.rgb(d.color).darker(2); }) 
     .append("title") 
      .text(function(d) { 
       return d.name + "\n" + format(d.value); }); 

    // add in the title for the nodes 
     node.append("text") 
      .attr("x", -6) 
      .attr("y", function(d) { return d.dy/2; }) 
      .attr("dy", ".35em") 
      .attr("text-anchor", "end") 
      .attr("transform", null) 
      .text(function(d) { return d.name; }) 
     .filter(function(d) { return d.x < width/2; }) 
      .attr("x", 6 + sankey.nodeWidth()) 
      .attr("text-anchor", "start"); 

    // the function for moving the nodes 
     function dragmove(d) { 
     d3.select(this).attr("transform", 
      "translate(" + (
        d.x = Math.max(0, Math.min(width - d.dx, d3.event.x)) 
       ) + "," + (
         d.y = Math.max(0, Math.min(height - d.dy, d3.event.y)) 
       ) + ")"); 
     sankey.relayout(); 
     link.attr("d", path); 
     } 
    }); 

    </script> 

    </body> 
    </html> 

Если кто-то может сказать мне, что я делаю неправильно, пожалуйста, дайте мне знать.

Edit: Это образец данных я использую любезность timelyportfolio

source target value 
    Barry Elvis 2 
    Frodo Elvis 2 
    Frodo Sarah 2 
    Barry Alice 2 
    Elvis Sarah 2 
    Elvis Alice 2 
    Sarah Alice 4 
+0

У вас есть сообщения об ошибках? –

+0

Уважаемый Lars, У меня нет сообщений об ошибке. Просто пустая страница. – jducz

+0

Не могли бы вы разместить полный пример где-нибудь, пожалуйста? –

ответ

0

, если вы не используя MAMP или любой другой вид виртуального сервера, Chrome не будет загружать csv или любые другие локальные файлы, кроме html. Попробуйте использовать локальный веб-сервер, и все должно быть хорошо.

+0

Проблема локального сервера была частью проблемы. Я думаю, что другой проблемой был компьютер, над которым я работал, не загружал java-скрипты вообще. Спасибо за вашу помощь! – jducz

1

Я никогда не играл с ним; Однако, 1) запустить ваши инструменты для разработчиков/консоли, чтобы увидеть, какие именно линии сбой приложения

2) по следующей ссылке обсуждаются проблемы/решения при форматировании данных

http://www.d3noob.org/2013/02/sankey-diagrams-description-of-d3js-code.html

+0

Консоль Google очень помогает! Спасибо за совет! :) – jducz

+0

Вы вполне удовлетворены – grassBlade

Смежные вопросы