2016-12-11 54 views
1

我在D3.js v4上有一個熱圖,我試圖給它增加縮放和平移功能。縮放只能在x軸上工作,並不會改變y軸。有關縮放部分低於:在D3.js/v4中放大熱圖重繪

var x = d3.scaleTime().range([0, width]).domain([minDate, maxDate]); 
var xAxis = d3.axisBottom().scale(x); 
var zoom = d3.zoom().scaleExtent([1, 2]) 
      .translateExtent([[80, 20], [width, height]]) 
      .on("zoom", zoomed); 

svg.call(zoom); 

function zoomed() { 
    xAxis.scale(d3.event.transform.rescaleX(x)); 
    svg.select(".x.axis").call(xAxis); 
    update(); 
} 

function update() { 
    svg.selectAll(".cell") 
     .attr('clip-path', 'url(#plotAreaClip)') 
     .attr("x", function (d) { return x(d.timestamp); }) 
     .attr("y", function (d) { return y(d.hour); }) 
     .attr("width", function (d) { return x(d3.timeWeek.offset(d.timestamp, 1)) - x(d.timestamp); }) 
     .attr("height", function (d) { return y(d.hour + 1) - y(d.hour); }) 
     .attr("fill", function (d) { return colorScale(d.value); }); 
} 

當我真正在zoomed()功能註釋掉update(),我可以看到,軸/出來就好放大。但是當update()在函數中時,它只會刪除圖表中的所有矩形。

JS小提琴鏈接是https://jsfiddle.net/7z1f4c5p/(我不知道上傳csv文件到JSFiddle的方法,所以我不得不把整個數據寫到JS部分,對不起,代碼在底部。第97行,變焦將無法正常工作。

+0

小提琴缺少代碼 –

回答

1

你需要在你的update()應用新的刻度值。

function update() { 
    // update: cache rescaleX value 
    var rescaleX = d3.event.transform.rescaleX(x); 
    svg.selectAll(".cell").attr('clip-path', 'url(#plotAreaClip)') 
     // update: apply rescaleX value 
     .attr("x", function(d) { 
      return rescaleX(d.timestamp); 
     }).attr("y", function(d) { 
      return y(d.hour); 
     }) 
     // update: apply rescaleX value 
     .attr("width", function(d) { 
      return rescaleX(d3.timeWeek.offset(d.timestamp, 1)) - rescaleX(d.timestamp); 
     }).attr("height", function(d) { 
      return y(d.hour + 1) - y(d.hour); 
     }).attr("fill", function(d) { 
      return colorScale(d.value); 
     }); 
} 

看起來像在clipPathrect沒有widthheight

// update: set widht and height of clippath rect 
plotArea.append("clipPath") 
    .attr("id", "plotAreaClip") 
    .append("rect") 
    .attr('width', width) 
    .attr('height', height); 
    //.attr({width: width, height: height}); 

這裏的工作小提琴 - https://jsfiddle.net/7z1f4c5p/2/

您需要調整圖的左邊和右邊的空間。看起來像縮放時有點關閉。

+0

謝謝。是否也可以使用'var rescaleX = d3.event.transform.rescaleX(x).clamp(true);'而不是'clipPath'?它爲我工作,但我想確定。 – nope

+0

在視覺上它們可能看起來很相似。區別在於'clamp(true)'標尺的輸出被強制在範圍內,在你的情況下'[0,width]'。如果使用clipPath,則輸出將按原樣進行縮放。 clipPath之外的任何內容都將不可見。簡單的方法來看看這是檢查圖中第一個矩形的元素。通過'clamp(true)',矩形x是'0'。使用'clipPath',而不應用'clamp(true)',x位置爲負值,因爲它位於'clipPath'區域之外並且在縮放範圍之外,所以它將不可見。 – phoa