2017-07-14 106 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 –