2013-03-22 11 views
9

Jestem względnie nowy w D3 i nie mogę zrozumieć, dlaczego coś nie działa .. Chcę narysować wykres liniowy z d3, a to działa dobrze, ale mam problemy z osiami.d3 linechart string domena oś X

z następującego kodu to idzie źle gdzieś, a ja nie wiem, jak rozwiązać ...

var x = d3.scale.linear() 
.range([0, width]); 

var xAxis = d3.svg.axis() 
.scale(x) 
.orient("bottom"); 

x.domain(d3.extent(data, function(d) { return d.age; })); 

jeśli d.age jest liczbą całkowitą (jak 1; 2; 3 itd), to działa dobrze. Ale chcę ciągi na osi X. jak ("holandia", "Anglia", "Belgia").

Jeśli więc d.age jest liczbą całkowitą, rysuje wykres w porządku, jeśli d.age jest ciągiem, nic nie rysuje.

Próbowałem też zamiast liniowego używać liczby porządkowej, ale dało to nieprawidłowy wykres. (dziwne wyglądające linie ...).

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

Odpowiedz

17

Jeśli chcesz użyć wartości kategorycznych na osi, potrzebujesz skali kategorycznej (porządkowej). Spójrz na the documentation. Twój kod będzie wyglądać

var x = d3.scale.ordinal().rangeRoundBands([0, width]); 
var xAxis = d3.svg.axis().scale(x).orient("bottom"); 

x.domain(data.map(function(d) { return d.country; })); 

pamiętać, że ta wykorzystuje map wyodrębnić wartości ciągów - to mogą lub nie mogą być realizowane w danej przeglądarce, patrz here więcej szczegółów.

+0

Dzięki za ciebie reakcji, wiedziałem, że muszę skali porządkowej, ale to dało taki dziwny wykres .. (zapętlenie linie itp). Ale użyłem range zamiast rangeRandsBands. Rozwiązało to problem (teraz mam tylko niewielki problem, że punkty i xaxis nie są na tym samym poziomie (widać pewne przesunięcie)). –

+0

Zastanawiam się, dlaczego używać rangeRoundBands zamiast rangeBands? Wygląda na to, że unika artefaktów antyaliasingu, ale nie jest pewien, czy był inny powód, dla którego go używałeś. Dzięki. – yoyodunno

+0

To jedyny powód. –

5

Zastosowanie

var x = d3.scale.ordinal().rangePoints([0, width]); 

Oto Fiddle link http://jsfiddle.net/sk2Cf/

+0

dzięki za twoją reakcję. Rozwiązanie to zostało już rozwiązane powyżej, ale to rozwiązanie, które podałeś, również zadziałało. Będę o tym pamiętać. –

+0

Dzięki! Nie mogłem sobie wyobrazić bardziej eleganckiego rozwiązania. –

+0

Właśnie znalazłem to pytanie i wypróbowałem skrzypce, ale ma ten sam problem co obecnie w moim kodzie: Pozycja x wykresu nie jest taka sama jak pozycja x etykiet skali x. Możesz to zobaczyć lepiej, jeśli usuniesz interpolację. Pozycja x linii jest tam, gdzie znajdowałaby się górna lewa pozycja paska, gdyby był to wykres słupkowy. – kel