2012-11-12 92 views
8

我使用d3渲染簡化的甘特圖,使用d3.behavior.zoom進行平移和縮放。 x規模是一個時間尺度(略微修改爲在列中等日曆日期等)並且可以很好地工作,但是我在決定如何縮放/平移y尺度時存在問題,其範圍是任務列表這往往是太多,以適應圖表區域,所以需要平移/縮放。平移/縮放序號?

有沒有辦法告訴默認的序號比例對縮放/平移事件做出反應,還是我應該寫一個自定義比例?如果我需要編寫自定義比例,最好根據d3.scale.ordinal(它存儲整個任務列表,並僅使用可見子集作爲其域)或d3.scale。線性(然後實現類似於距離帶的序數標度等)。

還是有什麼我失蹤(完全可能,因爲它是我的第一個項目使用d3)?

回答

3

從我以前的答案略微擴大,因爲我已私下聯繫到解釋我是如何做到的。

首先,應用程序的屏幕截圖,主要工作是聚合並顯示從各種來源(PowerPoint文件,企業數據庫等)收集的計劃數據。

screenshot

相關位是正確的縱軸與彩色圓點,每個圓點代表一個項目的努力和參與組織。軸上的灰色區域是d3.js畫筆,可以進行平移/調整大小以實時更改圖表/表格數據。

// the axis is a regular ordinal axis, with a brush 
y2 = d3.scale.ordinal(), 
brush = d3.svg.brush().y(y2).on('brush', brushReact), 
// [...] 
// brush event handler 
function brushReact() { 
    if (tasksSlice == null) 
     return; 
    var yrb = y2.rangeBand(), 
     extent = brush.extent(), 
     s0 = Math.round(extent[0]/yrb), 
     s1 = Math.round(extent[1]/yrb); 
    if (s0 == tasksSlice[0] && s1 == tasksSlice[1]) 
     return; 
    tasksSlice = [s0, s1]; 
    inner.refresh(); 
} 

的處理程序中,會發生什麼是相當簡單:

  • 拿到刷程度
  • 它移植到索引中我的數據陣列
  • 片我的數據陣列,並設置結果作爲數據顯示
  • 刷新圖表和表

我希望這可以清除它。

2

原來這並不難,我只好:

  • 編寫自定義的規模,幾乎等於d3.scale.ordinal,只不過它存儲的全方位域值,並實現了切片( [min,max])方法設置可見域值的範圍
  • 跟蹤縮放事件回調中的y轉換增量,並將其添加到存儲總計y轉換的變量
  • 檢查總轉換量是> =比兩個範圍值之間的y增量,如果它是檢查我們還沒有在(可見或不可見)域之一上(0或長度),如果我們不增加或減少切片索引1,重置總轉換變量,然後重畫軸
+0

你能發表一個片段嗎?謝謝! – Dan

+0

對於某些示例代碼+1。 – Thomas

+0

舉一個例子會很棒,謝謝! – Kristoffer