tôi vừa chạy vào cùng một vấn đề và tìm thấy một workaround phù hợp sử dụng của tôi trường hợp - YMMV.
về cơ bản, sự hiểu biết của tôi (từ mã nguồn của NVD3) là bạn thực sự chỉ thiết lập màu cho chuỗi, chứ không phải cho từng điểm riêng lẻ, do đó tôi thêm mục color: '#rrggbb'
vào đối tượng giá trị như bạn làm trong ví dụ của mình (chỉ vì tôi dễ dàng xây dựng cấu trúc dữ liệu như thế này), sau đó đặt giá trị màu của mỗi chuỗi từ này (tôi đang sử dụng underscore.js nhưng bạn có thể thực hiện điều này trong JavaScript thuần túy):
final_groups = _.map(groups, function(values, group_id) {
return { key: group_id, color: values[0].color, values: values };
});
Nếu bạn cần sử dụng màu liên tục thay vì đặt màu theo điểm hoặc sử dụng thang rời rạc, tôi đã sử dụng mbostock's advice from this answer để cho D3 tạo giá trị màu cho tôi:
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);
}
Điều này cần thực hiện thủ thuật. Cảm giác cuối cùng của tôi là giấu huyền thoại vì điều đó sẽ không có ý nghĩa gì nhiều trong trường hợp này.
Để hiển thị giá trị z trong chú giải công cụ, bạn cần ghi đè hàm tooltipContent() mặc định của scatter(), ví dụ:
var chart = nv.models.scatterChart()
.showDistX(true)
.showDistY(true)
.tooltipContent(function(key, x, y, obj) {
return '<h3>' + obj.point.label + ' (' + key + ')</h3>';
});
Bạn có thể tùy chỉnh này càng nhiều càng cần thiết - nếu bạn chỉ cần thêm console.log(arguments);
vào đầu của hàm, bạn có thể kiểm tra trong các công cụ nhà phát triển của trình duyệt của bạn chính xác mà dữ liệu có sẵn để bạn có thể sử dụng trong tooltips của bạn:
[...]
.tooltipContent(function(key, x, y, obj) {
console.log(arguments);
return '<h3>' + obj.point.label + ' (' + key + ')</h3>';
});