Как встроить таблицу Tablesaw в Jupyter Notebook с ядром IJava? - PullRequest
0 голосов
/ 12 февраля 2019

Я бы хотел встроить Tablesaw интерактивных графиков в Jupyter Notebook с использованием ядра IJava .Я понимаю, что Tablesaw, возможно, не сможет сделать это из коробки, но я готов приложить немного усилий, чтобы это произошло.Я эксперт по Java, но я новичок в Jupyter Notebook и в ядре IJava, поэтому я не уверен, с чего начать.Есть ли какой-нибудь API для Jupyter Notebook или для IJava для встраивания объектов?

Сначала я установил Anaconda, а затем без проблем установил ядро ​​IJava в Jupyter Notebook.До сих пор он работает без проблем, используя OpenJDK 11 на Windows 10!Затем я попытался использовать Tablesaw.Мне удалось добавить его зависимости Maven, загрузить файл CSV и создать график.Очень приятно!

Однако для создания графика Tablesaw генерирует временный HTML-файл, используя Plotly, и вызывает браузер для отображения интерактивного графика.Другими словами, график не отображается внутри Jupyter Notebook .

В Tablesaw есть пример со встроенными графиками с использованием ядра BeakerX (неIJava), и, как вы можете видеть (прокрутите вниз до «Play (Money) ball with Linear Regression»), они встраивают Tablesaw Plot прямо в Jupyter Notebook .Итак, я знаю, что концептуально можно внедрить интерактивный граф Tablesaw в Jupyter Notebook с ядром Java.

Является ли эта возможность чем-то специфичным для BeakerX?Я бы переключился на BeakerX, но из документации я ничего не видел о поддержке BeakerX Java 9+.Кроме того, IJava выглядел как более компактная реализация, построенная непосредственно на JShell.

Где я начинаю понимать, как встраивать объект Tablesaw Plot в виде интерактивного графа в Jupyter Notebook с использованием ядра IJava,как у них дела в BeakerX?

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

попробуйте использовать командную строку и использовать pip install Tablesaw, затем используйте другие предложения.

0 голосов
/ 19 февраля 2019

Ядро IJava имеет 2 основные функции для display_data;display и render.Оба подключаются к Renderer из базового ядра .Мы можем зарегистрировать функцию рендеринга для типа Figure из таблицы.

  1. Добавить зависимость tablesaw-jsplot (и все необходимые переходные зависимости) с помощью волшебства ячейки loadFromPOM:

    %%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/htmlpreferringcall).
    3. Если запрашивается рендеринг html, мы создаем цель <div>, а также javascript, который вызывает рендеринг графика в этот <div>.Большая часть этой логики выполняется с помощью табличного asJavascript метода, но подключается к настройке модуля require AMD ноутбука Jupyter.

    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 для таблицы и отобразить ее с помощьюодин из 3 способов отображения вещей в IJava.

    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
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...