2016-11-13 111 views
1

我正在用https://bl.ocks.org/d3noob/5028304中的示例製作一個d3 Sankey圖。此示例適用於較小的數據集。當我切換到使用更大的數據集時,可視化中斷。看起來問題是dy值變爲負值。大數據集中斷d3 sankey圖

在控制檯中,錯誤的是:

Error: <rect> attribute height: A negative value is not valid. ("-9.02557856272838") 

代碼它指向的是:

node.append("rect") 
    .attr("height", function(d) { return d.dy; }) 

這也許是因爲該地塊要關閉屏幕?我看着使用D3尺度,但我不知道如何實現它們。也許是這樣的:

d3.scale.ordinal() 
.domain(data.map(function(d) { return d.name; })) 
.rangeRoundBands([0, height], .2); 

或者,也許有一種方法來縮小可視化數據集變得越來越大,這樣一切都會適合於容器中。

這裏是我的代碼:https://plnkr.co/edit/hOjEBHhS7vfajD2wb8t9?p=preview

回答

1

945個節點和2463間的聯繫,也沒有辦法,這是去適應在740像素高度的容器。不僅如此,你還得問問自己「這個dataviz如何能夠爲讀者提供大量的信息?」。但既然這不關我的事,你可以做幾件事:

第一個,當然是過濾你的數據。如果這不是一種選擇,你可以增加容器高度:

height = 3000 - margin.top - margin.bottom; 

,減少節點的填充:

var sankey = d3.sankey() 
    .nodeWidth(36) 
    .nodePadding(1) 
    .size([width, height]); 

結果是在這個plunker:https://plnkr.co/edit/Idb6ZROhq1kuZatbGtqg?p=preview

但如果連這不是一種選擇,您可以更改sankey.js代碼,或者在惰性解決方案中避免使用此負數:

.attr("height", function(d) { return d.dy < 0 ? 0 : d.y; }) 

這就是結果:https://plnkr.co/edit/tpaMpK5yXwYh9MEo8hgn?p=preview