2013-04-19 13 views
22

Obecnie używam D3.js i natknąłem się na problem, którego po prostu nie mogę rozwiązać.D3.js Jak zastosować wiele klas podczas korzystania z funkcji

Mam plik CSV, który ma kolumnę o nazwie "Ustaw" i kolumnę o nazwie "Rok". Chcę pobrać wartości z tych kolumn i użyć ich jako nazw klas. To jest to, co aktualnie mam ...

var circle = svg.selectAll("circle") 
      .data(data) 
      .enter() 
      .append("circle") 
      .attr("class", function(d) { 
       if (d["Set"] == 1) 
       { 
        return "set-1"; 
       } 
       if (d["Set"] == 2) 
       { 
        return "set-2"; 
       } 
      }); 

Działa to doskonale i nadaje każdemu punktowi danych nazwę klasy. Kiedy jednak spróbuję następujących rzeczy, nazwy klas "Set" są nadpisywane przez nazwy klas "Year".

var circle = svg.selectAll("circle") 
      .data(data) 
      .enter() 
      .append("circle") 
      .attr("class", function(d) { 
       if (d["Set"] == 1) 
       { 
        return "set-1"; 
       } 
       if (d["Set"] == 2) 
       { 
        return "set-2"; 
       } 
      .attr("class", function(d) { 
       if (d["Year"] == 2012) 
       { 
        return "2012"; 
       } 
       if (d["Year"] == 2013) 
       { 
        return "2013; 
       } 
      }); 

W jaki sposób można poprawić ten kod, aby dodać dodatkowe nazwy klas, a nie nadpisywać je.

Mam nadzieję, że ktoś może pomóc.

+0

masz uważane za pomocą jQuery? Ma ładną metodę 'addClass()'. – gaynorvader

+0

Ale w jaki sposób uzyskać dostęp do .CSV i zastosować klasę do właściwych węzłów danych? – Dally

+0

Czy możesz dodać klasę po załadowaniu w pliku CSV? – gaynorvader

Odpowiedz

15

Po prostu potrzebujesz jednej funkcji, która nie robi obu rzeczy. Coś w tym stylu może ...

var circle = svg.selectAll("circle") 
     .data(data) 
     .enter() 
     .append("circle") 
     .attr("class", function(d) { 
      var c = ""; 
      if (d["Set"] == 1) 
      { 
       c = "set-1"; 
      } 
      if (d["Set"] == 2) 
      { 
       c = "set-2"; 
      } 
      if (d["Year"] == 2012) 
      { 
       c += " 2012"; 
      } 
      if (d["Year"] == 2013) 
      { 
       c += " 2013; 
      } 
      return c; 
     }); 
+0

Pan jest absolutnym geniuszem i zaoszczędził mi czasu. – Dally

+6

Można również bezpośrednio łączyć: '.attr (" klasa ", funkcja (d) {" zestaw- "+ d [" Zestaw "] +" "+ d [" Rok "]})'. –

+0

@LarsKotthoff Myślę, że potrzebujesz 'return' w tam nie ..? –

55

Istnieje alternatywne podejście, które może być przydatne. Można przypisać lub usunąć zajęcia z wykorzystaniem elementu selection.classed('class-name', true) lub selection.classed('class-name', false):

var circle = svg.selectAll("circle") 
    .data(data) 
    .enter() 
    .append('circle') 
    .classed('2012', function(d) { return d['Year'] === 2012; }) 
    .classed('2013', function(d) { return d['Year'] === 2013; }) 
    .classed('set-1', function(d) { return d['Set'] === 1; }) 
    .classed('set-2', function(d) { return d['Set'] === 2; }); 

Wolę w ten sposób, ponieważ można usunąć klasy od elementu przy użyciu tej samej składni.

+1

bardzo ładna odpowiedź! Podoba mi się sugestia użycia inteligentnej metody klasy D3 classed(). +1! – rmbianchi

+7

jeszcze lepszy powód do użycia 'classed' (zamiast' attr ('class' ...) jest to, że nie wyczyści innych klas już przypisanych do tego elementu – viggity

+0

Co z wydajnością? – kashesandr

16

Można również użyć skrótu jako argument classed funkcję:

var circle = svg.selectAll("circle") 
    .data(data) 
    .enter() 
    .append('circle') 
    .classed({ 
    '2012': function(d) { return d['Year'] === 2012; }, 
    '2013': function(d) { return d['Year'] === 2013; }, 
    'set-1': function(d) { return d['Set'] === 1; }, 
    'set-2': function(d) { return d['Set'] === 2; } 
    }); 
+0

ten sposób jest naprawdę użyteczny i wydajne !!! – morels

Powiązane problemy