2017-07-14 103 views
1

讓我先說這個,說我對D3.js和編碼一般都是全新的。我是一名信息圖表藝術家,我一直在使用QGIS生成地圖,但我正嘗試使用D3.js爲關於阿片類死亡的故事生成一張全盤地圖。基本上我試圖重新創建這張地圖。 map from the EconomistChoropleth地圖比例尺和圖例

我曾嘗試由邁克·博斯托克使用該map和改變一些參數,但我越來越堅持的色彩範圍和規模啓動。測量值爲每十萬人中有一個。我有一個域名,起始於1.543385761,結束於131.0814217。

我與掙扎的代碼是圍繞着規模的輸入和輸出:

var x = d3.scaleLinear() 
    .domain([0, 132]) 
    .rangeRound([600, 860]); 

var color = d3.scaleThreshold() 
    .domain(d3.range(2, 10)) 
    .range(d3.schemeBlues[9]); 

var g = svg.append("g") 
    .attr("class", "key") 
    .attr("transform", "translate(0, 40)"); 

g.selectAll("rect") 
    .data(color.range().map(function(d) { 
     d = color.invertExtent(d); 
     if (d[0] == null) d[0] = x.domain()[0]; 
     if (d[1] == null) d[1] = x.domain()[1]; 
     return d; 
    })) 
    .enter().append("rect") 
    .attr("height", 8) 
    .attr("x", function(d) { return x(d[0]); }) 
    .attr("width", function(d) { return x(d[1]) - x(d[0]); }) 
    .attr("fill", function(d) { return color(d[0]); }); 

我可以看到,我需要一些代碼位將定義一切,在25爲最暗的顏色。我甚至不確定我想成爲我的最後一個傳奇,但我很想知道如何重現這一點。我感到震驚,我能夠得到這麼遠,但現在感覺有點失落。先謝謝你!

+0

我發現幾個例子在這裏:https://d3-geomap.github.io/map/choropleth/us-states/這裏:https://plot.ly/ javascript/choropleth-maps/ – Carson

+0

查看他們的官方文檔網站。 https://d3js.org/。老實說,軟件開發的很大一部分只是知道如何谷歌和找到問題的解決方案......不是全部,而是大多數。 – Carson

回答

0

讓我們來看看你的規模:

var color = d3.scaleThreshold() 
    .domain(d3.range(2, 10)) 
    .range(d3.schemeBlues[9]); 

你的域名是像這樣創建一個數組:

d3.range(2,10) // [2,3,4,5,6,7,8,9] 

這些都是你的閾值,顏色將根據那些值映射小於或等於2,多於兩個多達三個,多於三以及多達四個......並且超過9.該域被映射爲在範圍中定義的九個值:

d3.schemeBlues[9] // ["#f7fbff", "#deebf7", "#c6dbef", "#9ecae1", #6baed6", #4292c6", "#2171b5", "#08519c", "#08306b"] 

要設置的閾值的那些顏色,以便超過25的值是一種顏色,定義與陣列具有相應的閾值(一個或多個)的域:

.domain([2,3,4,5,6,7,8,25]); 

在下面的代碼段中,該域被應用。矩形的顏色取決於它們的位置,在25號之後的所有矩形(從左到右依次逐行計數),其中一個將是一種顏色。

var color = d3.scaleThreshold() 
 
    .domain([2,3,4,5,6,7,8,25]) 
 
    .range(d3.schemeBlues[9]); 
 
    
 
var svg = d3.select("body") 
 
    .append("svg") 
 
    .attr("width",500) 
 
    .attr("height",500); 
 
    
 
var rects = svg.selectAll("rect") 
 
    .data(d3.range(100)) 
 
    .enter() 
 
    .append("rect") 
 
    .attr("width",15) 
 
    .attr("height", 15) 
 
    .attr("y", function(d,i) { return Math.floor(i/10) * 20 + 10 }) 
 
    .attr("x", function(d,i) { return i % 10 * 20 }) 
 
    .attr("fill", function(d) { return color(d); })
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/4.5.0/d3.min.js"></script> 
 
<script src="https://d3js.org/d3-scale-chromatic.v1.min.js"></script>

+0

安德魯....這絕對讓我進一步,但不完全在我需要的地方。我的一部分困惑在於域如何與範圍相關,以及如何將其交給關鍵。在經濟學家的例子中,他們以5的增量增加到25(因此SchemeBlues的顏色爲6步)[6])。我得到了這部分工作,但它似乎錯過了數據集中的一些縣,但沒有顯示在地圖上(似乎是一個閾值問題?)。我也不確定開始於「var rects」的代碼在做什麼,但我似乎無法將其插入到我的地圖代碼中而不會破壞它。 –

+0

這些矩形只是爲了直觀地展示比例尺 - 因爲我沒有數據要在地圖上顯示。閾值(域)5,10,15,20,25的閾值比例具有六個步驟,因此如果您的範圍具有六種有效顏色,則應將任何數值映射到適當的顏色。如果某些縣市都得到正確着色,它可以因爲不是所有的縣都有數據,不是所有的縣IDS排隊與地理要素ID,或者您正在使用的數據字段不包含所有的數值。如果您鏈接到的數據這將有助於(如果需要的話,你可以隨機它) –

+0

我不能附加CSV但這裏的行的第一束: ID,死亡 1003,9.817926552 1009,20.8069634 1073,21.50319444 1097,6.259102782 1117,5.270395232 2020,14.06116607 2122,22.39101604 2170,10.88085464 4003,19.77425708 4005,8.627073194 –