2013-10-25 4 views
3

Добрый день,цвет заливки пути в d3

Coder, я новичок в d3 и json. Я хочу создать простую проекцию карты, которая будет определять население каждой страны, которая была сохранена в CSV-файле.

Я уже создал картографическую проекцию, и теперь я запас почти неделю о том, как заполнить страну на основе населения на мой файл CSV ..

В этом коде ниже можно определили высокий или низкий население мира, используя круг, но я не люблю использовать круг просто потому, что он может перекрывать друг друга, все, что я хочу, - это заполнить страну зеленым, синим или красным красным цветом, самым высоким, а зеленый - самым низким.

вот мой пример CSV файл

страна, население, широта, долгота ФИЛИППИНЫ, 10, 13, 122 КАНАДА, 2000, 60, -95 JAPAN, 500, 36, 138 АФГАНИСТАН, 200 , 33, 65 Китай, 2000, 35, 105

вот мой код

<!DOCTYPE html> 
<meta charset="utf-8"> 
<style> 

path { 
    fill: silver; 
} 

div.tooltip { 
    position: absolute;   
    text-align: center;   
    width: 140px;     
    height: 45px;     
    padding: 2px;    
font: 12px sans-serif;   
    background: lightsteelblue; 
    border: 0px;  
    border-radius: 8px;   
pointer-events: none; 
z-index:50;   
} 

.overlay { 
fill: none; 
pointer-events: all; 
} 

    .state { 
    fill: #aaa; 
    } 

    .county-border, 
    .state-border { 
fill: none; 
stroke: #fff; 
stroke-linejoin: round; 
stroke-linecap: round; 
} 


.frame { 
    stroke: #333; 
    fill: none; 
    pointer-events: all; 
    } 
.feature { 
    stroke: #ccc; 
    } 

    </style> 
<body> 
<!--<script src="http://d3js.org/d3.v3.min.js"></script> 
<script src="http://d3js.org/topojson.v1.min.js"></script>--> 
<script src="Script/d3.v3.min.js"></script> 
<script src="Script/topojson/topojson.js"></script> 
<script src="Script/queue-master/queue.min.js"></script> 
<script> 

    // <script src="http://d3js.org/d3.v2.js"></script> 


    <div id="d"></div> 
    <script> 


    var MalwareCountry = [ 
    // "Australia", "Algeria", 
     //"Brunei", "Cameroon", 
      "Canada", "Cyprus", 
     "Philippines", "Manila", 
     // "United States of America", "Washington D.C", 
     //"Mexico", "Mexico", 
     //"New Zealand", 
//"Hong Kong", 
//"India", 
//"Indonesia", 
"China","Beijng", 
"Japan", "Tokyo", 
"Afghanistan" 
//"Singapore", 
//"South Korea", 
//"Taiwan", 
//"Thailand", 
//"Vietnam", 
//"Austria", 
//"Belgium", 
//"France", 
//"Germany", 
//"Iran", 
//"Ireland", 
//"Israel", 
//"Italy", 
//"Luxembourg", 
//"Netherlands", 
//"Russia", 
//"Saudi Arabia", 
//"Spain", 
//"Switzerland", 
//"Turkey", 
//"United Arab Emirates", 
//"United Kingdom", 
//"Albania", 
//"Bosnia and Herzegowina", 
//"Crotia", 
//"Czech Republic", 
//"Hungary", 
//"Denmark", 
//"Finland", 
//"Iceland", 
//"Macedonia", 
//"Montenegro", 
//"Norway", 
//"Poland", 
//"Romania", 
//"Serbia", 
//"Slovenia", 
//"Slovakia", 
//"Sweden", 
//"Bulgaria", 
//"Malaysia", "Mozambique" 

    ]; 

    var div = d3.select("div") 
    .append("div") 
     .attr("class", "tooltip") 
     .style("opacity", .1); 

var coldomain = [50, 150, 350, 750, 1500] 
var extcoldomain = [10, 50, 150, 350, 750, 1500] 
var legendary_labels = ["< 50", "50+", "150+", "350+", "750+", "> 1500"] 
    var color = d3.scale.threshold() 
     // .domain(coldomain) 
     //.range(["#adfcad", "#ffcb40", "#ffba00", "#ff7d73", "#ff4e40", "#ff1300"]); 



     var color = d3.scale.category20b() 





    function getColorForCountry(name){ 
    if (MalwareCountry.indexOf(name) < 0) { 
     return "#FFFFFF"; 
     //return "#bbb"; 
    }else { 

     return color(); 
    } 
} 

var margin = { 
    top: 0, right: 0, 
    bottom: 0, left: 0 
}, 
    width = 960 - margin.left - margin.right, 
    height = 480 - margin.top - margin.bottom; 

var projection = d3.geo.equirectangular() 
    .center([0, 5]) 
    .scale(150) 
    .translate([width/2, height/2]) 
    .rotate([0, 0]) 
    .precision(.9); 

var path = d3.geo.path() 
    .projection(projection); 
var zoom = d3.behavior.zoom() 
    .translate(projection.translate()) 
    .scale(projection.scale()) 
    .scaleExtent([height, 10 * height]) 
    .on("zoom", move); 


var svg = d3.select("body").append("svg") 
    .attr("width", width + margin.left + margin.right) 
    .attr("height", height + margin.top + margin.bottom) 
.append("g") 
    .attr("transform", "translate(" + margin.left + "," + margin.top + ")") 
    .call(zoom); 


var feature = svg.append("g") 
    .selectAll(".feature"); 

svg.append("rect") 
    .attr("class", "frame") 
    .attr("width", width) 
    .attr("height", height); 


d3.json("Script/topojson/examples/worldmap-100.json", function(data) { 
    feature = feature 
     .data(data.features) 
     .enter().append("path") 
     .attr("class", "feature") 
     .attr("d", path) 
     .style("fill", function (d) { return getColorForCountry(d.properties.name) }); 
}); 

var g = svg.append("g"); 
d3.csv("data/s.csv", function (error, data) { 

    var circle = g.selectAll("circle") 
    .data(feature) 
    .enter() 
    .append("circle") 

    .attr("cx", function (d) { return projection([d.lon, d.lat])[0]; }) 
    .attr("cy", function (d) { return projection([d.lon, d.lat])[1]; }) 
    .attr("r", function (d) { return Math.sqrt(d.population)/2 }) 
     .style("fill", function (d) { 
      if (d.population >= 500 && d.population <= 800) { 
       return "blue" 
      } 

      else if (d.population >= 800) { 
       return "red" 
      } 
      else { 
       return "green" 
      } 
     }) 
}) 

function move() { 
    projection.translate(d3.event.translate).scale(d3.event.scale); 
    feature.attr("d", path); 
} 

var legend = svg.selectAll("g.legend") 
    .data(extcoldomain) 
    .enter().append("g") 
    .attr("class", "legend"); 

var ls_w = 20, ls_h = 20; 

legend.append("rect") 
.attr("x", 20) 
.attr("y", function (d, i) { return height - (i * ls_h) - 2 * ls_h; }) 
.attr("width", ls_w) 
.attr("height", ls_h) 
.style("fill", function (d, i) { return color(d); }) 
.style("opacity", 0.8); 

legend.append("text") 
.attr("x", 50) 
.attr("y", function (d, i) { return height - (i * ls_h) - ls_h - 4; }) 
.text(function (d, i) { return legendary_labels[i]; }); 

</script> 

есть ли трюк, который может помочь мне по поводу этой проблемы.

спасибо

ответ

2

От чего я понимаю, вы хотите покрасить разные страны разных цветов. Самый простой способ сделать это, чтобы создать цветовую гамму с на застроенной в D3 цветовых гамм, поэтому заменить эту строку:

var color = d3.scale.threshold() 

с этим

var color = d3.scale.category10() 

документации можно найти here

Тогда вам просто нужно использовать это, чтобы создать подходящую страну, как в последней строке. Это захватывает цвет из шкалы, основанный на индексе (i).

feature = feature.data(data.features) 
      .enter().append("path") 
      .attr("class", "feature") 
      .attr("d", path) 
      .style("fill", function (d,i) { return color(i) }); 
1

Я думаю, что последняя часть должна быть следующей (с return)

feature = feature.data(data.features) 
     .enter().append("path") 
     .attr("class", "feature") 
     .attr("d", path) 
     .style("fill", function (d,i) { return color(i) }); 
+1

Этот ответ не дает ответа на вопрос; вместо этого это комментарий для [этого ответа] (http://stackoverflow.com/a/19585583/2038264), который с тех пор был исправлен. – congusbongus

Смежные вопросы