【问题标题】:Colorbrewer in D3 & ScalesD3 和​​ Scales 中的 Colorbrewer
【发布时间】:2016-05-01 19:55:18
【问题描述】:

我有一个 geoJSON 看起来像这样

{"type":"FeatureCollection",
"crs":{"type":"name",
"properties":{"name":"urn:ogc:def:crs:OGC:1.3:CRS84"}},
"features":[{"type":"Feature",
"properties":{"scalerank":10,"natscale":1,"labelrank":8,"featurecla":"Admin-1 capital","name":"Colonia del Sacramento","namepar":null,"namealt":null,"diffascii":0,"nameascii":"Colonia del Sacramento","adm0cap":0,"capalt":0,"capin":null,"worldcity":0,"megacity":0,"sov0name":"Uruguay","sov_a3":"URY","adm0name":"Uruguay","adm0_a3":"URY","adm1name":"Colonia","iso_a2":"UY","note":null,"latitude":-34.479999,"longitude":-57.840002,"changed":4,"namediff":1,"diffnote":"Added missing admin-1 capital. Population from GeoNames.","pop_max":21714,"pop_min":21714,"pop_other":0,"rank_max":7,"rank_min":7,"geonameid":3443013,"meganame":null,"ls_name":null,"ls_match":0,"checkme":0},
"geometry":{"type":"Point","coordinates":[-57.8400024734013,-34.4799990054175]
}}]
}

我想设置为使用colorbrewer 来选择颜色,具体取决于pop_max 的值。然后我想通过在传单的顶部覆盖svgleaflet map 上显示这个点数据。我可以轻松地显示点并选择颜色:

var feature = g.selectAll("path")
.data(collection.features)
.enter()
.append("path")
.style("fill", function(d) {
    if(d.properties.pop_max) < 1000 {
        return("red")
    } else if {....
    };
});

但是,不方便。

所以我尝试了:

var colorScale = d3.scale.quantize()
.range(colorbrewer.Greens[7])
.domain(0,30000000);

var feature = g.selectAll("path")
.data(collection.features)
.enter()
.append("path")
.style("fill", function(d) {
    colorScale(d.properties.pop_max);
});

这根本不显示任何点...请注意,我估计了我的域。 0 不一定是最低的数字,也不一定是最高的 30000000。 有什么想法吗?

【问题讨论】:

    标签: javascript d3.js svg colors leaflet


    【解决方案1】:

    首先你需要找到最大值和最小值pop_max,这样的东西应该可以工作:

    var extent = d3.extent(geojson.features, function(d) { return d.properties.pop_max; });
    

    其次,由于您希望颜色代表 7 个值范围,您应该使用 d3.scale.threshold

    var N = 7,
        step = (extent[1] - extent[0]) / (N + 1),
        domain = d3.range(extent[0], extent[1] + step, step);
    var colorScale = d3.scale.threshold()
        .domain(domain)
        .range(colorbrewer.Greens[N]);
    

    编辑

    看起来quantile 可以更轻松地做到这一点:

    d3.scale.quantile()
     .domain([extent[0], extent[1]])
     .range(colorbrewer.Greens[N]);
    

    【讨论】:

    • 我认为 colorbrewer/d3.scale 的美是它自己完成所有这些吗?我只是给它一个最小值和最大值的域,它创建类然后根据类为我的数据着色?!为什么我需要所有这些计算?虽然不起作用..
    • @Chrissl,你是对的,因为你的范围是连续量化的,应该适用于此。你上面的错误是 domain 应该是一个 array
    • 它看起来像 3.extent(geojson.features... 函数没有返回它应该是什么。它说TypeError: Cannot read property 'pop_max' of undefined未定义。
    • @Chrissl,在你的问题中尝试使用 geojson 的 sn-p,它对我有用。
    • @Chrissl,如果你能创建一个 jsfiddle 或 plunkr,我会看看。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多