Почему d отображается как неопределенный в моем скрипте d3?

#javascript #d3.js

#javascript #d3.js

Вопрос:

отредактировано, чтобы включить код, в котором определена ячейка

Я пытаюсь создать диаграмму, которая извлекает данные из запроса XHR, но d не определен в некоторых функциях моего скрипта:

 

var svg = d3.select("svg"),
    margin = {top: 30, right: 40, bottom: 60, left: 40},
    width = svg.attr("width") - margin.left - margin.right,
    height = svg.attr("height") - margin.top - margin.bottom;

var formatValue = d3.format(",d");


var x = d3.scaleTime()
//var x = d3.scaleLinear()
.domain([new Date(2017, 0, 1), new Date(2020, 11, 31)])
    //.rangeRound([0, width]);
    .range([0, width-300]);

    /*var xScale = d3.scaleTime()
      .domain([new Date(2018, 0, 1), new Date(2020, 11, 31)])
      .range([50, 1150]);*/

var g = svg.append("g")
    .attr("transform", "translate("   margin.left   ","   margin.top   ")");
    // Define the div for the tooltip
    var div = d3.select("body").append("div")
        .attr("class", "tooltip")
        .style("opacity", 0);

//variables for legends
  var legendRectSize = 18;
  var legendSpacing = 4;

  
d3.request("https://api.parliament.uk/sparql?query=PREFIX rdfs: 
PREFIX : 
PREFIX id: 
select ?Treaty ?Treatyname ?LeadOrg ?Series ?Link ?workPackage ?procStepName ?date where {
 ?Treaty a :Treaty .  
     ?Treaty rdfs:label ?Treatyname .
  OPTIONAL{ ?Treaty :treatyHasLeadGovernmentOrganisation/ rdfs:label ?LeadOrg .} 
  OPTIONAL {?Treaty :treatyHasSeriesMembership/ :seriesItemCitation ?Series.}
  OPTIONAL {?Treaty :workPackagedThingHasWorkPackagedThingWebLink ?Link.}
	?Treaty :workPackagedThingHasWorkPackage ?workPackage .
  	?workPackage :workPackageHasProcedure/rdfs:label ?proc
  FILTER(?proc IN ("Treaties subject to the Constitutional Reform and Governance Act 2010"))
   ?workPackage :workPackageHasBusinessItem ?procStep .
     ?procStep :businessItemDate ?date .
  ?procStep :businessItemHasProcedureStep id:cspzmb6w .
  ?procStep :businessItemHasProcedureStep/rdfs:label ?procStepName. 
    
   }
")
    .mimeType('application/sparql-results json')
    .response(function(xhr) { return JSON.parse(xhr.responseText); })
    .get(function(data) {
      console.log(data);
var data1 = data.results.bindings;
  //if (error) alert(error);
  data1.forEach(function(d){
    d.datetrimmed = d.date.value.split(' ')[0];
    console.log(d.datetrimmed)
  d.Date1 = Date.parse(d.datetrimmed)
  console.log(d.Date1)
  d.Date2 = d3.timeMonth(d.Date1)
  console.log(d.Date2)
  console.log(d.LeadOrg.value)
})
  x.domain(d3.extent(data.results.bindings, function(d) { return d.Date2; }));

var myColor = d3.scaleOrdinal()
  .range(['#e6194b', '#3cb44b', '#ffe119', '#4363d8', '#f58231', '#911eb4', '#46f0f0', '#f032e6', '#bcf60c', '#fabebe', 'red', '#e6beff', '#9a6324', '#fffac8', '#800000']);

  var simulation = d3.forceSimulation(data)
      .force("x", d3.forceX(function(d) { return x(d.Date2); }).strength(1))
      .force("y", d3.forceY(height / 2))
      .force("collide", d3.forceCollide(14))
      .stop();

  for (var i = 0; i < 120;   i) simulation.tick();
  g.append("text")
          .attr("x", (width / 2))
          .attr("y", 0 - (margin.top / 5))
          .attr("text-anchor", "middle")
          .style("font-size", "24px")
          .style("font-family", "Tahoma")
          .style("text-decoration", "underline")
          .style("fill", "#f2f0f7")
          .text("All Treaties Subject to CRAG 2010 by Lead Organisation");

g.append("text")
        .attr("x", (width / 2))
        .attr("y", 0 - (margin.top - 45))
        .attr("text-anchor", "middle")
        .style("font-size", "12px")
        .style("font-family", "Tahoma")
        .style("fill", "#f2f0f7")
        .text("Click a point on the chart or hover over a square on the legend to highlight all treaties from a given department");

  g.append("g")
      .attr("class", "axis axis--x")
      .attr("transform", "translate(0,"   height   ")")
      .call(d3.axisBottom(x).ticks(20));

  g.append("text")
      .attr("transform",
            "translate("   (width/2-100)   " ,"  
                            (height   margin.top   10)   ")")
      .style("text-anchor", "middle")
      .style("font-size", "14px")
      .style("font-family", "Tahoma")
      .style("fill", "#f2f0f7")
      .text("Date the treaty was laid before the House of Commons");

  var cell = g.append("g")
      .attr("class", "cells")
    .selectAll("g").data(d3.voronoi()
        .extent([[-margin.left, -margin.top], [width   margin.right, height   margin.top]])
        .x(function(d) { return d.x; })
        .y(function(d) { return d.y; })
      .polygons(data1)).enter().append("g");
  

Ошибка возникает на этом этапе далее, где говорится, что он не может прочитать данные свойства undefined:

 cell.append("circle")
     .attr("class", function(d){
       console.log(d)
       org = d.data.results.bindings.LeadOrg.value;

       return org.replace(/[s,]/g,'') })
  

Есть ли способ, которым я должен определять d дальше в коде?
Эта часть кода все еще находится в запросе get от функции d3.request . Это вызовет проблемы?
Буду признателен за любую помощь.

Комментарии:

1. Какую версию D3 вы используете?

2. Я использую D3 версии 4 и запрашиваю версию 1.

3. Почему вы ожидаете d иметь data свойство? Что вы получаете console.log(d) при .attr обратном вызове?

4. Пожалуйста, отредактируйте вопрос, чтобы добавить часть кода, в которой cell он определен, и привязанные к нему данные.

5. Привет @Mehdi, я добавил эту часть кода и весь предшествующий ей код.

Ответ №1:

Вы никогда не передаете данные из cell в "circle" . Чтобы сделать это, рассмотрите следующее:

 cell.append("circle")
     .datum(function(d) { return d; })
     .attr("class", function(d){
       console.log(d)
       org = d.data.results.bindings.LeadOrg.value;

       return org.replace(/[s,]/g,'') })
  

При этом берется объект d , которому вы присвоили cell , и возвращает его как объект данных, который также можно присвоить кругу.

Обратите внимание, что .datum это очень связано с .data , за исключением того, что он ожидает одно единственное значение, а не массив значений.