Force-directed graph layout using velocity Verlet integration.(v4)
d3.forceSimulation - 創(chuàng)建一個(gè)新的simulation.
使用指定的節(jié)點(diǎn)數(shù)組創(chuàng)建一個(gè)新的simulation贞滨。如果沒有指定節(jié)點(diǎn)洁段,則默認(rèn)為空數(shù)組铁坎。simulation.restart - 重新啟動(dòng)模擬的內(nèi)部計(jì)時(shí)器。
該方法可用于在交互過程中對(duì)仿真進(jìn)行“再加熱”清焕,如在拖拽節(jié)點(diǎn)時(shí)罕模,或在與仿真暫停后恢復(fù)仿真匹中。simulation.stop - 停止模擬的計(jì)時(shí)器
停止模擬的內(nèi)部計(jì)時(shí)器,如果它正在運(yùn)行朱浴,并返回模擬吊圾。如果計(jì)時(shí)器已經(jīng)停止,則此方法不執(zhí)行任何操作翰蠢。該方法適用于人工運(yùn)行仿真项乒。simulation.tick - 一個(gè)持續(xù)性刷新的function。
手動(dòng)按指定的迭代次數(shù)對(duì)模擬進(jìn)行步驟梁沧,并返回模擬檀何。如果沒有指定迭代,則默認(rèn)為1(單步)廷支。simulation.nodes - set the simulation’s nodes.
如果節(jié)點(diǎn)nodes 被指定频鉴,設(shè)置布局的相關(guān)節(jié)點(diǎn)為指定的nodes 數(shù)組。如果未指定節(jié)點(diǎn)nodes 恋拍,則返回當(dāng)前數(shù)組垛孔,默認(rèn)為空數(shù)組。每個(gè)節(jié)點(diǎn)具有以下屬性:index - nodes 數(shù)組節(jié)點(diǎn)的索引(從零開始)芝囤。
x - 當(dāng)前節(jié)點(diǎn)的x坐標(biāo)位置似炎。
y - 當(dāng)前節(jié)點(diǎn)的位置y坐標(biāo)。
vx -節(jié)點(diǎn)當(dāng)前的x速度
vy -節(jié)點(diǎn)當(dāng)前的y速度
fx -節(jié)點(diǎn)的固定x位置
fy -節(jié)點(diǎn)的固定y位置
simulation.alpha - 設(shè)置當(dāng)前alpha值悯姊。
如果指定了alpha羡藐,則將當(dāng)前alpha設(shè)置為范圍[0,1]中指定的數(shù)值,并返回此模擬悯许。如果沒有指定alpha仆嗦,則返回當(dāng)前alpha值,默認(rèn)值為1先壕。simulation.alphaMin -設(shè)置最小alpha閾值瘩扼。
如果指定了min谆甜,則將最小alpha設(shè)置為范圍[0,1]中指定的數(shù)字,并返回此模擬集绰。如果沒有指定最小值规辱,則返回當(dāng)前的最小alpha值,默認(rèn)值為0.001栽燕。當(dāng)當(dāng)前alpha值小于最小alpha值時(shí)罕袋,模擬的內(nèi)部計(jì)時(shí)器停止。默認(rèn)alpha衰減率~0.0228碍岔,對(duì)應(yīng)300次迭代浴讯。simulation.alphaDecay - 設(shè)定指數(shù)衰減率。
如果指定衰減蔼啦,將衰減率設(shè)置為范圍[0,1]中的指定數(shù)字榆纽,并返回此模擬。如果沒有指定衰減捏肢,返回當(dāng)前衰減率奈籽,默認(rèn)值為0.0228…= 1 - pow(0.001, 1 / 300),其中0.001是默認(rèn)的最小衰減率鸵赫。
衰減率決定了當(dāng)前alpha向目標(biāo)alpha內(nèi)插的速度唠摹。較高的衰減率會(huì)使模擬更快地穩(wěn)定下來,但有可能陷入局部最小值;數(shù)值越低奉瘤,模擬運(yùn)行的時(shí)間越長(zhǎng)勾拉,但通常收斂于更好的布局。要使模擬永遠(yuǎn)以當(dāng)前alpha值運(yùn)行盗温,請(qǐng)將衰減率設(shè)置為零;或者藕赞,設(shè)置一個(gè)大于最小值的目標(biāo)。simulation.alphaTarget - 設(shè)置目標(biāo)的alpha卖局。
如果指定了目標(biāo)斧蜕,將當(dāng)前目標(biāo)alpha設(shè)置為范圍[0,1]中的指定數(shù)字,并返回此模擬砚偶。如果未指定目標(biāo)批销,則返回當(dāng)前目標(biāo)alpha值,默認(rèn)值為0染坯。simulation.velocityDecay - 設(shè)置速度衰減率均芽。
如果指定衰減,則將速度衰減因子設(shè)置為[0,1]范圍內(nèi)的指定數(shù)值单鹿,并返回此模擬掀宋。如果未指定衰減,則返回當(dāng)前速度衰減因子,默認(rèn)值為0.4劲妙。simulation.force - 添加或刪除一個(gè)力湃鹊。
如果指定了力,則指定指定名稱的力并返回此模擬镣奋。如果沒有指定力币呵,則返回未定義的力
例如,要?jiǎng)?chuàng)建一個(gè)新的模擬圖布局侨颈,如下
var simulation = d3.forceSimulation(nodes)
.force("charge", d3.forceManyBody())
.force("link", d3.forceLink(links))
.force("center", d3.forceCenter());
若要?jiǎng)h除具有給定名稱的力富雅,請(qǐng)傳遞null作為該力。例如肛搬,移除電荷力:
simulation.force("charge", null);
simulation.find(x, y[, radius]) - 找到離給定位置最近的節(jié)點(diǎn)。
如果沒有指定半徑毕贼,則默認(rèn)為無窮大温赔。如果搜索區(qū)域內(nèi)沒有節(jié)點(diǎn),則返回undefined鬼癣。simulation.on(typenames, [listener]) - 添加或刪除事件偵聽器陶贼。
如果指定了偵聽器,則設(shè)置指定typenames的事件偵聽器并返回此模擬待秃。如果事件偵聽器已經(jīng)注冊(cè)了相同的類型和名稱拜秧,則在添加新偵聽器之前將刪除現(xiàn)有偵聽器。如果偵聽器為null章郁,則刪除指定的typenames的當(dāng)前事件偵聽器(如果有的話)枉氮。如果未指定偵聽器,則返回與指定的輸入名匹配的第一個(gè)當(dāng)前分配的偵聽器(如果有)
typenames是一個(gè)字符串暖庄,包含一個(gè)或多個(gè)由空格分隔的typename聊替。force - apply the force.
force.initialize(nodes) - 初始化力 。
d3.forceCenter[x, y] - 創(chuàng)建中心力培廓。
center.x - 設(shè)置中心x坐標(biāo)(默認(rèn)為0)惹悄。
center.y - 設(shè)置中心y坐標(biāo)(默認(rèn)為0)。
d3.forceCollide[radius] - 創(chuàng)建一個(gè)圓的碰撞力肩钠。默認(rèn)所有節(jié)點(diǎn)的常數(shù)1
collide.radius - 設(shè)置圓半徑泣港。默認(rèn)為1
collide.strength - 設(shè)置碰撞分辨率強(qiáng)度。 默認(rèn)為0.7
collide.iterations - 設(shè)置迭代次數(shù)价匠。
默認(rèn)為1当纱,增加迭代次數(shù)大大增加了約束的剛度,避免了節(jié)點(diǎn)的部分重疊踩窖,同時(shí)也增加了計(jì)算力的運(yùn)行時(shí)成本惫东。d3.forceLink - 創(chuàng)建鏈接力。默認(rèn)為空數(shù)組
link.links - 取得或者設(shè)置節(jié)點(diǎn)間的鏈接數(shù)組。
每個(gè)鏈接都是一個(gè)具有以下屬性的對(duì)象:source
- 鏈接的源節(jié)點(diǎn)target
- 鏈接的目標(biāo)節(jié)點(diǎn)index
- the zero-based index into links, assigned by this method基于零的索引到鏈接廉沮,由這種方法分配
-
link.id - 通過數(shù)字索引或字符串標(biāo)識(shí)符連接節(jié)點(diǎn)颓遏。
如果指定了id,則將節(jié)點(diǎn)id訪問器設(shè)置為指定的函數(shù)并返回此力滞时。如果沒有指定id叁幢,則默認(rèn)為數(shù)值node.index:
以下兩種寫法都可以:
var nodes = [
{"id": "A"},
{"id": "B"},
{"id": "C"}
];
var links = [
{"source": 0, "target": 1}, // A → B
{"source": 1, "target": 2} // B → C
];
var nodes = [
{"id": "A"},
{"id": "B"},
{"id": "C"}
];
var links = [
{"source": "A", "target": "B"},
{"source": "B", "target": "C"}
];
link.distance - 設(shè)置連接距離。默認(rèn)為30
link.strength - 設(shè)置連接強(qiáng)度 坪稽。默認(rèn)為:1 / Math.min(count(link.source), count(link.target));
count(node)是一個(gè)函數(shù)曼玩,它返回作為源或目標(biāo)的給定節(jié)點(diǎn)的鏈接數(shù)。之所以選擇這個(gè)默認(rèn)值窒百,是因?yàn)樗鼤?huì)自動(dòng)降低連接到重連接節(jié)點(diǎn)的鏈接強(qiáng)度黍判,從而提高穩(wěn)定性。
對(duì)每個(gè)鏈接調(diào)用強(qiáng)度訪問器篙梢,傳遞鏈接及其從零開始的索引顷帖。然后,生成的數(shù)字存儲(chǔ)在內(nèi)部渤滞,這樣贬墩,只有在初始化力或使用新的強(qiáng)度調(diào)用此方法時(shí),才會(huì)重新計(jì)算每個(gè)鏈接的強(qiáng)度妄呕,而不是在力的每個(gè)應(yīng)用程序上陶舞。link.iterations - 設(shè)置迭代次數(shù)。默認(rèn)值為1.
增加迭代次數(shù)會(huì)大大增加約束的剛度绪励,對(duì)網(wǎng)格等復(fù)雜結(jié)構(gòu)很有用肿孵,但也會(huì)增加計(jì)算力的運(yùn)行時(shí)成本。d3.forceManyBody - 創(chuàng)建一個(gè)N體力
manyBody.strength - 設(shè)置力的強(qiáng)度疏魏。
正值使節(jié)點(diǎn)相互吸引颁井,類似于重力;負(fù)值使節(jié)點(diǎn)相互排斥,類似于靜電荷蠢护。如果沒有指定強(qiáng)度雅宾,則返回當(dāng)前強(qiáng)度訪問器,其默認(rèn)值為:-30manyBody.theta - set the Barnes–Hut approximation accuracy.
若指定了 theta, 將其設(shè)定為Barnes–Hut近似的判定參數(shù). 若 theta 未指定, 返回當(dāng)前值, 默認(rèn)為 0.9葵硕。manyBody.distanceMin - 當(dāng)節(jié)點(diǎn)接近限制力.默認(rèn)值為1.
最小距離為兩個(gè)相鄰節(jié)點(diǎn)之間的力的強(qiáng)度建立了上限眉抬,避免了不穩(wěn)定性。特別是當(dāng)兩個(gè)節(jié)點(diǎn)完全重合時(shí)懈凹,避免了無窮大的力;在這種情況下蜀变,力的方向是隨機(jī)的。manyBody.distanceMax - 當(dāng)節(jié)點(diǎn)遠(yuǎn)離限制力介评。默認(rèn)為無限大库北。指定有限的最大距離可以提高性能爬舰,并產(chǎn)生更本地化的布局。
d3.forceX - 創(chuàng)建一個(gè)x方向的定位力寒瓦。
創(chuàng)建一個(gè)新的定位力沿著x軸指向給定的位置x情屹。如果沒有指定x,則默認(rèn)為0杂腰。x.strength - 設(shè)置力的強(qiáng)度垃你。默認(rèn)值為0.1.
x.x - 設(shè)置目標(biāo)x坐標(biāo)。默認(rèn)值為0.
d3.forceY - 創(chuàng)建y方向的定位力喂很。
創(chuàng)建一個(gè)新的定位力沿y軸向給定的位置y惜颇。如果沒有指定y,它默認(rèn)為0少辣。y.strength - 設(shè)置力的強(qiáng)度凌摄。 默認(rèn)值為0.1.
-
y.y - 設(shè)置目標(biāo)y坐標(biāo)。默認(rèn)值為0.
d3.forceRadial - 創(chuàng)建徑向定位力漓帅。創(chuàng)建一個(gè)新的定位向指定半徑的一個(gè)圓的力量集中在?x, y?锨亏。如果x和y是未指定,默認(rèn)?0,0?
radial.strength - 設(shè)置力的強(qiáng)度set the force strength.
radial.radius - 設(shè)置目標(biāo)半徑set the target radius.
radial.x - 設(shè)置目標(biāo)中心x坐標(biāo)set the target center x-coordinate.
radial.y - 設(shè)置目標(biāo)中心y坐標(biāo)set the target center y-coordinate.
d3.layout 布局 (v3)
力布局
d3.layout.force - 使用物理模擬排放鏈接節(jié)點(diǎn)的位置。
force.alpha - 取得或者設(shè)置力布局的冷卻參數(shù)煎殷。
獲取或設(shè)置力布局的冷卻參數(shù):alpha。如果值value 已指定腿箩,設(shè)置alpha為指定的值并返回力布局豪直。如果值大于零,這個(gè)方法也將重新啟動(dòng)力布局(如果它尚未運(yùn)行)珠移,分發(fā)一個(gè)“啟動(dòng)”事件啟用節(jié)拍定時(shí)器弓乙。如果值為非正,且力布局正在運(yùn)行钧惧,這個(gè)方法將在下一個(gè)tick停止力布局并分派“結(jié)束”事件暇韧。如果未指定值,則該方法返回當(dāng)前alpha值浓瞪。force.chargeDistance - 取得或者設(shè)置最大電荷距離懈玻。
如果distance 被指定,設(shè)置電荷強(qiáng)度已經(jīng)應(yīng)用的最大距離乾颁。如果distance 未被指定涂乌,返回當(dāng)前最大電荷距離,默認(rèn)為無窮大英岭。指定一個(gè)有限電荷距離提高力導(dǎo)向圖的性能和產(chǎn)生更本地化的布局湾盒。限定距離的電荷力是尤其有用當(dāng)合自定義重力一起使用時(shí)。有關(guān)示例, 請(qǐng)參閱“限定距離的電荷力(Constellations of Directors and their Stars)” (The New York Times).force.charge - 取得或者設(shè)置電荷強(qiáng)度诅妹。
如果指定電荷強(qiáng)度charge 罚勾,設(shè)置電荷強(qiáng)度為指定的值毅人。如果電荷強(qiáng)度charge 未被指定,返回電流電荷強(qiáng)度尖殃,其默認(rèn)值為-30丈莺。如果電荷強(qiáng)是常量,那么所有節(jié)點(diǎn)都具有相同的電荷分衫。否則场刑,如果電荷強(qiáng)度charge是一個(gè)函數(shù),則該函數(shù)為每個(gè)節(jié)點(diǎn)(按順序)求值蚪战,傳遞的參數(shù)是節(jié)點(diǎn)和它的索引牵现,this
上下文作為力布局;該函數(shù)的返回值被用于設(shè)置每個(gè)節(jié)點(diǎn)的電荷強(qiáng)度邀桑。每當(dāng)布局開始(starts)時(shí)被調(diào)用瞎疼。
負(fù)值導(dǎo)致節(jié)點(diǎn)排斥,而正值導(dǎo)致節(jié)點(diǎn)吸引壁畸。對(duì)于圖形布局贼急,應(yīng)使用負(fù)值;對(duì)于N體模擬(n-body simulation)捏萍,可以使用正值太抓。所有節(jié)點(diǎn)都假定為無窮遠(yuǎn)的小點(diǎn)具有相等電荷和質(zhì)量。電荷力是通過Barnes–Hut算法(Barnes–Hut algorithm)高效實(shí)現(xiàn)的令杈,為每個(gè)tick計(jì)算四叉樹走敌。電荷力設(shè)置為零禁用四叉樹(quadtree),它可以顯著提高性能逗噩,如果你不需要N體模擬掉丽。 Barnes–Hut算法:http://arborjs.org/docs/barnes-hutforce.drag - 給節(jié)點(diǎn)綁定拖動(dòng)行為。
綁定一個(gè)行為允許交互式拖動(dòng)到節(jié)點(diǎn)异雁,無論是使用鼠標(biāo)或觸摸捶障。
實(shí)現(xiàn)注意:在鼠標(biāo)移動(dòng)和鼠標(biāo)彈起事件監(jiān)聽器已注冊(cè)當(dāng)前窗口上,這樣纲刀,當(dāng)用戶開始拖動(dòng)節(jié)點(diǎn)项炼,他們可以繼續(xù)拖動(dòng)節(jié)點(diǎn),即使鼠標(biāo)離開窗口示绊。每個(gè)事件監(jiān)聽器使用“force”命名空間芥挣,以避免和其他你可能想綁定到節(jié)點(diǎn)或窗體上的事件監(jiān)聽器沖突。如果節(jié)點(diǎn)被拖動(dòng)事件移除了耻台,隨后的點(diǎn)擊事件將被抓獲到的最后一個(gè)鼠標(biāo)抬起事件觸發(fā)空免,你可以忽略這些點(diǎn)擊和拖動(dòng)通過查看是否默認(rèn)的行為被阻止了。
selection.on("click", function(d) {
if (d3.event.defaultPrevented) return; // ignore drag
otherwiseDoAwesomeThing();
});
force.friction - 取得或者設(shè)置摩擦系數(shù)盆耽。
如果指定了摩擦系數(shù)friction 蹋砚,設(shè)定摩擦系數(shù)為指定的值扼菠。如果摩擦系數(shù)未被指定,返回當(dāng)前系數(shù)坝咐,默認(rèn)為0.9循榆。force.gravity - 取得或者設(shè)置重力強(qiáng)度。
如果指定了重力gravity 墨坚,設(shè)置引力強(qiáng)度為指定的值秧饮。如果未指定重力,返回當(dāng)前的引力強(qiáng)度泽篮,默認(rèn)為0.1盗尸。force.linkDistance - 取得或者設(shè)置鏈接距離。
如果指定了distance 帽撑,設(shè)定鏈接節(jié)點(diǎn)間的目標(biāo)距離為指定的值泼各。如果未指定distance ,返回布局的當(dāng)前鏈路距離亏拉,默認(rèn)為20扣蜻。force.linkStrength - 取得或者設(shè)置鏈接強(qiáng)度。
如果指定了strength 及塘,設(shè)置鏈接間強(qiáng)度(剛性)為[0,1]范圍內(nèi)的指定的值莽使。如果strength 未被指定,返回布局的當(dāng)前鏈接強(qiáng)度笙僚,默認(rèn)為1芳肌。force.links - 取得或者設(shè)置節(jié)點(diǎn)間的鏈接數(shù)組。
如果指定了鏈接links 味咳,設(shè)置布局的相關(guān)鏈接為指定的links 數(shù)組庇勃。如果沒有指定鏈接links 時(shí)檬嘀,返回當(dāng)前數(shù)組槽驶,默認(rèn)為空數(shù)組。每個(gè)鏈接都有以下屬性:source - 源節(jié)點(diǎn)(節(jié)點(diǎn)中的元素)鸳兽。
target - 目標(biāo)節(jié)點(diǎn)(節(jié)點(diǎn)中的元素)掂铐。
注意:在源和目標(biāo)屬性的值可初始化為nodes 數(shù)組的索引;這些將被替換為調(diào)用開始函數(shù)(start)之后的引用揍异。鏈接對(duì)象可能有你指定的其他字段全陨,這個(gè)數(shù)據(jù)可以用來計(jì)算鏈接強(qiáng)度strength和距離distance,基于每個(gè)連接的基礎(chǔ)使用一個(gè)訪問函數(shù)force.nodes - 取得或者設(shè)置布局的節(jié)點(diǎn)數(shù)組衷掷。
force.on - 監(jiān)聽在計(jì)算布局位置時(shí)的更新辱姨。
注冊(cè)指定的監(jiān)聽器listener 為力布局指定類型的事件。目前戚嗅,僅支持"start"雨涛,"tick"和"end"事件枢舶。"tick"事件將被指派為模擬的每個(gè)tick。當(dāng)模擬內(nèi)部的alpha冷卻低于閾值(0.005)時(shí)替久,"end"事件就被調(diào)度并被設(shè)為零凉泄。force.resume - 重新加熱冷卻參數(shù),并重啟模擬蚯根。
相當(dāng)于:
force.alpha(.1);
設(shè)置冷卻參數(shù)alpha為0.1后众。force.size - 取得或者設(shè)置布局大小。
如果指定了size颅拦,設(shè)置可用的布局大小為指定的代表x和y的兩元素?cái)?shù)字?jǐn)?shù)組來蒂誉。如果未指定size,返回當(dāng)前size矩距,默認(rèn)為[1, 1]拗盒。size影響力導(dǎo)向圖的兩個(gè)方面:重力中心和初始的隨機(jī)位置。重心為[ x/2, y/2 ]锥债。force.start - 當(dāng)節(jié)點(diǎn)變化時(shí)啟動(dòng)或者重啟模擬陡蝇。
啟動(dòng)模擬;當(dāng)首次創(chuàng)建布局時(shí)此方法必須被調(diào)用哮肚,然后分配節(jié)點(diǎn)和鏈接登夫。此外,每當(dāng)節(jié)點(diǎn)或鏈接發(fā)生變化它應(yīng)當(dāng)再次調(diào)用允趟。force.stop - 立即停止模擬恼策。
相當(dāng)于:
force.alpha(0);
終止模擬,冷卻參數(shù)alpha設(shè)定為零潮剪。這可以用來顯式地停止模擬涣楷,例如,如果你要展示的動(dòng)畫或允許其他的互動(dòng)抗碰。如果你沒有明確停止布局狮斗,它仍然會(huì)自動(dòng)在布局的冷卻參數(shù)衰變后低于某個(gè)閾值后停止。force.theta - 取得或者設(shè)置電荷作用的精度弧蝇。
若指定了 theta, 將其設(shè)定為Barnes–Hut近似的判定參數(shù). 若 theta 未指定, 返回當(dāng)前值, 默認(rèn)為 0.8碳褒。force.tick - 運(yùn)行布局模擬的一步。