質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
D3.js

D3.jsとは、データに基づいてHTMLやSVGドキュメントを編集するために作られた、小規模なオープンソースのJavaScript可視化ライブラリです。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

628閲覧

d3.dragが想定通りに機能しません

moriaki

総合スコア8

D3.js

D3.jsとは、データに基づいてHTMLやSVGドキュメントを編集するために作られた、小規模なオープンソースのJavaScript可視化ライブラリです。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2018/08/26 21:28

編集2018/08/26 21:33

前提・実現したいこと

jsonデータを可視化した矩形をドラッグで移動させたい。

発生している問題・エラーメッセージ

それぞれの矩形に対するドラッグが、1つ目の矩形を対象としてしまいます。また、矩形は一枚ずつ並べることを想定していますが、同じ矩形がJsonデータの数だけ重なってしまいます。

こちらを参照お願いします:
https://codepen.io/****

各々の矩形に対して、dragが自然な振る舞いをするよう機能させるにはどのような変更が必要でしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

今の振る舞いでどうなっているのか知るべきです。

イメージ説明

gタグが3つできています。

javascript

1 const svg = d3 2 .select("#heatmap") 3 .append("svg") 4 .attr("width", width) 5 .attr("height", height) 6 .attr("transform", `translate(${margin.left}, ${margin.top})`) 7 .selectAll("g") 8 .data(data) 9 .enter() 10 .append("g") 11 .call(drag)

data(data).enter().append("g")
でjson分だけgを作っていますが

javascript

1 svg.selectAll("g").data(data).enter() 2 .append("rect") 3 .attr("id", "block") 4 .attr("class", "block") 5 .attr("x", (d, i) => blocksize * (i % colsize)) // relative to 'svg' 6 .attr("y", (d, i) => blocksize * (data[i].row - 1)) // relative to 'svg' 7 .attr("width", blocksize) 8 .attr("height", blocksize) 9 .attr("fill", "#d00a") 10 .style("opacity", 0.5) 11 .attr("stroke", "#000") 12 .attr("stroke-width", "2") 13

ここで各々のgに対してさらにdata(data).enter().append("rect")
しているのでg×3,rect×3になっています。textも同様です。

おそらく方針としては「g×3の中にそれぞれrect×1」でしょう。

名前が少しわかりにくくなっていますが
const svgに入っているのはgです。
gに対してappendすればいいので

javascript

1 svg 2//.selectAll("g").data(data).enter() 束縛不要 3 .append("rect") 4 .attr("id", "block") 5//以下略 6 7 svg 8 //.selectAll("g").data(data).enter() 束縛不要 9 .append("text") 10 .attr("id", "text") 11//以下略

でいいかと思います。

投稿2018/08/27 02:20

sousuke

総合スコア3828

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

moriaki

2018/08/29 08:55

迅速な回答ありがとうございました!g要素について混乱していたようです。さらにsvgを具体的な名前に変更しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問