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

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

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

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

JSON

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

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

Q&A

解決済

1回答

678閲覧

idとsource,targetが一致しない

maigoneko

総合スコア13

D3.js

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

JSON

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

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

0グッド

0クリップ

投稿2017/11/29 11:57

編集2017/12/04 06:21

###前提・実現したいこと
以下のjavascriptを用いて、d3.jsでのforceレイアウトの描画をしたいと考えています。

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

現状だとnodes[0] = links["source"]になってしまっています。
最終的にはnodesのidをもとに、souceとtargetの関係を描画したいと考えています
(例)
nodes id:1 ユーザー:test1
nodes id:2 ユーザー:test2
source:1= nodes:id1
target:2=nodes:id2 (test1 → test2の関係)

このようにするためには、どうのように改良すればsourceの値を正しく参照できるのでしょうか?

また以下のようなエラーも、ブラウザコンソール上で発生しています

Cannot read property 'weight' of undefined

javascript

1var nodes = new Array(); 2var links = new Array(); 3$.ajax({ 4 url: 'json4.php', 5 type: "GET", 6 dataType: 'json', 7 scriptCharset: 'utf-8', 8}).done(function(data) { 9 console.log("ajax通信に成功しました"); 10 11 nodes = data["nodes"]; 12 links = data["links"]; 13 14 //以下描画処理 15 function drawForce() { 16 var width = 1200; 17 var height = 600; 18 console.log(nodes); 19 console.log(links); 20 21 var force = d3.layout.force() 22 .nodes(nodes) 23 .links(links) 24 .size([width, height]) 25 .distance(380) 26 .friction(0.9) 27 .charge(-800) 28 .gravity(0.1) 29 .start(); 30 31 // svg領域の作成 32 var svg = d3.select("body") 33 .append("svg") 34 .attr({ 35 width: width, 36 height: height 37 }); 38 39 // link線の描画(svgのline描画機能を利用) 40 var link = svg.selectAll("line") 41 .data(links) 42 .enter() 43 .append("line") 44 .style({ 45 stroke: "#ccc", 46 "stroke-width": 1 47 }); 48 49 var g = svg.selectAll("g") 50 .data(nodes) 51 .enter() 52 .append("g") 53 .call(force.drag); 54 55 var a = g.append("a") 56 .attr({ 57 "xlink:href": function(data) { 58 return data.url 59 }, 60 }); 61 62 var node = a.append("image") 63 .attr({ 64 "xlink:href": function(data) { 65 return data.pic 66 }, 67 "width": 80, 68 "height": 80 69 }); 70 71 72 var label = a.append("text") 73 .attr({ 74 "text-anchor": "middle", 75 "fill": "black" 76 }) 77 .style({ 78 "font-size": 14 79 }) 80 .text(function(data) { 81 return data.label; 82 }); 83 84 85 force.on("tick", function() { 86 link.attr({ 87 x1: function(d) { 88 return d.source.x; 89 }, 90 y1: function(d) { 91 return d.source.y; 92 }, 93 x2: function(d) { 94 return d.target.x; 95 }, 96 y2: function(d) { 97 return d.target.y; 98 } 99 }); 100 g.attr("transform", function(d) { 101 return "translate(" + d.x + "," + d.y + ")"; 102 }); 103 }); 104 } 105 drawForce(); 106 //以下ajaxエラー時 107 108}).fail(function(XMLHttpRequest, textStatus, errorThrown) { 109 console.log("ajax通信に失敗しました"); 110 console.log("XMLHttpRequest : " + XMLHttpRequest.status); 111 console.log("textStatus : " + textStatus); 112 console.log("errorThrown : " + errorThrown.message); 113}) 114 115 116

###console.log
イメージ説明

###追記 Cannot read property 'weight' of undefined
イメージ説明
getjson.29行めはvar force = d3.layout.force()の.startの行です
78行目はdrawForce();の部分です
###返信用

JavaScript

1var nodes = new Array(); 2var links = new Array(); 3//以下描画処理 4function drawForce() { 5 var width = 1200; 6 var height = 600; 7 console.log(nodes); 8 console.log(links); 9 10 var force = d3.layout.force() 11 .nodes(nodes) 12 .links(links) 13 .size([width, height]) 14 .distance(380) 15 .friction(0.9) 16 .charge(-800) 17 .gravity(0.1) 18 .start(); 19 20 // svg領域の作成 21 var svg = d3.select("body") 22 .append("svg") 23 .attr({width:width, height:height}); 24 25 // link線の描画(svgのline描画機能を利用) 26 var link = svg.selectAll("line") 27 .data(links) 28 .enter() 29 .append("line") 30 .style({stroke: "#ccc", 31 "stroke-width": 1 32 }); 33 34 var g = svg.selectAll("g") 35 .data(nodes) 36 .enter() 37 .append("g") 38 .call(force.drag); 39 40 var a = g.append("a") 41 .attr({"xlink:href":function(data){ return data.url }, }); 42 43 var node = a.append("image") 44 .attr({"xlink:href":function(data){ return data.pic }, 45 "width":80, 46 "height":80 47 }); 48 49 50 51 var label = a.append("text") 52 .attr({"text-anchor":"middle", 53 "fill":"black"}) 54 .style({"font-size":14}) 55 .text(function(data) { return data.label; }); 56 57 58 59force.on("tick", function() { 60 link.attr({x1: function(d) { return d.source.x; }, 61 y1: function(d) { return d.source.y; }, 62 x2: function(d) { return d.target.x; }, 63 y2: function(d) { return d.target.y; }}); 64 g.attr("transform", function(d) { return "translate(" + d.x + "," + d.y + ")"; }); 65 }); 66} 67$.ajax({ 68 url: 'json4.php', 69 type: "GET", 70 dataType: 'json', 71 scriptCharset:'utf-8', 72 }).done(function(data){ 73 console.log("ajax通信に成功しました"); 74console.log(data); 75 nodes = data["nodes"]; 76 links = data["links"]; 77 78 79drawForce(); 80//以下ajaxエラー時 81 82}).fail(function(XMLHttpRequest, textStatus, errorThrown){ 83 console.log("ajax通信に失敗しました"); 84 console.log("XMLHttpRequest : " + XMLHttpRequest.status); 85 console.log("textStatus : " + textStatus); 86 console.log("errorThrown : " + errorThrown.message); 87}) 88```プロパティweight 89![イメージ説明](1524736b1206c643a9bc1315344cfa84.png)

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

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

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

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

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

m.ts10806

2017/12/04 02:52

「Cannot read property 'weight' of undefined」はどこで発生していますか?また、ユーザー定義関数drawForce()をajax記述よりも外に出した場合(というかグローバル空間)はどうなりますか?
maigoneko

2017/12/04 05:12

fail後にfunction drawForceを記述すると、空のnodesとlinksがコンソールに表示されます またCannot read property 'weight' of undefinedの場所は今追記しておきました
maigoneko

2017/12/04 05:14

あと返信遅れてしまい申し訳ありません
m.ts10806

2017/12/04 05:30

fail後がどこを指しているか分からないですが、ajax(){} の外です。var nodesやvar linksと同列の場所です。(グローバル空間と書いたのですが・・・)
maigoneko

2017/12/04 05:47

返信用追記のように書いていたのですがこれでは間違えているのでしょうか
m.ts10806

2017/12/04 05:48

drawForce();はdoneの中に入れとかないとnodes もlinksも空のままかと思いますが・・・。もしくはajax通信終わる前に実行されてしまいますよ。
m.ts10806

2017/12/04 05:49

function drawForce() {}は外に、実際に呼び出しであるdrawForce();はdoneの中に。
m.ts10806

2017/12/04 05:52

結局はweightというプロパティは存在しないというのがエラーメッセージなので、取得したオブジェクトであるdataでそういうプロパティがあるか調べる必要があります。widthと打とうとしてweightとスペルミスが起きたとか、そんな感じだとは思いますが。
maigoneko

2017/12/04 06:25

自身が作成したプログラムにはjs php含めweightの記述はありませんでした しかしweightは表示されています
guest

回答1

0

ベストアンサー

英語版Stackflowですが、同様のエラーにお悩みの方がいました、

色々な意見が出ていますが、
air_bobさんの回答

I encounter same problem before, it is due to there is null values in source/target of links. print out nodes and links information might help to debug

私は前に同じ問題が発生している、それはリンクのソース/ターゲットにnull値があるためです。 ノードやリンクを表示して情報をデバッグするのに役立つかもしれない(Google翻訳そのまま)


elachellさんの回答

In addition to the answers mentioning the null in the source/target of links, the reason for this could be the assignment of an out-of-range source/target. E.g. you have 10 nodes and you assign the target to be the 11-th indexed node.

リンクのソース/ターゲットにnullを示す回答に加えて、これの理由は範囲外のソース/ターゲットの割り当てになる可能性があります。 例えば。 10個のノードがあり、11番目の索引ノードになるようにターゲットを割り当てます。(Google翻訳そのまま)

が参考になるかもしれません。

ptimさんの回答は解決に至れそうなコードも載せてくれているので参考にしてください。

投稿2017/12/04 07:47

編集2017/12/04 08:18
m.ts10806

総合スコア80850

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

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

maigoneko

2017/12/04 10:33

わかりました weightのエラーについてはStackflowを頼りにまた考えてみます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問