首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有图例的D3副图

有图例的D3副图
EN

Stack Overflow用户
提问于 2014-02-17 19:46:55
回答 1查看 8.8K关注 0票数 6

我有一张显示人口总数的美国合唱地图。我想在地图上添加一个显示分位数范围值的图例,我见过关于这个主题的其他类似问题,但似乎无法让它适用于我的具体情况。我知道我需要包括颜色范围或颜色域,但只是不确定这是正确的方式。到目前为止,只有一个特性出现在图例中,可能是所有的图例功能都互相堆叠在一起。我怎么才能确定,怎么才能解决这个问题。

代码语言:javascript
复制
//Define default colorbrewer scheme
var colorSchemeSelect = "Greens";
var colorScheme = colorbrewer[colorSchemeSelect]; 

//define default number of quantiles
var quantiles = 5;

//Define quantile scale to sort data values into buckets of color
var color = d3.scale.quantile()
   .range(colorScheme[quantiles]);

d3.csv(data, function (data) {
    color.domain([
         d3.min(data, function (d) {
           return d.value;
         }),
         d3.max(data, function (d
           return d.value
         }) 
    ]);

//legend                            
var legend = svg.selectAll('rect')
    .data(color.domain().reverse())
    .enter()
    .append('rect')
    .attr("x", width - 780)
    .attr("y", function(d, i) {
       return i * 20;
    })
   .attr("width", 10)
   .attr("height", 10)
   .style("fill", color);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-18 00:47:26

如果你有一个序号的话,你使用的图例代码就会工作得很好,其中域是由离散的值组成的,这些值与一一对应的颜色范围有关。但是你用的是分位数,所以需要一种不同的方法。

对于d3分位标度,域是所有可能的输入值的列表,范围是离散输出值的列表。按升序对域列表进行排序,然后将其划分为大小相等的组,这些组从范围内分配给每个输出值。组数由输出值的数目决定。

考虑到这一点,为了获得每种颜色的一个图例条目,您需要使用您的颜色刻度的范围,而不是域,作为您的图例的数据。然后,您可以使用quantileScale.invertExtent()方法找到用该颜色绘制的最小和最大输入值。

示例代码,使每个图例条目都成为包含彩色矩形和显示相应值的文本标签的<g>

代码语言:javascript
复制
var legend = svg.selectAll('g.legendEntry')
    .data(color.range().reverse())
    .enter()
    .append('g').attr('class', 'legendEntry');

legend
    .append('rect')
    .attr("x", width - 780)
    .attr("y", function(d, i) {
       return i * 20;
    })
   .attr("width", 10)
   .attr("height", 10)
   .style("stroke", "black")
   .style("stroke-width", 1)
   .style("fill", function(d){return d;}); 
       //the data objects are the fill colors

legend
    .append('text')
    .attr("x", width - 765) //leave 5 pixel space after the <rect>
    .attr("y", function(d, i) {
       return i * 20;
    })
    .attr("dy", "0.8em") //place text one line *below* the x,y point
    .text(function(d,i) {
        var extent = color.invertExtent(d);
        //extent will be a two-element array, format it however you want:
        var format = d3.format("0.2f");
        return format(+extent[0]) + " - " + format(+extent[1]);
    });
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21838013

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档