Я получаю «b.selectAll не является функцией» в моем коде D3js, я не могу сказать, почему

#javascript #d3.js #selectall

#javascript #d3.js #selectall

Вопрос:

Я включил легенду в свою тепловую карту, следуя этому примеру, построенному с использованием порогового масштаба и линейного масштаба для его оси. Ось создается без проблем, проблема, я полагаю, в коде, куда я добавляю ее элементы rect. Примечание: Тепловая карта является элементом svg.

The D3.js версия библиотеки, которую я использую, — D3.v5, на случай, если это может быть уместно упомянуть.

 function (dataset,xScale,yScale,heatMap,w,h,p,colorScale,colorDomain)
    {
        let variance = dataset.monthlyVariance.map(function(val){
            return val.variance;
        });
        const legendColors= [0,1.4,2.8,5.2,6.6,8,9.4,10.8,12.2,13.6].map((n)=> colorScale(n));
        const minTemp = dataset.baseTemperature   Math.min.apply(null, variance);
        const maxTemp = dataset.baseTemperature   Math.max.apply(null, variance);
        const legendDomain= ((min,max,len)=>
        {
            let arr= [];
            let step=(max-min)/len;
            for (let i=0; i<len; i  )
            {
                let eq=min i*step;
                arr.push(eq.toFixed(2));
            }
            return arr;
        })(minTemp,maxTemp,legendColors.length);

        //The legend scaling threshold
        let threshold= d3.scaleThreshold()
        .domain(legendDomain)
        .range(legendColors);
        //Legend's axis scaling
        let legendBar= d3.scaleLinear()
        .domain([minTemp,maxTemp])
        .range([0,w/3]);
        **//Legend's axis**
        let legendAxis= d3.axisBottom(legendBar)
        .tickSize(6)
        .tickValues(threshold.domain())
        .tickFormat(d3.format(".1f"));

        //append legend's element
        let legendEle= heatMap.append("g")
        .attr("id","legend")
        .classed("legend",true)
        .attr("transform", `translate(62,${h-p.bottom 60})`);

        //Map legend
        legendEle.append("g")
        .selectAll("rect")
        .data(threshold.range().map(function(color){
          let d = threshold.invertExtent(color);
          if(d[0] == null) d[0] = legendBar.domain()[0];
          if(d[1] == null) d[1] = legendBar.domain()[1];
          return d;
        }))
        .enter()
        .append('rect')
        .attr('x',(d)=> legendAxis(d[0]))
        .attr('y', 0)
        .attr('width', (d)=> legendAxis(d[1])-legendAxis(d[0]))
        .attr('height', 20)
        .attr("fill", function(d) { return threshold(d[0]); });

        //append legend's axis
        legendEle.append("g").call(legendAxis);

        //rect grid map
        heatMap.selectAll("rect")
        .data(dataset.monthlyVariance)
        .enter()
        .append("rect")
        .attr("class","cell")
        .attr('data-month',function(d){
         return d.month;
        })
        .attr('data-year',function(d){
         return d.year;
        })
        .attr('data-temp',function(d){
         return dataset.baseTemperature   d.variance;
        })
        .attr('x', (d)=> xScale(d.year))
        .attr('y', (d)=> yScale(d.month))
        .attr("width", function(d,i){
          return 5;
        })
        .attr("height", function(d,i){
          return yScale.bandwidth(d.month);
        })
        .attr("fill", (d)=> colorScale(dataset.baseTemperature   d.variance))
        .attr("transform", `translate(62,0)`);
    }
  

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

1. Это будет происходить из-за аргумента, который вы передаете в d3.js функция. Щелкните номер строки рядом с ошибкой «b.selectAll не является функцией» в консоли и поместите туда точку останова. Как только код остановится, вы можете посмотреть на стек вызовов в правом нижнем углу, чтобы увидеть, какая из ваших функций передала неверное значение.

2. Нашел его. Действительно, это было для аргументов, которые я передавал. Вместо масштабирования точек данных с помощью legendBar я использовал legendAxis . Решаемая