2015-02-07 95 views
0

我在學習如何使用d3.js hexbin插件。d3 hexbin縮放問題

我從例子開始:http://bl.ocks.org/mbostock/4248145,我正在調整它。

我有一個數據集[0,0]和[600,600]之間的點。我想輸出他們到一個300,300圖。

我的圖形看起來不正確。它看起來像數據沒有正確縮放,圖表只顯示了1/4的數據。有人能告訴我什麼是錯的嗎?我讀過一本關於使用d3的書,但我沒有太多的使用經驗。

Jsfiddle of my hexbin

var graph_width = 300; 
var graph_height = 300; 

var data_width = 600; 
var data_height = 600; 

var randomX = d3.random.normal(data_width/2, 80), 
    randomY = d3.random.normal(data_height/2, 80), 
    points = d3.range(2000).map(function() { return [randomX(), randomY()]; }); 

var color = d3.scale.linear() 
    .domain([0, 20]) 
    .range(["white", "steelblue"]) 
    .interpolate(d3.interpolateLab); 

var hexbin = d3.hexbin() 
    .size([graph_width, graph_height]) 
    .radius(20); 

var x = d3.scale.linear() 
    .domain([0, data_width]) 
    .range([0, graph_width]); 

var y = d3.scale.linear() 
    .domain([0, data_height]) 
    .range([0, graph_height]); 

var svg = d3.select("body").append("svg") 
    .attr("width", graph_width) 
    .attr("height", graph_height) 
    .append("g"); 

svg.append("clipPath") 
    .attr("id", "clip") 
    .append("rect") 
    .attr("class", "mesh") 
    .attr("width", graph_width) 
    .attr("height", graph_height); 

svg.append("g") 
    .attr("clip-path", "url(#clip)") 
    .selectAll(".hexagon") 
    .data(hexbin(points)) 
    .enter().append("path") 
    .attr("class", "hexagon") 
    .attr("d", hexbin.hexagon()) 
    .attr("transform", function(d) { return "translate(" + d.x + "," + d.y + ")"; }) 
    .style("fill", function(d) { return color(d.length); });  
+0

我不明白這個問題,你的點數組正在SVG外部生成'd.x'和'd.y'值。 http://jsfiddle.net/vzotsnjm/1/ – Mark 2015-02-07 19:49:42

回答

1

我想我明白。你有數據值在0到600的範圍內,但希望這些映射到範圍0 X/Y位置300

如果僅此而已,然後縮放點:

var x = d3.scale.linear() 
    .domain([0, data_width]) 
    .range([0, graph_width]); 

var y = d3.scale.linear() 
    .domain([0, data_height]) 
    .range([0, graph_height]); 

var randomX = d3.random.normal(data_width/2, 80), 
    randomY = d3.random.normal(data_height/2, 80), 
    points = d3.range(2000).map(function() { return [x(randomX()), y(randomY())]; }); 

更新fiddle