2013-05-02 15 views
16

Mam zewnętrznego pliku csv z danymi w kolumnach tak:.Jak uzyskać maksymalną wartość z tablicy obiektów do wykorzystania w d3.scale.linear() domenę()

name, field_goal_attempts, field_goal_makes 

próbuję używać skali liniowej, ale napotykam na trudności w uzyskaniu maksymalnej wartości dla mojej domeny.

var yScale = d3.scale.linear() 
       .domain(0, d3.max(... 

Jestem zdezorientowany:

1) Czy należy umieścić funkcję yScale zewnątrz lub wewnątrz funkcji

d3.csv("filename.csv", function(data) { 

zwrotnego; i

2) Jak uzyskać maksymalną wartość pozycji w kolumnie field_goal_attempts, aby następnie wprowadzić ją do funkcji yScale.

Oto mój kod w chwili obecnej:

var yScale = d3.scale.linear() 
    .domain([0, 4000]) //d3.max(data, function(d) {return d })]) 
    .range([0, 500]); 

d3.csv("test.csv", function (data) { 
    svg.selectAll("rect") 
     .data(data) 
     .enter() 
     .append("rect") 
     .attr("fill", "blue") 
     .attr("x", magic_number) // I'm not concerned about the magic numbers at this point :) 
     .attr("y", 0) 
     .attr("width", another_magic_number) 
     .attr("height", function (d) { 
      return d.field_goal_attempts 
     }) 
     .attr("id", function (d, i) { 
      return i 
     }); 
}); 

Odpowiedz

28

Dane w pliku csv będą przekazywane zwrotnie do funkcji csv (w twoim przypadku parametr "data"). Możesz więc zdefiniować yScale poza funkcją csv, ale jeśli chcesz, aby max był zależny od danych, musisz ustawić go wewnątrz callback.

Jeśli chodzi o ustalanie maks., Wiele funkcji D3, które działają na tablicach, będzie akceptować opcjonalne funkcje dodatkowe dla precyzyjnego scenariusza. Więc obliczania max użyłbym:

var max = d3.max(data, function(d) { return +d.field_goal_attempts;}); 

więc można to wszystko połączyć jeden z dwóch sposobów:

var yScale = d3.scale.linear().domain(0,100); 
d3.csv("test.csv", function(data){ 
    var max = d3.max(data, function(d) { return +d.field_goal_attempts;}); 
    yScale.domain([0,max]); 
    ... 
} 

lub

d3.csv("test.csv", function(data){ 
    var max = d3.max(data, function(d) { return +d.field_goal_attempts;}); 
    var yScale = d3.scale.linear().domain([0,max]); 
    ... 
} 

Jeśli chcesz znaleźć zarówno max i min następnie sugeruję użycie d3.extent (...), które powinno również akceptować funkcję accessor i zwróci tablicę o długości 2 z wartościami min i max.

+1

Dzięki za pomoc. To jest moje pierwsze pytanie i jestem wdzięczny za pomoc i przyjazny sposób, w jaki została ona dostarczona. Przyjąłem twoją odpowiedź na temat Christophera Chiche'a, ponieważ czułam "więcej d3", nie wymagając pętli. Zaimplementowałem twoje drugie rozwiązanie, ale musiałem wprowadzić dwie zmiany, aby to działało, czyli używając znaku "+" przed d.field_goal_attempts, tak aby max zwrócił 2000, a nie 600, i zawrzeć wartości w domenie() w nawiasach kwadratowych. Jestem nowy, więc nie chcę zmieniać twojego kodu na wypadek, gdybym się mylił, ale pomyślałem, że dobrze by było ci powiedzieć :). Dzięki jeszcze raz! – Emil

+0

Tak, będziesz potrzebował znaku "+" przed argumentem field_goal_attempts, jeśli wartość jest zapisana jako ciąg znaków. I masz całkowitą rację co do argumentu, że domena jest tablicą! Wprowadzę zmiany. Cieszę się, że mogłem pomóc! – Superboggly

+0

Wow nie dodając, że + na początku dawało mi tak wiele problemów, jesteś zbawcą życia @Superboggly! –

1

1) yScale może pozostać poza funkcją d3.csv() tak długo, jak zaktualizować domenę wewnątrz funkcji, gdy po obliczane max. Na przykład można wykonać następujące wnętrze d3.csv():

yScale.domain([0, my_max]) 

2) Aby obliczyć max, tutaj jest metoda Zwykle używam:

//Create list containing only field_goal_attempts 
field_goal_attempts_list = data.forEach(function(d){return d.field_goal_attempts}) 

//Compute max using d3.max() function 
field_goal_attempts_max = d3.max(field_goal_attempts_list) 

Prawdą jest, że przekazując taką funkcję d3.max() będzie bądź świetny, ale o ile wiem, nie jest. Zaletą pierwszego obliczenia listy i obliczenia maksimum jest to, że wykonujesz mniej obliczeń, jeśli chcesz obliczyć min, średnią lub cokolwiek innego.

+0

Dzięki za pomoc. To jest moje pierwsze pytanie i jestem wdzięczny za pomoc i przyjazny sposób, w jaki został dostarczony. Chciałbym zagłosować na twoją odpowiedź, ale jestem nieśmiały reputacji, aby to zrobić :(Przyjąłem odpowiedź @ Superbogly, ponieważ "czuje się" "więcej d3", ignorując potrzebę metody forEach - brzmi okropnie, czyż nie? w każdym razie winę tłumu Pythona za określenie "Pythonic" - jestem nowy zarówno w zakresie kodowania, jak i StackOverflow, więc chcę tylko wyrazić uznanie dla twojej reakcji.Dzięki :) – Emil

+0

Nie ma za co. Jego odpowiedź jest rzeczywiście lepsza niż moja. Nauczyłem się czegoś nowego, czytając to. –

Powiązane problemy