我刚刚遇到了同样的问题,并找到了适合我的用例的解决方法 - YMMV。
基本上,我的理解(来自 NVD3 的源代码)是您确实只能为系列设置颜色,而不是为单个点设置颜色:因此,我确实color: '#rrggbb'
像在示例中所做的那样向值对象添加了一个项目(只是因为它更容易我来构建这样的数据结构),然后从中设置每个系列的颜色值(我正在使用 underscore.js,但您应该能够在纯 JavaScript 中执行此操作):
final_groups = _.map(groups, function(values, group_id) {
return { key: group_id, color: values[0].color, values: values };
});
如果您需要使用颜色连续体而不是逐点设置颜色或使用离散比例,我使用mbostock 的这个答案的建议让 D3 为我生成颜色值:
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);
}
这应该可以解决问题。我的最后一步是隐藏图例,因为在这种情况下这没有多大意义。
至于在 tooltip 中显示 z 值,需要重写 scatterChart() 的默认 tooltipContent() 函数,例如
var chart = nv.models.scatterChart()
.showDistX(true)
.showDistY(true)
.tooltipContent(function(key, x, y, obj) {
return '<h3>' + obj.point.label + ' (' + key + ')</h3>';
});
您可以根据需要对其进行自定义 - 如果您只是console.log(arguments);
在函数的开头添加,您可以在浏览器的开发人员工具中准确检查哪些数据可供您在工具提示中使用:
[...]
.tooltipContent(function(key, x, y, obj) {
console.log(arguments);
return '<h3>' + obj.point.label + ' (' + key + ')</h3>';
});