ja właśnie napotkasz ten sam problem i znaleźć sposób obejścia problemu, który pasuje do mojego korzystania sprawa - YMMV.
Zasadniczo moje zrozumienie (z kodu źródłowego NVD3) polega na tym, że w rzeczywistości można ustawić tylko kolor dla serii, a nie dla poszczególnych punktów: dlatego dodam element color: '#rrggbb'
do wartości obiektów tak czy inaczej, jak w przykładzie (tylko dlatego, że łatwiej jest budować strukturę danych w ten sposób), a następnie ustawić dla każdej serii wartość koloru (używam underscore.js, ale powinieneś być w stanie to zrobić w czystym JavaScript):
final_groups = _.map(groups, function(values, group_id) {
return { key: group_id, color: values[0].color, values: values };
});
Jeśli chcesz użyć kolorowego kontinuum zamiast ustawiać kolory punkt po punkcie lub używając dyskretnej skali, użyłem mbostock's advice from this answer, aby pozwolić D3 generować wartości kolorów dla mnie:
function compute_color_on_linear_scale(data, value, colorProperty, colorRange) {
// get a list of all the groups (this works if the colorProperty,
// aka z in your case, is numeric, otherwise the sort function
// needs to be adjusted accordingly)
// In your case, you could just write item.z rather than item[colorProperty]
// if your function doesn't need to be generic, and in that case you can
// omit the colorProperty argument from the argument list altogether
categories = _.uniq(_.map(data, function(item) {
return item[colorProperty];
}).sort(function(a,b){return a - b}), true);
// if no color range was provided, set a default one
if(typeof colorRange === 'undefined') { colorRange = ['red', 'green']; }
// this is mbostock's magic enchantment from his reply linked above
var color = d3.scale.ordinal()
.domain(categories)
.range(d3.range(categories.length).map(d3.scale.linear()
.domain([0, categories.length - 1])
.range(colorRange)
.interpolate(d3.interpolateLab)));
return color(value);
}
To powinno wystarczyć. Ostatnim akcentem było ukrycie legendy, ponieważ nie miałoby to większego sensu w tym przypadku.
Co do wyświetlania wartości z w etykiecie narzędziowej, należy zastąpić domyślną funkcję podpowiedzi funkcji scatterChart(), np.
var chart = nv.models.scatterChart()
.showDistX(true)
.showDistY(true)
.tooltipContent(function(key, x, y, obj) {
return '<h3>' + obj.point.label + ' (' + key + ')</h3>';
});
można dostosować to tyle, ile trzeba - jeśli tylko dodać console.log(arguments);
na początku funkcji, można sprawdzić w deweloperów narzędzi w Twojej przeglądarce dokładnie, które dane są dostępne do wykorzystania w podpowiedzi:
[...]
.tooltipContent(function(key, x, y, obj) {
console.log(arguments);
return '<h3>' + obj.point.label + ' (' + key + ')</h3>';
});