teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

3

過去の投稿に戻した

2016/09/17 18:00

投稿

kkkmokotan
kkkmokotan

スコア45

title CHANGED
File without changes
body CHANGED
@@ -1,69 +1,43 @@
1
- [こちらのサイト](http://kazuki-nagasawa.hatenablog.com/entry/memo_20150226_d3)を用いてD3風にグラフをレイアウトしていたのですがどこか物足りなかったのでノードのまん丸の代わりに画像を使いたく思い[こちらのサイト](https://bl.ocks.org/mbostock/950642)を参考に.append を使って編集しました。
2
- ソースコードはサイトのそのんまで
1
+ [こちらのサイト](http://kazuki-nagasawa.hatenablog.com/entry/memo_20150226_d3)を用いてD3風にグラフをレイアウトしていたのですがどこか物足りなかったのでノードのまん丸の代わりに画像を使いたく思い[こちらのサイト](http://totech.hateblo.jp/entry/2014/11/27/080949)を参考に.append を使って編集しました。
2
+ 編集後のソースコードを以下に載せす。
3
3
  ```javascript
4
- <script src="https://d3js.org/d3.v3.min.js"></script>
5
- <script>
6
-
7
- var width = 960,
8
- height = 500
9
-
10
- var svg = d3.select("body").append("svg")
11
- .attr("width", width)
12
- .attr("height", height);
13
-
14
- var force = d3.layout.force()
15
- .gravity(0.05)
16
- .distance(100)
17
- .charge(-100)
18
- .size([width, height]);
19
-
20
- d3.json("data/data.json", function(error, json) {
21
- if (error) throw error;
22
-
23
- force
24
- .nodes(json.nodes)
25
- .links(json.links)
26
- .start();
27
-
28
- var link = svg.selectAll(".link")
4
+ var link = svg.selectAll('.link')
29
- .data(json.links)
5
+ .data(graph.links).enter()
30
- .enter().append("line")
6
+ .append('line')
31
- .attr("class", "link");
7
+ .attr('class', 'link')
32
-
8
+ .style('stroke-width', 1)
9
+ .style('marker-end', 'url(#arrow)');
33
- var node = svg.selectAll(".node")
10
+ var node = svg.selectAll('.node')
34
- .data(json.nodes)
11
+ .data(graph.nodes).enter()
35
- .enter().append("g")
12
+ .append('g')
36
- .attr("class", "node")
13
+ .attr('class', 'node')
37
- .call(force.drag);
14
+ .call(force.drag);
38
-
15
+ //circle のappendを'image'にしてattrにサイトを参考に記述
39
- node.append("image")
16
+ var circle = node.append('image')
40
- .attr("xlink:href", "https://github.com/favicon.ico")
17
+ .attr({"xlink:href":"images//dwelling1.svg",
41
- .attr("x", -8)
42
- .attr("y", -8)
43
- .attr("width", 16)
18
+ "width":75,
44
- .attr("height", 16);
19
+ "height":60
45
-
46
- node.append("text")
47
- .attr("dx", 12)
48
- .attr("dy", ".35em")
49
- .text(function(d) { return d.name });
50
-
51
- force.on("tick", function() {
52
- link.attr("x1", function(d) { return d.source.x; })
53
- .attr("y1", function(d) { return d.source.y; })
54
- .attr("x2", function(d) { return d.target.x; })
55
- .attr("y2", function(d) { return d.target.y; });
56
-
57
- node.attr("transform", function(d) { return "translate(" + d.x + "," + d.y + ")"; });
58
- });
20
+ });
21
+ var text = node.append('text')
22
+ .attr('dx', 10)
23
+ .attr('dy', '.35em')
24
+ .text(function(d) { return d.name; })
25
+ .style('stroke', 'gray');
26
+ force.on('tick', function() {
27
+ link.attr('x1', function(d) { return d.source.x; })
28
+ .attr('y1', function(d) { return d.source.y; })
29
+ .attr('x2', function(d) { return d.target.x; })
30
+ .attr('y2', function(d) { return d.target.y; });
31
+ circle.attr('cx', function(d) { return d.x; })
32
+ .attr('cy', function(d) { return d.y; });
33
+ text.attr('x', function(d) { return d.x; })
34
+ .attr('y', function(d) { return d.y; });
59
- });
35
+ });
60
-
61
- </script>
62
36
  ```
37
+ としてみました。しかしなにも表示されません。。。
63
38
 
64
- ここで次に問題になったのが、ここではgithubのiconを使っていますが画像を個々のノードごとに変えたいときはどうすればいいのかです。
65
- みたところforceという関数(?)にjsonの要素が読み込まれている気がするのですがどこで画像を選択すればいいのかがわかりません。
66
- 例えばテキストに出す文字にnodeの名前を使っているのと同じ感じでimageが読み込むiconを変えたいのです。アドバイスをお願い致します。
67
39
 
68
40
  追記
41
+ 回答者様 申し訳ありません。回答者様のリンクを参考にして画像の編集も行ったのでベストアンサーとさせていただきました。
42
+
69
- 回答者様ありがうございます。参考にもらったサイト参考のソを参考に一から作り直しました。
43
+ 解決策してはlabeled force layoutを参考にすべのコードを直しました。

2

質問の意図変更

2016/09/17 18:00

投稿

kkkmokotan
kkkmokotan

スコア45

title CHANGED
File without changes
body CHANGED
@@ -1,156 +1,69 @@
1
- [こちらのサイト](http://kazuki-nagasawa.hatenablog.com/entry/memo_20150226_d3)を用いてD3風にグラフをレイアウトしていたのですがどこか物足りなかったのでノードのまん丸の代わりに画像を使いたく思い[こちらのサイト](http://totech.hateblo.jp/entry/2014/11/27/080949)を参考に.append を使って編集しました。
2
- 編集後のソースコードを以下に載せす。
1
+ [こちらのサイト](http://kazuki-nagasawa.hatenablog.com/entry/memo_20150226_d3)を用いてD3風にグラフをレイアウトしていたのですがどこか物足りなかったのでノードのまん丸の代わりに画像を使いたく思い[こちらのサイト](https://bl.ocks.org/mbostock/950642)を参考に.append を使って編集しました。
2
+ ソースコードはサイトのそのんまで
3
3
  ```javascript
4
- var link = svg.selectAll('.link')
5
- .data(graph.links).enter()
6
- .append('line')
7
- .attr('class', 'link')
8
- .style('stroke-width', 1)
9
- .style('marker-end', 'url(#arrow)');
4
+ <script src="https://d3js.org/d3.v3.min.js"></script>
5
+ <script>
10
6
 
11
- var node = svg.selectAll('.node')
12
- .data(graph.nodes).enter()
13
- .append('g')
14
- .attr('class', 'node')
15
- .call(force.drag);
16
- //circle のappendを'image'にしてattrにサイトを参考に記述
17
- var circle = node.append('image')
18
- .attr({"xlink:href":"images//dwelling1.svg",
19
- "width":75,
7
+ var width = 960,
20
- "height":60
8
+ height = 500
21
- });
22
9
 
23
- var text = node.append('text')
10
+ var svg = d3.select("body").append("svg")
24
- .attr('dx', 10)
11
+ .attr("width", width)
25
- .attr('dy', '.35em')
12
+ .attr("height", height);
26
- .text(function(d) { return d.name; })
27
- .style('stroke', 'gray');
28
13
 
14
+ var force = d3.layout.force()
15
+ .gravity(0.05)
16
+ .distance(100)
17
+ .charge(-100)
18
+ .size([width, height]);
29
19
 
30
- force.on('tick', function() {
20
+ d3.json("data/data.json", function(error, json) {
31
- link.attr('x1', function(d) { return d.source.x; })
32
- .attr('y1', function(d) { return d.source.y; })
21
+ if (error) throw error;
33
- .attr('x2', function(d) { return d.target.x; })
34
- .attr('y2', function(d) { return d.target.y; });
35
22
 
36
- circle.attr('cx', function(d) { return d.x; })
23
+ force
37
- .attr('cy', function(d) { return d.y; });
24
+ .nodes(json.nodes)
25
+ .links(json.links)
26
+ .start();
38
27
 
39
- text.attr('x', function(d) { return d.x; })
28
+ var link = svg.selectAll(".link")
29
+ .data(json.links)
30
+ .enter().append("line")
40
- .attr('y', function(d) { return d.y; });
31
+ .attr("class", "link");
41
- });
42
- ```
43
32
 
33
+ var node = svg.selectAll(".node")
34
+ .data(json.nodes)
44
- としてみました。しかしなにも表示されません。。。
35
+ .enter().append("g")
45
- 他のサイトも見てみましたが解決できません。初心者なので詰まってしまいどうしたらいいかわからないのでアドバイスをお願い致します。
36
+ .attr("class", "node")
37
+ .call(force.drag);
46
38
 
39
+ node.append("image")
40
+ .attr("xlink:href", "https://github.com/favicon.ico")
41
+ .attr("x", -8)
42
+ .attr("y", -8)
43
+ .attr("width", 16)
44
+ .attr("height", 16);
47
45
 
48
- 追記
49
- 解答をもとに編集したコード。
46
+ node.append("text")
50
- テキストとノードの円がでなくなってしまった。
47
+ .attr("dx", 12)
48
+ .attr("dy", ".35em")
49
+ .text(function(d) { return d.name });
51
50
 
52
- ```javascript
53
- /**
54
- * Set arrow
55
- */
56
- function _setArrow(svg)
51
+ force.on("tick", function() {
57
- {
58
- svg.append('defs').selectAll('marker')
52
+ link.attr("x1", function(d) { return d.source.x; })
59
- .data(['arrow']).enter()
60
- .append('marker')
61
- .attr('id', function(d) { return d; })
53
+ .attr("y1", function(d) { return d.source.y; })
62
- .attr('viewBox', '0 -5 10 10')
63
- .attr('refX', 25)
64
- .attr('refY', 0)
65
- .attr('markerWidth', 20)
66
- .attr('markerHeight', 10)
67
- .attr('orient', 'auto')
68
- .append('path')
69
- .attr('d', 'M0,-5L10,0L0,5 L10,0 L0, -5')
54
+ .attr("x2", function(d) { return d.target.x; })
70
- .style('stroke', '#4679BD')
71
- .style('opacity', '0.6');
55
+ .attr("y2", function(d) { return d.target.y; });
72
- };
73
56
 
57
+ node.attr("transform", function(d) { return "translate(" + d.x + "," + d.y + ")"; });
58
+ });
59
+ });
74
60
 
75
- /**
76
- * Initialize SVG display
77
- */
78
- function init(svg_id, width, height, data_path)
79
- {
80
- // 色は既定のがある。
61
+ </script>
81
- var color = d3.scale.category20();
62
+ ```
82
63
 
83
- var force = d3.layout.force()
64
+ ここで次に問題になったのが、ここではgithubのiconを使っていますが画像を個々のノードごとに変えたいときはどうすればいいのかです。
84
- .charge(-500) // node同士基準?
65
+ みたところforceという関数(?)にjson要素が読み込まれている気がするですがどこで画像を選択すればいいのかがわかりません。
85
- .linkDistance(100) // node同士距離基準
66
+ 例えばテキストに出す文字にnodeの名前を使っていると同じ感じでimageが読み込むiconを変えたいのです。アドバイスをお願い致します。
86
- .size([width, height]);
87
67
 
88
- var svg = d3.select('#' + svg_id).append('svg')
89
- .attr('width', width)
90
- .attr('height', height);
91
-
92
- _setArrow(svg);
93
-
94
- d3.json(data_path, function(error, graph) {
95
-
96
- // JSON read error 時
97
- if (graph == null) {
98
- alert(error);
99
- return;
100
- }
101
-
102
- force.nodes(graph.nodes)
103
- .links(graph.links);
104
-
105
- // Tick start
106
- force.start();
107
-
108
- var link = svg.selectAll('.link')
109
- .data(graph.links).enter()
110
- .append('line')
111
- .attr('class', 'link')
112
- .style('stroke-width', 1)
113
- .style('marker-end', 'url(#arrow)');
114
-
115
- var node = svg.selectAll(".node")
116
- .data(graph.nodes).enter()
117
- .append('g')
118
- .attr('class', 'node')
119
- .call(force.drag);
120
-
121
- var circle = node.append("image")
122
- .attr({"xlink:href":"https://placehold.jp/24/cc9999/993333/350x150.png"
123
- });
68
+ 追記
124
-
125
- var text = node.append("text")
126
- .attr({"text-anchor":"middle",
69
+ 回答者様ありがとうございます。参考にもらったサイトの参考のソースを参考にして一から作り直しました。
127
- "fill":"black"})
128
- .style({"font-size":14})
129
- .text(function(d) { return d.label; });
130
-
131
-
132
- force.on('tick', function() {
133
- link.attr('x1', function(d) { return d.source.x; })
134
- .attr('y1', function(d) { return d.source.y; })
135
- .attr('x2', function(d) { return d.target.x; })
136
- .attr('y2', function(d) { return d.target.y; });
137
-
138
- circle.attr('cx', function(d) { return d.x; })
139
- .attr('cy', function(d) { return d.y; });
140
-
141
- text.attr('x', function(d) { return d.x; })
142
- .attr('y', function(d) { return d.y; });
143
-
144
- });
145
- });
146
- }
147
-
148
- /**
149
- * Main
150
- */
151
- var svg_id = 'svg_area';
152
- var element = document.getElementById(svg_id);
153
- var data_path = 'data/data.json';
154
-
155
- init(svg_id, element.clientWidth, element.clientHeight, data_path);
156
- ```

1

コード追加

2016/09/17 17:50

投稿

kkkmokotan
kkkmokotan

スコア45

title CHANGED
File without changes
body CHANGED
@@ -42,4 +42,115 @@
42
42
  ```
43
43
 
44
44
  としてみました。しかしなにも表示されません。。。
45
- 他のサイトも見てみましたが解決できません。初心者なので詰まってしまいどうしたらいいかわからないのでアドバイスをお願い致します。
45
+ 他のサイトも見てみましたが解決できません。初心者なので詰まってしまいどうしたらいいかわからないのでアドバイスをお願い致します。
46
+
47
+
48
+ 追記
49
+ 解答をもとに編集したコード。
50
+ テキストとノードの円がでなくなってしまった。
51
+
52
+ ```javascript
53
+ /**
54
+ * Set arrow
55
+ */
56
+ function _setArrow(svg)
57
+ {
58
+ svg.append('defs').selectAll('marker')
59
+ .data(['arrow']).enter()
60
+ .append('marker')
61
+ .attr('id', function(d) { return d; })
62
+ .attr('viewBox', '0 -5 10 10')
63
+ .attr('refX', 25)
64
+ .attr('refY', 0)
65
+ .attr('markerWidth', 20)
66
+ .attr('markerHeight', 10)
67
+ .attr('orient', 'auto')
68
+ .append('path')
69
+ .attr('d', 'M0,-5L10,0L0,5 L10,0 L0, -5')
70
+ .style('stroke', '#4679BD')
71
+ .style('opacity', '0.6');
72
+ };
73
+
74
+
75
+ /**
76
+ * Initialize SVG display
77
+ */
78
+ function init(svg_id, width, height, data_path)
79
+ {
80
+ // 色は既定のがある。
81
+ var color = d3.scale.category20();
82
+
83
+ var force = d3.layout.force()
84
+ .charge(-500) // node同士の力の基準?
85
+ .linkDistance(100) // node同士の距離の基準
86
+ .size([width, height]);
87
+
88
+ var svg = d3.select('#' + svg_id).append('svg')
89
+ .attr('width', width)
90
+ .attr('height', height);
91
+
92
+ _setArrow(svg);
93
+
94
+ d3.json(data_path, function(error, graph) {
95
+
96
+ // JSON read error 時
97
+ if (graph == null) {
98
+ alert(error);
99
+ return;
100
+ }
101
+
102
+ force.nodes(graph.nodes)
103
+ .links(graph.links);
104
+
105
+ // Tick start
106
+ force.start();
107
+
108
+ var link = svg.selectAll('.link')
109
+ .data(graph.links).enter()
110
+ .append('line')
111
+ .attr('class', 'link')
112
+ .style('stroke-width', 1)
113
+ .style('marker-end', 'url(#arrow)');
114
+
115
+ var node = svg.selectAll(".node")
116
+ .data(graph.nodes).enter()
117
+ .append('g')
118
+ .attr('class', 'node')
119
+ .call(force.drag);
120
+
121
+ var circle = node.append("image")
122
+ .attr({"xlink:href":"https://placehold.jp/24/cc9999/993333/350x150.png"
123
+ });
124
+
125
+ var text = node.append("text")
126
+ .attr({"text-anchor":"middle",
127
+ "fill":"black"})
128
+ .style({"font-size":14})
129
+ .text(function(d) { return d.label; });
130
+
131
+
132
+ force.on('tick', function() {
133
+ link.attr('x1', function(d) { return d.source.x; })
134
+ .attr('y1', function(d) { return d.source.y; })
135
+ .attr('x2', function(d) { return d.target.x; })
136
+ .attr('y2', function(d) { return d.target.y; });
137
+
138
+ circle.attr('cx', function(d) { return d.x; })
139
+ .attr('cy', function(d) { return d.y; });
140
+
141
+ text.attr('x', function(d) { return d.x; })
142
+ .attr('y', function(d) { return d.y; });
143
+
144
+ });
145
+ });
146
+ }
147
+
148
+ /**
149
+ * Main
150
+ */
151
+ var svg_id = 'svg_area';
152
+ var element = document.getElementById(svg_id);
153
+ var data_path = 'data/data.json';
154
+
155
+ init(svg_id, element.clientWidth, element.clientHeight, data_path);
156
+ ```