私は埋め込みたいのですがTablesaw使用JupyterノートブックにインタラクティブなグラフをIJavaのカーネルを。私はTablesawはボックスのこのアウトを行うことができないかもしれないことを認識し、私はこれを実現するために少し努力をして喜びました。ので、私は確信してどこから始めればないんだけど、私は、Javaの専門家だが、私はJupyterノートへとIJavaカーネルに新たなんです。オブジェクトを埋め込むためJupyterノートブック用またはIJavaのためのいくつかのAPIはありますか?
すべての私の最初のアナコンダをインストールした後、何の問題もなくJupyterノートブックにIJavaカーネルをインストールしました。これまでのところ、それは、Windows 10上でのOpenJDK 11を使用して滞りなく働いています!次はTablesawを使用しようとしました。私は、そのMavenの依存関係を追加CSVファイルをロードし、プロットを作成することができました。非常に素晴らしい!
しかしTablesawはPlotlyを使用して、一時的なHTMLファイルを生成し、インタラクティブなプロットを表示するには、ブラウザを起動するグラフを生成します。言い換えれば、グラフはJupyterノートブック内に表示されません。
Tablesawはあり埋め込まれたグラフを例使用BeakerXカーネル(ないIJava)を、そしてあなたが見ることができるように、彼らはTablesawを埋め込む(「線形回帰で遊ぶ(マネー)ボール」までスクロールダウン)Plot
を直接Jupyterノートブック内。私は概念的にJavaのカーネルでJupyterノートでインタラクティブTablesawグラフを埋め込むことを知っているので可能です。
BeakerXにこの能力を何か特定のですか?私はBeakerXに切り替えるだろうが、ドキュメントから、私はBeakerXサポートするJava 9+については何も表示されませんでした。またIJavaは直接JShellの上に構築された、スリムな実装のように思えました。
どこでTablesawの埋め込む方法を把握するために開始しますPlot
IJavaカーネル、彼らはBeakerXでやっている方法を使用してJupyterノートブックにインタラクティブなグラフとしてオブジェクトを?
IJavaカーネルは2つの主な機能を持っていますdisplay_data
。display
そして、render
。両方のフックRenderer
からベースカーネル。我々はのためのレンダリング機能を登録することができFigure
tablesawからタイプ。
経由tablesaw-jsplot依存(およびすべての必要な推移の依存関係)を追加し
loadFromPOM
、細胞の魔法:%%loadFromPOM <dependency> <groupId>tech.tablesaw</groupId> <artifactId>tablesaw-jsplot</artifactId> <version>0.30.4</version> </dependency>
以下のためのレンダリング機能を登録する
IJava
のレンダラ。- 私たちは、のために登録を作成します
tech.tablesaw.plotly.components.Figure
。 - 出力タイプは、中に指定されていない場合、我々はそれがデフォルトにしたいレンダリング
text/html
(とpreferring
コール)。 - HTMLが要求されてレンダリングすると、我々はターゲットの構築
<div>
だけでなく、plotlyことにレンダリング呼び出すJavaScriptを<div>
。このロジックのほとんどはtablesaw者を介して行われるasJavascript
Jupyterノートブックのに方法はなくフックrequire
AMDモジュールのセットアップ。
import io.github.spencerpark.ijava.IJava; IJava.getKernelInstance().getRenderer() .createRegistration(tech.tablesaw.plotly.components.Figure.class) .preferring(io.github.spencerpark.jupyter.kernel.display.mime.MIMEType.TEXT_HTML) .register((figure, ctx) -> { ctx.renderIfRequested(io.github.spencerpark.jupyter.kernel.display.mime.MIMEType.TEXT_HTML, () -> { String id = UUID.randomUUID().toString().replace("-", ""); figure.asJavascript(id); Map<String, Object> context = figure.getContext(); StringBuilder html = new StringBuilder(); html.append("<div id=\"").append(id).append("\"></div>\n"); html.append("<script>require(['https://cdn.plot.ly/plotly-1.44.4.min.js'], Plotly => {\n"); html.append("var target_").append(id).append(" = document.getElementById('").append(id).append("');\n"); html.append(context.get("figure")).append('\n'); html.append(context.get("plotFunction")).append('\n'); html.append("})</script>\n"); return html.toString(); }); });
- 私たちは、のために登録を作成します
その後、我々は(から取られたディスプレイにテーブルを作成することができTablesawドキュメント)。
import tech.tablesaw.api.*; import tech.tablesaw.plotly.api.*; import tech.tablesaw.plotly.components.*; String[] animals = {"bear", "cat", "giraffe"}; double[] cuteness = {90.1, 84.3, 99.7}; Table cuteAnimals = Table.create("Cute Animals") .addColumns( StringColumn.create("Animal types", animals), DoubleColumn.create("rating", cuteness) ); cuteAnimals
最後に作成することができ
Figure
、テーブル用とIJavaで物事を表示するための3つの方法のうちの1つを介して、それを表示します。VerticalBarPlot.create("Cute animals", cuteAnimals, "Animal types", "rating");
相当する
render
コール"text/html"
我々は(好ましいタイプとして設定しているため暗黙的preferring
登録時)render(VerticalBarPlot.create("Cute animals", cuteAnimals, "Animal types", "rating"), "text/html");
それはセルの最後ではない場合や、
display
関数が別のオプションです。たとえば、チャートと表示させcuteAnimals
、その後に:Figure figure = VerticalBarPlot.create("Cute animals", cuteAnimals, "Animal types", "rating"); display(figure); cuteAnimals