2017-02-13 4 views
1

Я создаю линию с генератором линии d3 и подаю ее с помощью набора данных; этот набор данных обновляется каждый час.Обновление строки d3 с пустым набором данных

var myline = d3.svg.line()  
    .x(function(d) { return x(d.date); }) 
    .y(function(d) { return y(d.y); }); 

svg.append("path") 
    .data(dataset) 
    .attr("class", "line") 
    .attr("d", myline(dataset)); 

Однако каждый полный час набор данных сбрасывается и пуст. Однако подача строки с пустым набором данных оставляет ее неизменной, в то время как я ожидаю, что она будет удалена, так как у нее нет данных.

Есть ли способ удалить строку, когда она подается с пустым набором данных?

+3

вы можете либо удалить строку, а затем запустить функцию снова, чтобы создать линию. Поэтому просто выберите по id и удалите. Или вы можете просто указать значения по умолчанию, например, все ноль. Пример может пригодиться. Кроме того, пустым, вы не имеете в виду никаких данных? Как вы представляете пустой набор данных? – thatOneGuy

+0

набор данных пуст, как dataset = [] – scooterlord

ответ

2

Трудно вам помочь, не видя ваши данные и то, как вы обновляете диаграмму, но мне кажется, что проблема заключается в том, что вы повторно добавляете элемент пути на основе массива данных (который вы даже не необходимо связать с функцией данных) каждый раз, когда вы обновляете диаграмму.

Альтернатива добавляет путь только один раз и изменяет свой атрибут d каждый раз, когда вы обновляете диаграмму. Таким образом, если данные пустые, путь не будет отображаться.

Вот демо, каждые пять секунд массив данных пуст:

var data = []; 
 

 
for(var i = 0; i < 100; i++){ 
 
    data.push({x: i*3, y:Math.random()*150}); 
 
} 
 

 
var svg = d3.select("svg"); 
 

 
var lineGen = d3.svg.line() 
 
    .x(d=>d.x) 
 
    .y(d=>d.y); 
 

 
var line = svg.append("path") 
 
    .attr("fill","none") 
 
    .attr("stroke","black"); 
 

 
var t = 0; 
 
setInterval(function(){ 
 
    var newData = data.slice(0,(t%100)+1); 
 
    line.attr("d", lineGen(newData)); 
 
    t++; 
 
}, 50); 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script> 
 
<svg></svg>

+0

Это именно то, что я ищу. Надеюсь, мне удастся воспроизвести это в моем собственном коде. С пустым набором данных я имею в виду dataset = []. Если набор данных содержит значения даже null, он работает так, как должен, однако я создаю строку из того, что посылает API, и время от времени получаю dataset = [] – scooterlord

+0

Да, я видел ваш комментарий, я только что обновил свой ответ. В демонстрационном примере пустым набором данных является '[]', как и в вашем случае. –

+1

... похоже, моя ошибка связывает обновленный набор данных в строке перед его обновлением. : / – scooterlord

Смежные вопросы