D3条形图示例不在本地工作

我对D3很新,想看看一个例子在本地是如何工作的。 我将条形图代码复制并粘贴到一个名为index.html的本地文件,并复制到data.tsv上。 出于某种原因,当我在浏览器上打开文件时绝对没有任何东西显示出来! 我试图将脚本src更改为“d3 / d3.v3.min.js”,因为这是我下载的d3文件夹。但是,这也不起作用。 对于我尝试的每个示例,我都还没有成功查看D3示例。 帮助将不胜感激!

index.html代码如下:

<meta charset="utf-8"> <style> body { font: 10px sans-serif; } .axis path, .axis line { fill: none; stroke: #000; shape-rendering: crispEdges; } .bar { fill: steelblue; } .x.axis path { display: none; } </style> <body> <script src="d3/d3.v3.min.js"></script> <script> var margin = {top: 20, right: 20, bottom: 30, left: 40}, width = 960 - margin.left - margin.right, height = 500 - margin.top - margin.bottom; var formatPercent = d3.format(".0%"); var x = d3.scale.ordinal() .rangeRoundBands([0, width], .1); var y = d3.scale.linear() .range([height, 0]); var xAxis = d3.svg.axis() .scale(x) .orient("bottom"); var yAxis = d3.svg.axis() .scale(y) .orient("left") .tickFormat(formatPercent); var svg = d3.select("body").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 + ")"); d3.tsv("data.tsv", type, function(error, data) { x.domain(data.map(function(d) { return d.letter; })); y.domain([0, d3.max(data, function(d) { return d.frequency; })]); svg.append("g") .attr("class", "x axis") .attr("transform", "translate(0," + height + ")") .call(xAxis); svg.append("g") .attr("class", "y axis") .call(yAxis) .append("text") .attr("transform", "rotate(-90)") .attr("y", 6) .attr("dy", ".71em") .style("text-anchor", "end") .text("Frequency"); svg.selectAll(".bar") .data(data) .enter().append("rect") .attr("class", "bar") .attr("x", function(d) { return x(d.letter); }) .attr("width", x.rangeBand()) .attr("y", function(d) { return y(d.frequency); }) .attr("height", function(d) { return height - y(d.frequency); }); }); function type(d) { d.frequency = +d.frequency; return d; } </script> 

data.tsv的格式如下:字母频率A .08167 B .01492 C .02780 D .04253 E .12702 F .02288 G .02022 H .06094 I .06973

d3.tsv方法对数据进行AJAX请求。 在大多数浏览器上,由于同源策略 (通常会禁止AJAX请求file:/// url)在本地不起作用。

为了得到一个使用本地运行的AJAX的例子,你需要一个本地的web服务器。 如果你有Python,运行

 > python -m SimpleHTTPServer 

从目录中的命令行与您的文件将做到这一点。 如果您喜欢node.js,请尝试http-server 。

作为替代scheme,当我尝试使用.tsv / .csv文件时,我自己也是由Lars Kotthoffbuild议的,您可以直接在这个目的上工作:

http://plnkr.co/

这使您可以使用您喜欢的所有.json / .tsv / .csv文件,并与人员共享以进行协作。 你可以匿名或不匿名,重要的是,你不会丢失你的plunker的当时生成的HTTP地址。

有一件事要注意:你不能像在FTP服务器上那样直接上传文件,但你应该:

  1. 点击“新build文件”
  2. 键入您的代码中引用的.csv / .tsv / .json文件的名称(包括扩展名)
  3. 按原样复制并粘贴包含在该文件中的代码
  4. 如果需要,不要忘记更新.css / .js的名称,以便与index.html的匹配

如前所述,您很可能会遇到与d3库中的XHR相关的CORS问题,以便parsingJSON数据的外部资源。

但是,下面是另外一个解决scheme:将JSONP和Express / Node.js与jQuery函数结合使用,为JSON启动客户端请求,而不是使用d3函数的原始包装。

必须删除原始的d3.json包装器,并用来自请求的数据填充邻接图。 首先克隆或下载jsonp-d3-experiment并使用node server.js启动服务器。 当然,您需要全局安装Node.js,从Node Packaged Modules(npm)开始。 将您的程序复制到一个子目录中。

把你的JSON数据放在jsonp-d3-experiment目录下,并修改server.js来将请求路由到你的数据:

 // Return data from callback server.get('/example', function(req, res) { // Read the JSON data and send to JSONP response readJSON('example.json', function (e, json) { if (e) { throw e; } res.jsonp(json); }); }); 

以下是我为共生matrix修改的代码。 我把整个脚本移到了$.getJSON并完全删除了d3.json函数。

 <script> $.getJSON("http://localhost:8080/example?callback=?", function(result){ miserables = result; var margin = { top: 80, right: 0, bottom: 10, left: 80 }, width = 720, height = 720; var x = d3.scale.ordinal().rangeBands([0, width]), z = d3.scale.linear().domain([0, 4]).clamp(true), c = d3.scale.category10().domain(d3.range(10)); var svg = d3.select("body").append("svg") .attr("width", width + margin.left + margin.right) .attr("height", height + margin.top + margin.bottom) .style("margin-left", -margin.left + "px") .append("g") .attr("transform", "translate(" + margin.left + "," + margin.top + ")"); var matrix = [], nodes = miserables.nodes, n = nodes.length; // Compute index per node. nodes.forEach(function(node, i) { node.index = i; node.count = 0; matrix[i] = d3.range(n).map(function(j) { return { x: j, y: i, z: 0 }; }); }); // Convert links to matrix; count character occurrences. miserables.links.forEach(function(link) { matrix[link.source][link.target].z += link.value; matrix[link.target][link.source].z += link.value; matrix[link.source][link.source].z += link.value; matrix[link.target][link.target].z += link.value; nodes[link.source].count += link.value; nodes[link.target].count += link.value; }); // Precompute the orders. var orders = { name: d3.range(n).sort(function(a, b) { return d3.ascending(nodes[a].name, nodes[b].name); }), count: d3.range(n).sort(function(a, b) { return nodes[b].count - nodes[a].count; }), group: d3.range(n).sort(function(a, b) { return nodes[b].group - nodes[a].group; }) }; // The default sort order. x.domain(orders.name); svg.append("rect") .attr("class", "background") .attr("width", width) .attr("height", height); var row = svg.selectAll(".row") .data(matrix) .enter().append("g") .attr("class", "row") .attr("transform", function(d, i) { return "translate(0," + x(i) + ")"; }) .each(row); row.append("line") .attr("x2", width); row.append("text") .attr("x", -6) .attr("y", x.rangeBand() / 2) .attr("dy", ".32em") .attr("text-anchor", "end") .text(function(d, i) { return nodes[i].name; }); var column = svg.selectAll(".column") .data(matrix) .enter().append("g") .attr("class", "column") .attr("transform", function(d, i) { return "translate(" + x(i) + ")rotate(-90)"; }); column.append("line") .attr("x1", -width); column.append("text") .attr("x", 6) .attr("y", x.rangeBand() / 2) .attr("dy", ".32em") .attr("text-anchor", "start") .text(function(d, i) { return nodes[i].name; }); function row(row) { var cell = d3.select(this).selectAll(".cell") .data(row.filter(function(d) { return dz; })) .enter().append("rect") .attr("class", "cell") .attr("x", function(d) { return x(dx); }) .attr("width", x.rangeBand()) .attr("height", x.rangeBand()) .style("fill-opacity", function(d) { return z(dz); }) .style("fill", function(d) { return nodes[dx].group == nodes[dy].group ? c(nodes[dx].group) : null; }) .on("mouseover", mouseover) .on("mouseout", mouseout); } function mouseover(p) { d3.selectAll(".row text").classed("active", function(d, i) { return i == py; }); d3.selectAll(".column text").classed("active", function(d, i) { return i == px; }); } function mouseout() { d3.selectAll("text").classed("active", false); } d3.select("#order").on("change", function() { clearTimeout(timeout); order(this.value); }); function order(value) { x.domain(orders[value]); var t = svg.transition().duration(2500); t.selectAll(".row") .delay(function(d, i) { return x(i) * 4; }) .attr("transform", function(d, i) { return "translate(0," + x(i) + ")"; }) .selectAll(".cell") .delay(function(d) { return x(dx) * 4; }) .attr("x", function(d) { return x(dx); }); t.selectAll(".column") .delay(function(d, i) { return x(i) * 4; }) .attr("transform", function(d, i) { return "translate(" + x(i) + ")rotate(-90)"; }); } var timeout = setTimeout(function() { order("group"); d3.select("#order").property("selectedIndex", 2).node().focus(); }, 5000); }); </script> 

请注意,现在JSON数据已经存在,所以最简单的事情就是把它分配给miserables

注意:这个解决scheme需要jQuery。

现在,您应该可以在本地打开并呈现所有的d3可视化文件,而无需将其托pipe在服务器上 – 只需在您的浏览器中直接从本地文件系统打开即可。

HTH!