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

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

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

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

459閲覧

jupyterでpy_d3というライブラリを使って、D3.jsのグラフを表示したい

WasedaGhost

総合スコア16

D3.js

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/02/27 13:18

前提・実現したいこと

jupyterでpy_d3というライブラリを使って、D3.jsのグラフを表示したいのですが、うまくいきません。
hello worldは表示されるのでpy_d3自体は動いていると思うのですが、以下を表示させようとしても何も出力されません。アドバイスお願いします。

該当のソースコード

python

1%load_ext py_d3 2 3%%d3 4 5<!DOCTYPE html> 6<html> 7 8<head> 9 <meta charset="utf-8"> 10 <title>D3 Test</title> 11 <script src="https://d3js.org/d3.v5.min.js"></script> 12</head> 13 14<body> 15 <script> 16 var dataset = [ 17 [5, 20], 18 [480, 90], 19 [250, 50], 20 [100, 33], 21 [330, 95], 22 [410, 12], 23 [475, 44], 24 [25, 67], 25 [85, 21], 26 [220, 88] 27 ]; 28 var width = 800; 29 var height = 600; 30 31 var svg = d3.select("body").append("svg").attr("width", width).attr("height", height); 32 var padding = 30; 33 34 var xScale = d3.scaleLinear() 35 .domain([0, d3.max(dataset, function(d){return d[0];})]) 36 .range([padding, width - padding]); 37 38 var yScale = d3.scaleLinear() 39 .domain([0, d3.max(dataset, function(d){return d[1];})]) 40 .range([height - padding, padding]); 41 42 var axisx = d3.axisBottom(xScale); 43 var axisy = d3.axisLeft(yScale); 44 svg.append("g") 45 .attr("transform", "translate(" + 0 + "," + (height - padding) + ")") 46 .call(axisx); 47 48 svg.append("g") 49 .attr("transform", "translate(" + padding + "," + 0 + ")") 50 .call(axisy); 51 52 svg.append("g") 53 .selectAll("circle") 54 .data(dataset) 55 .enter() 56 .append("circle").attr("cx", function(d) { 57 return xScale(d[0]); 58 }) 59 .attr("cy", function(d) { 60 return yScale(d[1]); 61 }) 62 .attr("fill", "SkyBlue") 63 .attr("r", 4); 64 65 </script> 66</body> 67 68</html>

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

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

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

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

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

guest

回答1

0

ベストアンサー

https://github.com/ResidentMario/py_d3
のhello worldのコードをNotebook上でそのまま打ち込み

Notebook

1%%d3 2<g></g> 3<script> 4d3.select("g").text("Hello World!") 5</script>

このセルを実行したところ"Hello World!"というテキストは一つの出力セルとして表示されました。

ご存じのようにNotebookのページは一枚のHTMLページ上に複数の入力・出力セルが縦方向に並んだ構造をしています。%%d3の結果が一つの出力セルとして表示されるということは「%%d3のセルに記述するHTML部分は出力セルに該当する要素のみ(例えばg要素のみ)とすべきなのだろう」と自分は思いました。

さてご質問のコードを見てみますと「DOCTYPEから始まるHTMLページ全体」を記述しておられます。そこで次のように余分と思える要素を削除するよう変更したところグラフが表示されました。

変更点:
<!DOCTYPE html><body ...>まで削除
・上記の代わりに<g></g>を挿入
・javascript中のselect対象の要素をbodyからgに変更
=>var svg = d3.select("g").append("svg").attr("width", width).attr("height", height);
</body></html>まで削除


最初に挙げたd3_pyサイトのHow it worksの項にNotebook上で動かすためにselectにパッチを当てており入力セルに記述した範囲のHTML要素のみを検索対象にするといったことが書いてあります。つまり一枚のページの複数のセルに同一の要素(gなど)をidなしで記述しても期待通りに動くようになっているみたいです。実際次のように書いてみると期待どおりそれぞれのセルの記述結果が出力セルに反映されました。

Nodebook

1In [2]: %%d3 2 <g></g> 3 <script>d3.select("g").text("AAA")</script> 4 AAA 5In [3]: %%d3 6 <g></g> 7 <script>d3.select("g").text("BBB")</script> 8 BBB

ということでd3_pyを使う場合、記述するHTMLは常に<g></g>のみでいいんじゃないかなと思いました。

投稿2019/02/28 03:16

編集2019/03/01 15:45
KSwordOfHaste

総合スコア18394

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

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

WasedaGhost

2019/03/01 13:51

ご指摘の通り、無事実行できました。 親切・ご丁寧な回答誠にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問