2017-06-07 177 views
0

我正在製作一個網站,用於繪製用戶從大集合中挑選的數據集。爲了標準化圖(用戶選項),我找到了每個數據集的最大值(y),我試圖用它作爲我的line().y()中的分母,但是我找不到一個好的方法讓它進入。將附加參數傳遞給d3.svg.line()

的數據集是CSV格式都期待這樣的:

site0586,id,depth,age,sed,quant,conc,influx,level 
1, 94297, 0.1400, 8.390, 0.097, 50.5100, 50.5100, 4.87496, "C0P0" 
2, 94298, 0.1760, 45.690, 0.083, 52.5800, 52.5800, 4.35011, "C0P0" 
3, 94299, 0.2030, 73.660, 0.135, 29.8500, 29.8500, 4.03080, "C0P0" 
... 

默認x和y是「年齡」和「濃」,但用戶可選擇的。用戶選擇數據集,並且他們一個接一個地繪製在同一個圖上。當添加圖時,圖的比例調整以適應整體max-x和max-y以及更早的圖更新以符合。 X可以在數據集之間變化很多,y可以變化五個數量級,因此小值行可以大大減少。得到這個有點過渡,它很好。

有時用戶希望用[0,1]歸一化來看y,所以小值趨勢將在與大值相同的x尺度上可見;這是一個選擇。輕鬆 - 將y域重置爲[0,1],並將每個圖的y除以該數據集的最大值(y)。對於完美工作的點來說,對於線路我有很多麻煩。

這是一個圖,所以我建立了一個數據結構;當用戶選擇我下載的每個數據集時,它將它推送到一個數組上,並且因爲我將在晚些時候需要最大值,當我在那裏時,我找到每個變量的域,將它們放在一個名爲heads並將其附加到嵌套數據。所以,我的數據結構是這樣的:

datae: [ 
{ "key": "300", 
    "values": [ 
    {"site0300": 1, "id": 60383, "depth": 0, ... }, ... 
    {"site0300": 182, ... } 
    ], 
    "heads": { "depth": [0,5.9], "age": [107.4,16589.5], ...} 
}, 
{ "key": "586", 
    "values": [ 
    {"site0586": 1, ...}, ... 
    ], 
    "heads": {...} 
} 
] 

我有我的line().y()設置爲(可能)使用一個分母,可以是1或thisData.max(Y):

var lineFn = d3.svg.line() 
    .x(function(d) { return xScale(d[xVar]) }) 
    .y(function(d) { return yScale(d[yVar]/normer) }); 

除了我無法弄清楚如何讓datae[thisLineIdx].heads[yVar[1]]進入電話:

var lines = graf.selectAll('.line') 
    .data(datae); 

lines.enter() 
    .append('path') 
    .attr("d", function(d) { return lineFn(d.values) }) 

lines每個成員會從權項10但是由於svg.line()只想聽到關於數組的內容(並且不會與其內部進行任何通信),所以只有在我使用datae [thisLineIdx] .values調用數據時才執行任何操作,然後datae [thisLineIdx] .heads是無法訪問。

我可以將所有datae [idx] .heads設置爲全局,但必須有更好的方法 - 我只是無法從line()內計算max(y) ,也沒有任何慣用的方式將其包含在通話中。

回答

0

Ach - duh!在的年齡段一直被困在這個(每週一天),並一直在那裏一半。現在最後的代碼塊:

var lines = graf.selectAll('.line') 
    .data(datae); 

lines.enter() 
    .append('path') 
    .attr("d", function(d) { 
     normer = gOpts.normIt.state ? d.heads[yVar][1] : 1; 
     return lineFn(d.values) }) 

現在我的lineFn()做我想要的,當我想要的。

但是,我不喜歡這個解決方案,因爲它確實會在相關範圍之外以半全局的方式浮動normer(在更高級別聲明),隨時準備引起其他惡作劇。所以我認爲這是愚蠢的方式,如果任何人可以提出更復雜的東西,我會非常感激。