我正在製作一個網站,用於繪製用戶從大集合中挑選的數據集。爲了標準化圖(用戶選項),我找到了每個數據集的最大值(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) ,也沒有任何慣用的方式將其包含在通話中。