2013-07-29 14 views
5

Chcę utworzyć wykres liniowy z wieloma seriami z D3 na podstawie tego example. Moim problemem jest to, że niektóre wartości są brakuje:Schemat wielu serii (D3) z brakującymi wartościami

y x1 x2 x3 
1 0.8  0.7 
2 0.9  0.7 
3 0.9 1.2 0.7 
4  1.1 0.7 
5 0.8 1.1 2.7 
6 0.9 1.2 2.6 
7  1.3 0.8 

Chcę uzyskać następujący wykres:

chart

Brakujące punkty na beginnig lub na końcu powinna być pominięta. Mogę to osiągnąć dzięki

Jeśli jednak w linii brakuje niektórych punktów, linia nie powinna być przerywana. Z powyższym kodem zielona linia (x1) zatrzymuje się na y = 3 i trwa na y = 5. Ale chcę mieć te punkty połączone.

Bez użycia line().defined(), wszystkie brakujące punkty były traktowane tak, jakby ich wartość wynosiła 0.

Oto kod, kiedyś znaleźć sposób, aby wdrożyć tę funkcję:

http://jsfiddle.net/G5z4N/2/

myślę, że to nie jest rozwiązanie dla mnie, aby zastąpić brakujące punkty w tablicy danych przed przekazaniem go do moja funkcja wykresów, ponieważ muszę pokazywać wartości w legendzie i etykietkach narzędzi i nie mogę tutaj wyświetlać obliczonych wartości. Na przykład, jeśli poruszę się myszą przez y = 4, w legendzie powinien pojawić się x1:-- x2:1.1 x3:0.8 (x1 nie ma tu żadnej wartości). Również (rzeczywiste) punkty powinny być wyświetlane jako kółka. Nie chcę również mieć dwóch tabel danych w pamięci (jedna z rzeczywistymi danymi pomiarowymi, a druga z rozszerzonymi danymi dla linii wykresu).

+0

Dla części, gdzie chcesz przewód do połączenia, jeśli jej brak wartości w środku i nie mogą być podłączone, jeśli jej brakuje jej wartości z przodu lub z tyłu: Może być, jeśli możesz przeglądać dane i znaleźć pierwszą i ostatnią zdefiniowaną wartość dla każdej kolumny X *, a następnie w zdefiniowanej (funkcja (d, i) {jeśli (i x * Defined [Last]) return false, else return true;}) – Yogesh

+0

Hi @stofl, czy mógłbyś wskazać, która sekcja kodu umożliwia brakujące wartości, które należy traktować jako 0. Walczę, aby to się stało. Jak dotąd po prostu nie pojawiają się na wykresie. Dzięki, – DaRoGa

+0

Różnica między funkcją "line1" (linia 12) i 'line2' (linia 16). O ile pamiętam, funkcja 'x()' w linii 13 zwróciła '0', gdy wartość wynosi' null'. – stofl

Odpowiedz

3

Mogłabym go rozwiązać, ale nie jestem pewien, czy w ten sposób poradzę sobie z aktualizacjami danych z przejściami. Zmieniłem dane formatowania trochę i jestem rysunek każdą linię osobno teraz:

http://jsfiddle.net/G5z4N/3/

var data = [ 
    { 
     name: "x1", 
     color: "green", 
     data: [ 
      [1, 0.8], 
      [2, 0.9], 
      [3, 0.9], 
      [5, 0.8], 
      [6, 0.9] 
     ] 
    }, 
    { 
     name: "x2", 
     color: "red", 
     data: [ 
      [3, 1.2], 
      [4, 1.1], 
      [5, 1.1], 
      [6, 1.2], 
      [7, 1.3] 
     ] 
    }, 
    { 
     name: "x3", 
     color: "blue", 
     data: [ 
      [1, 0.7], 
      [2, 0.7], 
      [3, 0.7], 
      [4, 0.7], 
      [5, 2.7], 
      [6, 2.6], 
      [7, 0.8] 
     ] 
    }, 
]; 

var margin = [20, 20, 20, 20]; 
var w = 400 - margin[1] - margin[3]; 
var h = 300 - margin[0] - margin[2]; 

var x = d3.time.scale().range([0, w]); 
var y = d3.scale.linear().range([h, 0]); 
var lineFunction = d3.svg.line() 
    .x(function(d) { return x(d[0]); }) 
    .y(function(d) { return y(d[1]); }); 

graph = d3.select('#line') 
    .append("svg:svg") 
     .attr("class", "line-graph") 
     .attr("width", w + margin[1] + margin[3]) 
     .attr("height", h + margin[0] + margin[2]) 
    .append("svg:g") 
     .attr("transform", "translate(" + margin[3] + "," + margin[0] + ")"); 

x.domain([ 
    d3.min(data, function(c) { return d3.min(c.data, function(v) { return v[0]; }); }), 
    d3.max(data, function(c) { return d3.max(c.data, function(v) { return v[0]; }); }) 
]); 

y.domain([ 
    d3.min(data, function(c) { return d3.min(c.data, function(v) { return +v[1]; }); }), 
    d3.max(data, function(c) { return d3.max(c.data, function(v) { return +v[1]; }); }) 
]); 

var linesGroup = graph 
    .append("svg:g") 
     .attr("class", "lines"); 

var linedata; 
for (var i in data) { 
    linedata = data[i]; 
    linesGroup 
     .append("path") 
      .attr("d", lineFunction(linedata.data)) 
      .attr("class", "line") 
      .attr("fill", "none") 
      .attr("stroke", function(d, i) { 
       console.log(linedata.color); 
       return linedata.color; 
      }); 
}; 
Powiązane problemy