Круговая диаграмма D3js не отображается на локальном хосте - PullRequest
0 голосов
/ 14 апреля 2019

все еще новичок в D3.js. Я пытаюсь проверить очень простой пончик-граф D3.js на моем локальном сервере с Mac. Я открыл localhost с помощью

       python -m http.server

, затем появляется сообщение:

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

Затем я открыл страницу в Chrome, указав на http://localhost:8000/final%20project/

Примечание: папка, содержащая папки index.html и data, js и css, называется "конечным проектом"

В инспекторе я получил следующую ошибку для d3.min.js:

d3.min.js: 2 Uncaught (в обещании) SyntaxError: Неожиданный токен / в JSON в позиции 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
}
]

Ошибок нет, но диаграмма не отображается. Может ли кто-нибудь помочь мне решить проблему?

1 Ответ

1 голос
/ 15 апреля 2019

Проблема с вашим кодом была в основном:

  1. Код был создан с использованием D3.js v4. Если вы используете D3.js v5, вам придется использовать метод Promise для разбора файлов. В противном случае вы можете просто использовать библиотеку D3.js v4.

  2. В нем были и другие ошибки, такие как размещение кода и исходный код скрипта. Библиотеки лучше всего загружать в заголовок, в то время как Javascript, который управляет DOM, должен быть помещен после div, к которому он будет добавлен.

  3. Ваша функция getGenderColor не вызывалась должным образом в вашем коде для выполнения заполнения.

Вот рабочий блок, показывающий круговую диаграмму. https://bl.ocks.org/akulmehta/183847663739b944038ad973e0b7d5b4/

Пожалуйста, не стесняйтесь просить каких-либо разъяснений в комментариях ниже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...