gpt4 book ai didi

java - 如何使用 IJava 内核在 Jupyter Notebook 中嵌入 Tablesaw 图形?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:45:26 49 4
gpt4 key购买 nike

我想嵌入 Tablesaw使用 IJava 的 Jupyter Notebook 中的交互式图表核心。我意识到 Tablesaw 可能无法开箱即用,但我愿意付出一些努力来实现这一点。我是 Java 专家,但我是 Jupyter Notebook 和 IJava 内核的新手,所以我不确定从哪里开始。是否有一些用于 Jupyter Notebook 或 IJava 的 API 用于嵌入对象?

首先,我安装了 Anaconda,然后在 Jupyter Notebook 中安装了 IJava 内核,没有任何问题。到目前为止,它在 Windows 10 上使用 OpenJDK 11 工作顺利!接下来我尝试使用 Tablesaw。我能够添加它的 Maven 依赖项、加载 CSV 文件并创建绘图。非常好!

然而,为了生成图表,Tablesaw 使用 Plotly 生成一个临时 HTML 文件,并调用浏览器来显示交互式图表。换句话说,图表不会出现在 Jupyter Notebook 中

Tablesaw 有一个 example with embedded graphs使用 BeakerX内核(不是 IJava),并且如您所见(向下滚动到“使用线性回归玩(金钱)球”),他们嵌入了一个 Tablesaw Plot 直接在 Jupyter Notebook 中。所以我知道从概念上讲,在具有 Java 内核的 Jupyter Notebook 中嵌入交互式 Tablesaw 图形是可能的。

此功能是 BeakerX 特有的吗?我会切换到 BeakerX,但从文档中我没有看到任何关于 BeakerX 支持 Java 9+ 的信息。此外,IJava 似乎是一个更精简的实现,直接构建在 JShell 之上。

我从哪里开始弄清楚如何使用 IJava 内核将 Tablesaw Plot 对象作为交互式图形嵌入到 Jupyter Notebook 中,就像他们在 BeakerX 中所做的那样?

最佳答案

IJava 内核有两个主要功能 display_data ; displayrender .两者都挂入Renderer来自 base kernel .我们可以为 Figure 注册一个渲染函数。从台锯上打字。

  1. 通过 loadFromPOM 添加 tablesaw-jsplot 依赖项(以及所有必需的传递依赖项)细胞魔法:

    %%loadFromPOM
    <dependency>
    <groupId>tech.tablesaw</groupId>
    <artifactId>tablesaw-jsplot</artifactId>
    <version>0.30.4</version>
    </dependency>
  2. IJava 注册一个渲染函数的渲染器。

    1. 我们为 tech.tablesaw.plotly.components.Figure 创建了一个注册.
    2. 如果在渲染期间未指定输出类型,那么我们希望它默认为 text/html (通过 preferring 电话)。
    3. 如果请求 html 渲染,我们构建目标 <div>以及调用 plotly 渲染到 <div> 中的 javascript .大部分逻辑是通过 tablesaw 的 asJavascript 完成的方法,但 Hook 到 Jupyter notebook 的 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();
    });
    });
  3. 然后我们可以创建一个表格来显示(取自 Tablesaw docs )。

    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
  4. 最后我们可以创建一个 Figure用于表格并通过在 IJava 中显示事物的 3 种方法之一来显示它。

    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

关于java - 如何使用 IJava 内核在 Jupyter Notebook 中嵌入 Tablesaw 图形?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54654434/

49 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com