【发布时间】:2017-07-16 01:06:30
【问题描述】:
我目前正在使用以下指南在 Angular 2 中构建等值线图: http://cartographicperspectives.org/index.php/journal/article/view/cp78-sack-et-al/1359
到目前为止,除了d3.scaleQuantile().range() 函数之外,一切都运行良好。
在 d3 版本 3 中,上述函数曾经是 d3.scale.quantile().range()。
在上面使用版本 3 的地图教程中,d3.scale.quantile().range() 接受颜色列表:[“#D4B9DA”,“#C994C7”, “#DF65B0”, “#DD1C77”, “#980043”]。但是,当我放入相同的列表时,这似乎不适用于版本 4 中的新 d3.scaleQuantile().range() 函数。
控制台给出Type 'string' is not assignable to type 'number'.)的错误,而在Webstorm中,错误显示Argument types do not match parameters
如果有人能指出如何使用范围函数设置颜色的正确方向,我将不胜感激。以下代码的相关部分。
colorScale(csvData: any): any {
var range = [];
var color = d3.scaleQuantile()
.range(range);
var domainArray = [];
for (var i in csvData){
domainArray.push(Number(csvData[i]["PROP"]));
};
//pass array of expressed values as domain
color.domain(domainArray);
return color; //return the color scale generator
}
choropleth(d: any, recolorMap: any): any{
//get data value
var value = d.properties["PROP"];
//if value exists, assign it a color; otherwise assign gray
if (value) {
return recolorMap(value);
} else {
return "#ccc";
};
};
buildMap(csvData: any){
//code removed to keep short
var recolorMap = this.colorScale(csvData);
this.g = this.svg.append("g")
.selectAll("path")
.data(xFeatures)
.enter()
.append("path")
.attr("d", this.geoPath)
.style("fill", (d) => { //color enumeration units
return this.choropleth(d, recolorMap)
});
}
【问题讨论】:
-
csvData的值是多少?看起来可能存在解析错误,因为您正在将csvData[i]['PROP']转换为数字。 -
csvData变量是 csv 数据,其中包含应用于每个状态的名称和数字。我查看了它并做了一堆控制台日志语句来查看正在传递的内容并检查了它。范围函数似乎只需要一个数字数组,而不是一个字符串数组。 -
对于您发布的代码块,您调用
d3.scaleQuantile().range(range),但此时range是一个空数组。那是你遇到问题的地方吗?还是您没有发布代码的其他地方? -
我可能不小心把它漏掉了。我正在使用示例中的颜色列表。几个小时后,我找到了解决方案。 d3 的打字稿
typings似乎要求范围内的任何内容都必须是数字数组。所以我将import * as d3 from "d3"切换到var d3: any = require('d3')(我相信它只是获取了d3 的常规javascript 对象),并且不再有range() 函数的类型限制。感谢您的帮助。
标签: javascript angular d3.js