2014-02-17 41 views
5

我有顯示總人口的美國等值線地圖。我想在地圖上添加一個顯示分位數範圍值的圖例。我已經看到關於此主題的其他類似問題,但似乎無法使其適用於我的具體情況。我知道我需要包含顏色範圍或顏色域,但不確定這是否是正確的方法。截至目前,只有一個功能出現在圖例中,可能是所有圖例功能都堆疊在一起。我怎麼知道確切的,我該如何解決這個問題。帶有傳奇色彩的D3等位地圖

//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); 
+0

類似[this](http://bl.ocks.org/KoGor/5685876)?您只需要將輸出顏色的範圍設置爲分位數(即5種顏色)。 –

+0

是的,我希望它與該示例類似。我不想爲像圖例這樣的圖例使用硬編碼值的變量。我希望它使用color.domain和colorScheme變量來填充圖例值。 – bailey

回答

6

,如果你有一個順序量表,其中域是由那些關聯到顏色的範圍在一對一的離散值,您使用得很好會工作傳奇代碼一個基礎。但是你使用分位數,所以需要一個不同的方法。

對於d3 quantile scale,域是所有可能的輸入值的列表,範圍是離散輸出值的列表。域列表按升序排序,然後劃分爲相同大小的組,分配給範圍中的每個輸出值。組的數量由輸出值的數量決定。因此,爲了獲得每種顏色的一個圖例條目,您需要使用顏色比例的範圍,而不是域作爲圖例的數據。然後,您可以使用quantileScale.invertExtent()方法查找使用該顏色繪製的最小和最大輸入值。

示例代碼,使每個圖例條目<g>包含彩色矩形和顯示相應值的文本標籤。

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]); 
    }); 
+2

順便說一下,看看你的代碼的其餘部分,它看起來像你真正想使用的是[d3 *量化*比例](https://github.com/mbostock/d3/wiki/Quantitative-Scales#維基量化)(不*分位數*),其中域是[最小,最大]範圍,並且該尺度將其劃分爲代表相同大小範圍的域變量(而不是相等數量的觀察值)的組。上面的圖例代碼對任何一種類型的比例都適用,因爲在這兩種情況下,組的數量由範圍數組決定,相應的域值可以使用'invertExtent'來訪問。 – AmeliaBR

+0

非常感謝您的深思熟慮的答案!我希望我能夠爲您的答案投票,但我還沒有足夠的聲譽。我只是遇到了示例代碼中的.invertExtent()方法問題。它在控制檯中給我一個錯誤,並沒有顯示與圖例相關的文本。 – bailey

+0

您使用的是最新版本的d3嗎?它[看起來'只有在版本3.2中爲'量化和閾值比例'添加'invertExtent'方法](https://github.com/mbostock/d3/releases/v3.2.0)。使用最新版本:[這是一個帶有量化比例尺的實時版本](http://fiddle.jshell.net/jM5H9); [這裏是分位數](http://fiddle.jshell.net/jM5H9/1/)。我不得不做一些整理修改(格式化函數和文本對齊,我將更新上面的示例代碼),但這些問題都不會導致錯誤。 – AmeliaBR