【问题标题】:D3js pie chart not showing up on localhostD3js 饼图未显示在本地主机上
【发布时间】:2019-09-04 20:57:08
【问题描述】:

对于 D3.js 来说还是全新的。我正在尝试使用 Mac 在本地服务器上测试一个非常简单的 D3.js 甜甜圈图。我使用

由 localhost 打开
       python -m http.server

然后出现一条消息:

       Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...

然后我通过指向http://localhost:8000/final%20project/在chrome上打开页面

注意:包含index.html和data、js、css文件夹的文件夹命名为“final project”

在检查器上,我收到了 d3.min.js 的以下错误:

d3.min.js:2 Uncaught (in promise) SyntaxError: Unexpected token / in JSON at position 0 在 Re (d3.min.js:2)

我的 index.html 代码:

<html>
<head>
<meta charset="UTF-8">
<title>Untitled Document</title>
    <!-- Bootstrap -->
<link rel="stylesheet" href="css/bootstrap.min.css">
<link rel="shortcut icon" href="icons8-bookmark-40.png">    

</head>

<body>
     <div class="col-md-9" id="pie-chart-area"></div>  

    <!-- JS libraries -->
<script src="js/jquery.min.js"></script>
<script src="js/bootstrap.min.js"></script>
<script src="https://d3js.org/d3.v5.min.js"></script>
<script src="js/d3-tip.js"></script>

<!-- Custom JS -->
<script src="main.js"></script>
</body>
</html>

Main.js:

function getGenderColor(genderColor) {
    var fill;
    switch(genderColor) {
      case "Teen Boys":
         fill = "#0079BB";
         break;
      case "Teen Girls":
         fill = "#9E519F";
         break;
      default:
         fill = "blue";
    }
    return fill;
}


function pieChart(chartArea) {
     var margin = {left:40, right:40, top:40, bottom:40};
     var width = 500 - margin.top - margin.bottom,
         height = 800 - margin.left - margin.right;
     var radius = Math.min(width, height) / 2;
     var donutWidth = 75;


     // color range
    var color = d3.scaleOrdinal()
        .range(["#0079BB", "#9E519F"]);

    // entire canvas
    var canvas = d3.select(chartArea)
                 .append("svg")
                 .attr("width", width + margin.left + margin.right)
                 .attr("height", height + margin.top + margin.bottom)
                 .append("g")
                 .attr("transform", "translate(" + width / 2 + "," + height / 2 + ")");

    //define arc
    var arc = d3.arc()
         .innerRadius(radius - donutWidth)
         .outerRadius(radius);

    // import pie chart and data
     var pie = d3.pie()
    .value(function(d) { return d.count; })
    .sort(null);


    d3.json("data/s_gender.json", function(error,data) {
        /*if (error) return console.error(error);
          console.log('mockdata',data);*/

          data.forEach(function(d) {
            d.count = +d.count; 
    });

     var path = svg.selectAll('path')
            .data(pie(data))
            .enter()
            .append('path')
            .attr('d', arc)
            .attr('fill', function(d, i) {
              return color(d.data.gender);
     });

     }); //d3.json

}

pieChart("#pie-chart-area");

Json 文件(s_gender.json):

[
{
 "gender":"F",
 "count":533
},
{
  "gender":"M",
  "count":260
}
]

没有错误,但图表未显示。谁能帮我解决这个问题?

【问题讨论】:

  • 不确定这是否会有所帮助,但您应该在要绘制它的 div 之后在 html 文件中调用 main.js。 Main.js 试图用id#pie-chart-areadiv 中绘制图形。加载时,div 位于其下方且尚未加载,因此无法将图表放在任何地方。因此,将&lt;script src="main.js"&gt;&lt;/script&gt; 放置在底部&lt;/body&gt; 结束标记之前,尤其是在要绘制图表的div 之后。检查是否有帮助。
  • 另外,您使用的是什么版本的 d3.js?你能把console.logs注释掉试试吗?
  • @Coola 您好,我已根据您的建议编辑了帖子。在将 main.js 移动到底部并将 d3.mini.js 指向d3js.org/d3.v5.min.js 之后。我看到 svg 已经被绘制到画布上,但是页面仍然是空的。
  • 您在控制台/页面检查中看到了什么?有什么错误吗?
  • @Coola 没有错误。

标签: javascript d3.js localhost


【解决方案1】:

你的代码的问题主要是:

  1. 代码是使用 D3.js v4 构建的。如果您使用 D3.js v5,您将不得不使用 Promise 方法来解析文件。否则,您可以简单地 src D3.js v4 库。

  2. 其中还有一些其他错误,例如代码放置与脚本源。库最好加载在标题中,而操作 DOM 的 Javascript 应该放在它要附加到的 div 之后。

  3. 您的 getGenderColor 函数未在您的代码中正确调用以执行填充。

这是一个显示饼图的工作块。 https://bl.ocks.org/akulmehta/183847663739b944038ad973e0b7d5b4/

请随时在下面的 cmets 中要求任何澄清。

【讨论】:

  • 我希望它能在你的本地主机上工作。只有你可以确认。乐于助人。
  • 你有没有遇到过 d3.js 在 block 上运行,但不在 localhost 上运行的问题?我在图表中添加了工具提示,但效果只出现在块上。在 localhost 上运行时,效果仍在后台运行,但不显示在浏览器中。
  • 您必须创建一个新问题来检查代码。如果您使用某个库来创建像d3-tip.js 这样的工具提示,则可能是该库未在本地主机上正确导入到您的应用程序中。最好不要使用库并通过附加工具提示 div 并在鼠标悬停时更新它来创建自己的工具提示。查看本教程bl.ocks.org/d3noob/257c360b3650b9f0a52dd8257d7a2d73
  • 您能查看我最近发布的另一篇帖子吗?我正在尝试将多个饼图组合在一起,效果相同,饼图的类别由按钮控制。谢谢! stackoverflow.com/questions/55719253/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-10
  • 2015-05-20
  • 1970-01-01
  • 2019-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多