Как определить, какие точки для интерполяции в радиальной прямой

#d3.js #radial

Вопрос:

Очень новичок D3 здесь, нащупываю способ адаптации существующей радиолокационной диаграммы, построенной в D3 v3.5.9.У меня проблема с интерполяцией между точками, когда между ними нулевые значения.

Пример:

радар, когда присутствуют все точки данных, выглядит нормально

радар при нулевых значениях

Поведение, которое я хочу, чтобы интерполяция шла по кругу, а не просто закрывала участки, ограниченные ненулевыми значениями.

зеленые линии показывают желаемое поведение при столкновении с нулем

Я использовал функцию «определено», чтобы найти нулевые значения в исходных данных, но мне нужно добавить что-то еще, чтобы дать команду D3 провести соединительные линии между нужными точками. Возможно, что-то со значением индекса для d? Или, может быть, «определено» не является правильной функцией в данном случае?

   var radarLine = d3.svg.line
    .radial()
    .defined(function (d) {
      return d.value !== 0;
    })
    .interpolate("linear-closed")
    .radius(function (d) {
      return rScale(d.value);
    })
    .angle(function (d, i) {
      return i * angleSlice;
    });
  if (cfg.roundStrokes) {
    radarLine.interpolate("cardinal-closed");
  }

  //Create a wrapper for the blobs
  var blobWrapper = g
    .selectAll(".radarWrapper")
    .data(data)
    .enter()
    .append("g")
    .attr("class", "radarWrapper");

  //Append the backgrounds
  blobWrapper
    .append("path")
    //.attr("class", "radarArea")
    .attr("class", function (d) {
      return "radarArea"   " "   d[0].radar_area.replace(/s /g, ""); 
    })
    .attr("d", function (d, i) {
      return radarLine(d);
    })
    .style("fill", function (d, i) {
      return cfg.color(i);
    })
    .style("fill-opacity", 0); 


  //Create the outlines
  blobWrapper
    .append("path")
    .attr("class", "radarStroke")
    .attr("d", function (d, i) {
      return radarLine(d);
    })
    .style("stroke-width", cfg.strokeWidth   "px")
    .style("stroke", function (d, i) {
      return cfg.color(i);
    })
    .style("fill", "none");

 

Любая помощь будет очень признательна!

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

1. defined должно сработать, поэтому нам нужно увидеть больше кода, предпочтительно упрощенную запущенную версию. Однако D3 теперь находится в версии 7, я, например, даже не могу вспомнить некоторые методы в версии 3, так что вам может быть сложнее получить помощь здесь.

2. Спасибо вам за ответ. Надеюсь, я смогу заставить это работать в той версии D3 — я просто недостаточно опытен (пока), чтобы пройти процесс обновления всего этого до более новой версии. Я отредактирую вопрос, чтобы включить весь блок кода для отображения строк.