Dash Cytoscape⑫(ノードの配置方法 / cose)

物理シミュレーション(cose)

レイアウト辞書の“name”キー“cose”を指定すると、物理シミュレーションに基づく方法でノードを自動配置することができます。(50行目)

[ソースコード]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
import dash
import math

import dash_cytoscape as cyto
import dash_html_components as html

app = dash.Dash(__name__)

nodes = [
{
'data': {'id': short, 'label': label},
'position': {'x': 20 * lat, 'y': -20 * long}
}
for short, label, long, lat in (
('la', 'Los Angeles', 34.03, -118.25),
('nyc', 'New York', 40.71, -74),
('to', 'Toronto', 43.65, -79.38),
('mtl', 'Montreal', 45.50, -73.57),
('van', 'Vancouver', 49.28, -123.12),
('chi', 'Chicago', 41.88, -87.63),
('bos', 'Boston', 42.36, -71.06),
('hou', 'Houston', 29.76, -95.37)
)
]

edges = [
{'data': {'source': source, 'target': target}}
for source, target in (
('van', 'la'),
('la', 'chi'),
('hou', 'chi'),
('to', 'mtl'),
('mtl', 'bos'),
('nyc', 'bos'),
('to', 'hou'),
('to', 'nyc'),
('la', 'nyc'),
('nyc', 'bos')
)
]

elements = nodes + edges

app.layout = html.Div([
cyto.Cytoscape(
id='cytoscape-layout-9',
elements=elements,
style={'width': '100%', 'height': '350px'},
layout={
'name': 'cose'
# ,'gravity':100 # オプション
}
)
])

if __name__ == '__main__':
app.run_server(debug=True)

[ブラウザで表示(gravity=1の場合)]

物理シミュレーションに基づいて、ノードが自動的に配置されました。

オプションとして“gravity”キー(デフォルトは 1 )を設定すると、物理シミュレーション時の重力の強さを指定できます。

“gravity”キー100を指定してみます。(上記ソースの51行目をコメントアウト)

[ブラウザで表示(gravity=100の場合)]

デフォルト(“gravity”=1)よりもノードが密に配置されていることが確認できます。