Grammar of graphics — это грамматика для задания графиков, описанная Леландом Уилкинсоном в одноименной работе [1]. На основе этой работы была создана библиотека ggplot2 [2][3] для построения графиков на языке программирования R [4]. В ней для описания графиков используется синтаксис, вдохновленный грамматикой Уилкинсона. На основе библиотеки ggplot2 в компании JetBrains была разработана библиотека Lets-Plot [5] для языка программирования Kotlin [6]. Однако API для построения графика был взят почти напрямую из ggplot2, и унаследовал его существенные недостатки — отсутствие типизации и типобезопасности, проблемы со структурой (такие как отсутствие иерархии элементов графика, разделение взаимосвязанных элементов графика). Он не задействует средства Kotlin для создания идиоматичного синтаксиса, — например, внешних контекстов с получателями.
Постановка задачи
Первоначально, данная работы была направлена на разработку удобного предметно-ориентированного языка на Kotlin для построения графиков в библиотеке Lets-Plot, использую идеи Grammar of graphics.
Однако, в дальнейшем, задача была в значительной мере изменена. Было принято решение сделать API более универсальным, а именно:
1. Разработать универсальное промежуточное представление графика, которое можно перевести в представления графиков в различные движки для визуализации графиков.
2. Разработать предметно-ориентированный язык на Kotlin для построения графиков, генерирующая данное представление, с возможностью (опционально) добавлять в него элементы, основанные на особенностях движка, для которого строится график
Помимо этого, в задачу входило написании трансляторов, преобразующих получаемое при создании на разработанном предметно-ориентированном языке промежуточное представление графика во внутренние представления графиков конкретных движков. Такими движками были выбраны, разумеется, Lets-Plot, а также библиотека ECharts [7] на языке JavaScript [8]. ECharts был выбран по ряду причин. Во-первых, формат, в котором в ECharts представлен график, - это JSON, который несложно сгенерировать средствами Kotlin. Во-вторых, он использует подход описания графиков, отличный от Lets-Plot и ggplot2, а также написан на другом языке. Таким образом, реализация трансляции ECharts демонстрирует универсальность разработанного представления.
Другой немаловажной задачей было интегрировать разработанную библиотеку с существующими продуктами в экосистеме Kotlin for Data Science. А именно:
1. Kotlin Jupyter Kernel [9] - это ядро для Jupyter Notebook [10], позволяющее запускать на нем код на Kotlin. Необходимо было реализовать визуализацию создаваемых графиков на движках внутри ноутбука.
2. Kotlin Dataframe [11] - это библиотека для работы с данными. В рамках работы нужно реализовать визуализации данных, используя Dataframe как источник данных.
В ходе работы была разработаны предметно-ориентированный язык для построения графиков, который эффективно использует средства языка для достижения выразительности, читаемости и удобства. Он разработан таким образом, что в него можно вставлять особенности, зависящие от движка визуализации.
Разработанное промежуточное представление графика позволяет эффективно использовать один и тот же код для построения графика для визуализации в различных движках рендеринга. Благодаря простоте и универсальности, трансляции осуществляться во многие движки и несложно реализуется.
Реализованные трансляторы позволяют использовать разработанный язык для построения графиков и визуализировать их с помощью движков Lets-Plot и Apache Echarts.
Реализованные интеграции позволяют работать с важнейшими элементами экосистемы Kotlin for Data Science.
В результате работы все поставленные задачи были выполнены.
Разработанная библиотека в ближайшем будущем будет опубликована как часть официальных библиотек для языка Kotlin — kotlinx.
Весь код разработанного программного обеспечения доступен в публичных репозиториях на платформе GitHub:
• https://github.com/AndreiKingsley/ggdsl
• https://github.com/AndreiKingsley/ggdsl-lets-plot
• https://github.com/AndreiKingsley/ggdsl-echarts
• https://github.com/AndreiKingsley/ggdsl-dataframe
[1] L. Wilkinson: The Grammar of Graphics, Springer, 1999. ISBN 0-387-98774¬
6.
[2] Документация ggplot2. URL: https://ggplot2.tidyverse.org/
index.html
[3] H. Wickham, D. Navarro, T. L. Pedersen: ggplot2: elegant graphics for data analysis. URL:https://ggplot2-book.org
[4] Язык программирования R. URL:https://www.r-project.org
[5] Библиотека Lets-Plot. URL:https://github.com/JetBrains/lets-plot-kotlin
[6] Язык программирования Kotlin. URL:https://kotlinlang.org
[7] Библиотека Apache ECharts. URL:https://echarts.apache.org/en/index.html
[8] Язык программирования JavaScript. URL: https://
developer.mozilla.org/en-US/docs/Web/JavaScript
[9] Kotlin Jupyter Kernel. URL:https://github.com/Kotlin/kotlin-jupyter
[10] Jupyter Notebook. URL:https://jupyter.org
[11] Библиотека Kotlin Dataframe. URL:https://github.com/Kotlin/dataframe
[12] The official U.S. government source for fuel economy information. URL: https://fueleconomy.gov
[13] A. Nozik: An introduction to context-oriented programming in Kotlin. URL:https://proandroiddev.com/an-introduction-context-oriented-programming-in-kotlin-2e79d316b0a2
[14] Система сборки Gradle. URL:https://gradle.org
[15] Библиотека Kotlin Test. URL:https://kotlinlang.org/api/latest/kotlin.test/
[16] Библиотека kravis. URL:https://github.com/holgerbrandl/kravis
[17] Библиотека plotly.kt. URL:https://github.com/mipt-npm/plotly.kt
[18] Библиотека plotly. URL:https://plotly.com