質問編集履歴

3

過去の投稿に戻した

2016/09/17 18:00

投稿

kkkmokotan
kkkmokotan

スコア45

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

2

質問の意図変更

2016/09/17 18:00

投稿

kkkmokotan
kkkmokotan

スコア45

test CHANGED
File without changes
test CHANGED
@@ -1,311 +1,137 @@
1
- [こちらのサイト](http://kazuki-nagasawa.hatenablog.com/entry/memo_20150226_d3)を用いてD3風にグラフをレイアウトしていたのですがどこか物足りなかったのでノードのまん丸の代わりに画像を使いたく思い[こちらのサイト](http://totech.hateblo.jp/entry/2014/11/27/080949)を参考に.append を使って編集しました。
1
+ [こちらのサイト](http://kazuki-nagasawa.hatenablog.com/entry/memo_20150226_d3)を用いてD3風にグラフをレイアウトしていたのですがどこか物足りなかったのでノードのまん丸の代わりに画像を使いたく思い[こちらのサイト](https://bl.ocks.org/mbostock/950642)を参考に.append を使って編集しました。
2
2
 
3
- 編集後のソースコードを以下に載せす。
3
+ ソースコードはサイトのそのんまで
4
4
 
5
5
  ```javascript
6
6
 
7
- var link = svg.selectAll('.link')
7
+ <script src="https://d3js.org/d3.v3.min.js"></script>
8
8
 
9
- .data(graph.links).enter()
10
-
11
- .append('line')
9
+ <script>
12
-
13
- .attr('class', 'link')
14
-
15
- .style('stroke-width', 1)
16
-
17
- .style('marker-end', 'url(#arrow)');
18
10
 
19
11
 
20
12
 
21
- var node = svg.selectAll('.node')
13
+ var width = 960,
22
14
 
23
- .data(graph.nodes).enter()
24
-
25
- .append('g')
26
-
27
- .attr('class', 'node')
28
-
29
- .call(force.drag);
30
-
31
- //circle のappendを'image'にしてattrにサイトを参考に記述
32
-
33
- var circle = node.append('image')
34
-
35
- .attr({"xlink:href":"images//dwelling1.svg",
36
-
37
- "width":75,
38
-
39
- "height":60
15
+ height = 500
40
-
41
- });
42
16
 
43
17
 
44
18
 
45
- var text = node.append('text')
19
+ var svg = d3.select("body").append("svg")
46
20
 
47
- .attr('dx', 10)
21
+ .attr("width", width)
48
22
 
49
- .attr('dy', '.35em')
23
+ .attr("height", height);
50
-
51
- .text(function(d) { return d.name; })
52
-
53
- .style('stroke', 'gray');
54
24
 
55
25
 
56
26
 
27
+ var force = d3.layout.force()
57
28
 
29
+ .gravity(0.05)
58
30
 
59
- force.on('tick', function() {
31
+ .distance(100)
60
32
 
61
- link.attr('x1', function(d) { return d.source.x; })
33
+ .charge(-100)
62
34
 
63
- .attr('y1', function(d) { return d.source.y; })
64
-
65
- .attr('x2', function(d) { return d.target.x; })
66
-
67
- .attr('y2', function(d) { return d.target.y; });
35
+ .size([width, height]);
68
36
 
69
37
 
70
38
 
71
- circle.attr('cx', function(d) { return d.x; })
39
+ d3.json("data/data.json", function(error, json) {
72
40
 
73
- .attr('cy', function(d) { return d.y; });
41
+ if (error) throw error;
74
42
 
75
43
 
76
44
 
77
- text.attr('x', function(d) { return d.x; })
45
+ force
78
46
 
79
- .attr('y', function(d) { return d.y; });
47
+ .nodes(json.nodes)
80
48
 
49
+ .links(json.links)
50
+
51
+ .start();
52
+
53
+
54
+
55
+ var link = svg.selectAll(".link")
56
+
57
+ .data(json.links)
58
+
59
+ .enter().append("line")
60
+
61
+ .attr("class", "link");
62
+
63
+
64
+
65
+ var node = svg.selectAll(".node")
66
+
67
+ .data(json.nodes)
68
+
69
+ .enter().append("g")
70
+
71
+ .attr("class", "node")
72
+
73
+ .call(force.drag);
74
+
75
+
76
+
77
+ node.append("image")
78
+
79
+ .attr("xlink:href", "https://github.com/favicon.ico")
80
+
81
+ .attr("x", -8)
82
+
83
+ .attr("y", -8)
84
+
85
+ .attr("width", 16)
86
+
87
+ .attr("height", 16);
88
+
89
+
90
+
91
+ node.append("text")
92
+
93
+ .attr("dx", 12)
94
+
95
+ .attr("dy", ".35em")
96
+
97
+ .text(function(d) { return d.name });
98
+
99
+
100
+
101
+ force.on("tick", function() {
102
+
103
+ link.attr("x1", function(d) { return d.source.x; })
104
+
105
+ .attr("y1", function(d) { return d.source.y; })
106
+
107
+ .attr("x2", function(d) { return d.target.x; })
108
+
109
+ .attr("y2", function(d) { return d.target.y; });
110
+
111
+
112
+
113
+ node.attr("transform", function(d) { return "translate(" + d.x + "," + d.y + ")"; });
114
+
81
- });
115
+ });
116
+
117
+ });
118
+
119
+
120
+
121
+ </script>
82
122
 
83
123
  ```
84
124
 
85
125
 
86
126
 
87
- とし。ししなにも表示されません。。
127
+ ここで次に問題になったのが、ここではgithubのiconを使っすが画像を個々のノードごとに変えいときはどうすればいいのです
88
128
 
89
- サイトも見てみました解決できません。初心者なので詰まってしまいうしたらいいかわからないのでアドバイスをお願い致し
129
+ みたところforceという関数(?)にjson要素が読れている気するのですがこで画像を選択すればいいわかせん
90
130
 
91
-
131
+ 例えばテキストに出す文字にnodeの名前を使っているのと同じ感じでimageが読み込むiconを変えたいのです。アドバイスをお願い致します。
92
132
 
93
133
 
94
134
 
95
135
  追記
96
136
 
97
- 解答をもとに編集したコード。
98
-
99
- テキストとノードの円がでなくなってしまった。
100
-
101
-
102
-
103
- ```javascript
104
-
105
- /**
106
-
107
- * Set arrow
108
-
109
- */
110
-
111
- function _setArrow(svg)
112
-
113
- {
114
-
115
- svg.append('defs').selectAll('marker')
116
-
117
- .data(['arrow']).enter()
118
-
119
- .append('marker')
120
-
121
- .attr('id', function(d) { return d; })
122
-
123
- .attr('viewBox', '0 -5 10 10')
137
+ 回答者様ありがとうございます。参考にもらったサイトの参考のソースを参考にして一から作り直しました。
124
-
125
- .attr('refX', 25)
126
-
127
- .attr('refY', 0)
128
-
129
- .attr('markerWidth', 20)
130
-
131
- .attr('markerHeight', 10)
132
-
133
- .attr('orient', 'auto')
134
-
135
- .append('path')
136
-
137
- .attr('d', 'M0,-5L10,0L0,5 L10,0 L0, -5')
138
-
139
- .style('stroke', '#4679BD')
140
-
141
- .style('opacity', '0.6');
142
-
143
- };
144
-
145
-
146
-
147
-
148
-
149
- /**
150
-
151
- * Initialize SVG display
152
-
153
- */
154
-
155
- function init(svg_id, width, height, data_path)
156
-
157
- {
158
-
159
- // 色は既定のがある。
160
-
161
- var color = d3.scale.category20();
162
-
163
-
164
-
165
- var force = d3.layout.force()
166
-
167
- .charge(-500) // node同士の力の基準?
168
-
169
- .linkDistance(100) // node同士の距離の基準
170
-
171
- .size([width, height]);
172
-
173
-
174
-
175
- var svg = d3.select('#' + svg_id).append('svg')
176
-
177
- .attr('width', width)
178
-
179
- .attr('height', height);
180
-
181
-
182
-
183
- _setArrow(svg);
184
-
185
-
186
-
187
- d3.json(data_path, function(error, graph) {
188
-
189
-
190
-
191
- // JSON read error 時
192
-
193
- if (graph == null) {
194
-
195
- alert(error);
196
-
197
- return;
198
-
199
- }
200
-
201
-
202
-
203
- force.nodes(graph.nodes)
204
-
205
- .links(graph.links);
206
-
207
-
208
-
209
- // Tick start
210
-
211
- force.start();
212
-
213
-
214
-
215
- var link = svg.selectAll('.link')
216
-
217
- .data(graph.links).enter()
218
-
219
- .append('line')
220
-
221
- .attr('class', 'link')
222
-
223
- .style('stroke-width', 1)
224
-
225
- .style('marker-end', 'url(#arrow)');
226
-
227
-
228
-
229
- var node = svg.selectAll(".node")
230
-
231
- .data(graph.nodes).enter()
232
-
233
- .append('g')
234
-
235
- .attr('class', 'node')
236
-
237
- .call(force.drag);
238
-
239
-
240
-
241
- var circle = node.append("image")
242
-
243
- .attr({"xlink:href":"https://placehold.jp/24/cc9999/993333/350x150.png"
244
-
245
- });
246
-
247
-
248
-
249
- var text = node.append("text")
250
-
251
- .attr({"text-anchor":"middle",
252
-
253
- "fill":"black"})
254
-
255
- .style({"font-size":14})
256
-
257
- .text(function(d) { return d.label; });
258
-
259
-
260
-
261
-
262
-
263
- force.on('tick', function() {
264
-
265
- link.attr('x1', function(d) { return d.source.x; })
266
-
267
- .attr('y1', function(d) { return d.source.y; })
268
-
269
- .attr('x2', function(d) { return d.target.x; })
270
-
271
- .attr('y2', function(d) { return d.target.y; });
272
-
273
-
274
-
275
- circle.attr('cx', function(d) { return d.x; })
276
-
277
- .attr('cy', function(d) { return d.y; });
278
-
279
-
280
-
281
- text.attr('x', function(d) { return d.x; })
282
-
283
- .attr('y', function(d) { return d.y; });
284
-
285
-
286
-
287
- });
288
-
289
- });
290
-
291
- }
292
-
293
-
294
-
295
- /**
296
-
297
- * Main
298
-
299
- */
300
-
301
- var svg_id = 'svg_area';
302
-
303
- var element = document.getElementById(svg_id);
304
-
305
- var data_path = 'data/data.json';
306
-
307
-
308
-
309
- init(svg_id, element.clientWidth, element.clientHeight, data_path);
310
-
311
- ```

1

コード追加

2016/09/17 17:50

投稿

kkkmokotan
kkkmokotan

スコア45

test CHANGED
File without changes
test CHANGED
@@ -87,3 +87,225 @@
87
87
  としてみました。しかしなにも表示されません。。。
88
88
 
89
89
  他のサイトも見てみましたが解決できません。初心者なので詰まってしまいどうしたらいいかわからないのでアドバイスをお願い致します。
90
+
91
+
92
+
93
+
94
+
95
+ 追記
96
+
97
+ 解答をもとに編集したコード。
98
+
99
+ テキストとノードの円がでなくなってしまった。
100
+
101
+
102
+
103
+ ```javascript
104
+
105
+ /**
106
+
107
+ * Set arrow
108
+
109
+ */
110
+
111
+ function _setArrow(svg)
112
+
113
+ {
114
+
115
+ svg.append('defs').selectAll('marker')
116
+
117
+ .data(['arrow']).enter()
118
+
119
+ .append('marker')
120
+
121
+ .attr('id', function(d) { return d; })
122
+
123
+ .attr('viewBox', '0 -5 10 10')
124
+
125
+ .attr('refX', 25)
126
+
127
+ .attr('refY', 0)
128
+
129
+ .attr('markerWidth', 20)
130
+
131
+ .attr('markerHeight', 10)
132
+
133
+ .attr('orient', 'auto')
134
+
135
+ .append('path')
136
+
137
+ .attr('d', 'M0,-5L10,0L0,5 L10,0 L0, -5')
138
+
139
+ .style('stroke', '#4679BD')
140
+
141
+ .style('opacity', '0.6');
142
+
143
+ };
144
+
145
+
146
+
147
+
148
+
149
+ /**
150
+
151
+ * Initialize SVG display
152
+
153
+ */
154
+
155
+ function init(svg_id, width, height, data_path)
156
+
157
+ {
158
+
159
+ // 色は既定のがある。
160
+
161
+ var color = d3.scale.category20();
162
+
163
+
164
+
165
+ var force = d3.layout.force()
166
+
167
+ .charge(-500) // node同士の力の基準?
168
+
169
+ .linkDistance(100) // node同士の距離の基準
170
+
171
+ .size([width, height]);
172
+
173
+
174
+
175
+ var svg = d3.select('#' + svg_id).append('svg')
176
+
177
+ .attr('width', width)
178
+
179
+ .attr('height', height);
180
+
181
+
182
+
183
+ _setArrow(svg);
184
+
185
+
186
+
187
+ d3.json(data_path, function(error, graph) {
188
+
189
+
190
+
191
+ // JSON read error 時
192
+
193
+ if (graph == null) {
194
+
195
+ alert(error);
196
+
197
+ return;
198
+
199
+ }
200
+
201
+
202
+
203
+ force.nodes(graph.nodes)
204
+
205
+ .links(graph.links);
206
+
207
+
208
+
209
+ // Tick start
210
+
211
+ force.start();
212
+
213
+
214
+
215
+ var link = svg.selectAll('.link')
216
+
217
+ .data(graph.links).enter()
218
+
219
+ .append('line')
220
+
221
+ .attr('class', 'link')
222
+
223
+ .style('stroke-width', 1)
224
+
225
+ .style('marker-end', 'url(#arrow)');
226
+
227
+
228
+
229
+ var node = svg.selectAll(".node")
230
+
231
+ .data(graph.nodes).enter()
232
+
233
+ .append('g')
234
+
235
+ .attr('class', 'node')
236
+
237
+ .call(force.drag);
238
+
239
+
240
+
241
+ var circle = node.append("image")
242
+
243
+ .attr({"xlink:href":"https://placehold.jp/24/cc9999/993333/350x150.png"
244
+
245
+ });
246
+
247
+
248
+
249
+ var text = node.append("text")
250
+
251
+ .attr({"text-anchor":"middle",
252
+
253
+ "fill":"black"})
254
+
255
+ .style({"font-size":14})
256
+
257
+ .text(function(d) { return d.label; });
258
+
259
+
260
+
261
+
262
+
263
+ force.on('tick', function() {
264
+
265
+ link.attr('x1', function(d) { return d.source.x; })
266
+
267
+ .attr('y1', function(d) { return d.source.y; })
268
+
269
+ .attr('x2', function(d) { return d.target.x; })
270
+
271
+ .attr('y2', function(d) { return d.target.y; });
272
+
273
+
274
+
275
+ circle.attr('cx', function(d) { return d.x; })
276
+
277
+ .attr('cy', function(d) { return d.y; });
278
+
279
+
280
+
281
+ text.attr('x', function(d) { return d.x; })
282
+
283
+ .attr('y', function(d) { return d.y; });
284
+
285
+
286
+
287
+ });
288
+
289
+ });
290
+
291
+ }
292
+
293
+
294
+
295
+ /**
296
+
297
+ * Main
298
+
299
+ */
300
+
301
+ var svg_id = 'svg_area';
302
+
303
+ var element = document.getElementById(svg_id);
304
+
305
+ var data_path = 'data/data.json';
306
+
307
+
308
+
309
+ init(svg_id, element.clientWidth, element.clientHeight, data_path);
310
+
311
+ ```