【问题标题】:How to create a diverging data legend on a choroplet map?如何在等值线图上创建发散数据图例?
【发布时间】:2019-11-02 18:45:16
【问题描述】:

我正在尝试使用不同的数据(从 -0.7 到 0.7)创建 choroplet 地图,但找不到让我的图例显示正确颜色的方法。问题是因为当颜色都是正号时总是 > 并且是连续的。现在因为我有负数,它不再起作用了。我该如何纠正这个问题?

    // get color depending on population differentiel value
function getColor(d) {
         return d > 0.7    ? '#b2182b' :
            d > 0.5    ? '#d6604d' :
            d > 0.3    ? '#f4a582' :
            d > 0.1    ? '#fddbc7' :
            d < -0.7   ? '#2166ac' :
            d < -0.5   ? '#4393c3' :
            d < -0.3   ? '#92c5de' :
            d < -0.1   ? '#d1e5f0' :    




                        '#f7f7f7';
}


var legend = L.control({position: 'bottomright'});

legend.onAdd = function (map) {

    var div = L.DomUtil.create('div', 'info legend'),
        grades = [-0.7, -0.5, -0.3, -0.1, 0.1, 0.3, 0.5, 0.7],
        labels = [],
        from, to;

    for (var i = 0; i < grades.length; i++) {
        from = grades[i];
        to = grades[i + 1];

        labels.push(
            '<i style="background:' + getColor(from + 1) + '"></i> ' +
            from + (to ? ' à ' + to : '+'));
    }

    div.innerHTML = labels.join('<br>');
    return div;
};

【问题讨论】:

    标签: html leaflet choropleth


    【解决方案1】:

    问题是因为当颜色都是正号时总是 > 并且是连续的。现在因为我有负数,所以它不再起作用了。

    不,这是因为您在没有任何充分理由的情况下混合了 &gt;&lt;,而不是遵循数字递减的常规模式,例如:

    function getColor(d) {
     return d > 0.7    ? '#b2182b' :
            d > 0.5    ? '#d6604d' :
            d > 0.3    ? '#f4a582' :
            d > 0.1    ? '#fddbc7' :
            d > -0.1   ? '#d1e5f0' :    
            d > -0.3   ? '#92c5de' :
            d > -0.5   ? '#4393c3' :
            d > -0.7   ? '#2166ac' :
                         '#f7f7f7';
    }
    

    现在停止点已对齐,因此每个停止点都是颜色范围的最小值。

    我会更进一步,将停靠点和范围颜色存储在数据结构中,将范围的最小端与相应的颜色相关联:

    var stops = [
        { stop: 0.7, color: '#b2182b' },
        { stop: 0.5, color: '#d6604d' },
        { stop: 0.3, color: '#f4a582' },
        { stop: 0.1, color: '#fddbc7' },
        { stop: -0.1, color: '#d1e5f0' },
        { stop: -0.3, color: '#92c5de' },
        { stop: -0.5, color: '#4393c3' },
        { stop: -0.7, color: '#2166ac' },
        { stop: -Infinity, color: '#f7f7f7' },
    ];
    

    并通过循环遍历该数据结构重新创建 getColor() 函数:

    function getColor(d) {
      for (var i in stops) {
        if (d > stops[i].stop) { return stops[i].color; }
      }
    }
    

    请注意,所有数字都大于-Infinity,因此该数据结构中的最后一项应作为默认情况。

    并通过遍历相同的数据结构来创建图例,继承上一步的范围上限(并将其初始化为 Infinity,因为这是第一个范围的隐式上限):

    var rangeMax = 'Infinity';
    for (var i in stops) {
        var rangeMin = stops[i].stop.toString();
        var rangeColour = stops[i].color;
    
        labels.push(
            '<i style="background:' + rangeColour + '"></i> ' +
            rangeMin + ' à ' + rangeMax
        );
    
        rangeMax = stops[i].stop;
    }
    

    【讨论】:

    • 谢谢,你是救生员!如何将“-infinity”和“infinity”简单地更改为“+”和“-”?现在我看到:0.7 到 Infinity 0.5 到 0.7 .... -Infinity 到 -0.7
    • 我想将“0.7 to Infinity”替换为“大于 0.7”,将“-Infinity to -0.7”替换为“Less than -0.7)”。我该怎么做?
    • 应该是像if (rangeMax === Infinity) {labels.push(rangeMin + '+')}if (rangeMin === -Infinity) {labels.push(rangeMax + '-')} 这样的微不足道的东西
    • 我应该把代码准确地放在哪里?我试过了,但没有用: var rangeMax = 'Infinity'; for (var i in stop) { var rangeMin = stop[i].stop.toString(); var rangeColour = 停止[i].color;标签.push( ' ' + rangeMin + ' à ' + rangeMax ); rangeMax = 停止[i].stop; if (rangeMax === Infinity) {labels.push(rangeMin + '+')} if (rangeMin === -Infinity) {labels.push(rangeMax + '-')} } div.innerHTML = labels.join( '
      ');返回分区; }; legend.addTo(map);
    【解决方案2】:

    getColor(from + 1) 是罪魁祸首。由于“+ 1”,您将永远超出您的规模。

    请注意,即使删除它,您也会丢失最低的图例 (

    【讨论】:

    • 怎样才能做到精准?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-21
    • 1970-01-01
    • 2020-06-12
    • 1970-01-01
    • 1970-01-01
    • 2022-10-15
    • 1970-01-01
    相关资源
    最近更新 更多