{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "fiscal-holly",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "   <div id=\"EcQeXG\"></div>\n",
       "   <script type=\"text/javascript\" data-lets-plot-script=\"library\">\n",
       "       if(!window.letsPlotCallQueue) {\n",
       "           window.letsPlotCallQueue = [];\n",
       "       }; \n",
       "       window.letsPlotCall = function(f) {\n",
       "           window.letsPlotCallQueue.push(f);\n",
       "       };\n",
       "       (function() {\n",
       "           var script = document.createElement(\"script\");\n",
       "           script.type = \"text/javascript\";\n",
       "           script.src = \"https://cdn.jsdelivr.net/gh/JetBrains/lets-plot@v2.5.1/js-package/distr/lets-plot.min.js\";\n",
       "           script.onload = function() {\n",
       "               window.letsPlotCall = function(f) {f();};\n",
       "               window.letsPlotCallQueue.forEach(function(f) {f();});\n",
       "               window.letsPlotCallQueue = [];\n",
       "               \n",
       "               \n",
       "           };\n",
       "           script.onerror = function(event) {\n",
       "               window.letsPlotCall = function(f) {};\n",
       "               window.letsPlotCallQueue = [];\n",
       "               var div = document.createElement(\"div\");\n",
       "               div.style.color = 'darkred';\n",
       "               div.textContent = 'Error loading Lets-Plot JS';\n",
       "               document.getElementById(\"EcQeXG\").appendChild(div);\n",
       "           };\n",
       "           var e = document.getElementById(\"EcQeXG\");\n",
       "           e.appendChild(script);\n",
       "       })();\n",
       "   </script>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%useLatestDescriptors\n",
    "%use lets-plot\n",
    "//%use krangl"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "worthy-cedar",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Lets-Plot Kotlin API v.4.1.1. Frontend: Notebook with dynamically loaded JS. Lets-Plot JS v.2.5.1."
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "LetsPlot.getInfo()  // Work around Krangl loading old Lets-Plot classes."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "received-tablet",
   "metadata": {},
   "outputs": [],
   "source": [
    "%use krangl"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "weird-republican",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<html><body><table><tr><th style=\"text-align:left\"></th><th style=\"text-align:left\">manufacturer</th><th style=\"text-align:left\">model</th><th style=\"text-align:left\">displ</th><th style=\"text-align:left\">year</th><th style=\"text-align:left\">cyl</th><th style=\"text-align:left\">trans</th><th style=\"text-align:left\">drv</th><th style=\"text-align:left\">cty</th><th style=\"text-align:left\">hwy</th><th style=\"text-align:left\">fl</th><th style=\"text-align:left\">class</th></tr><tr><td style=\"text-align:left\" title=\"1\">1</td><td style=\"text-align:left\" title=\"audi\">audi</td><td style=\"text-align:left\" title=\"a4\">a4</td><td style=\"text-align:left\" title=\"1.8\">1.8</td><td style=\"text-align:left\" title=\"1999\">1999</td><td style=\"text-align:left\" title=\"4\">4</td><td style=\"text-align:left\" title=\"auto(l5)\">auto(l5)</td><td style=\"text-align:left\" title=\"f\">f</td><td style=\"text-align:left\" title=\"18\">18</td><td style=\"text-align:left\" title=\"29\">29</td><td style=\"text-align:left\" title=\"p\">p</td><td style=\"text-align:left\" title=\"compact\">compact</td></tr><tr><td style=\"text-align:left\" title=\"2\">2</td><td style=\"text-align:left\" title=\"audi\">audi</td><td style=\"text-align:left\" title=\"a4\">a4</td><td style=\"text-align:left\" title=\"1.8\">1.8</td><td style=\"text-align:left\" title=\"1999\">1999</td><td style=\"text-align:left\" title=\"4\">4</td><td style=\"text-align:left\" title=\"manual(m5)\">manual(m5)</td><td style=\"text-align:left\" title=\"f\">f</td><td style=\"text-align:left\" title=\"21\">21</td><td style=\"text-align:left\" title=\"29\">29</td><td style=\"text-align:left\" title=\"p\">p</td><td style=\"text-align:left\" title=\"compact\">compact</td></tr><tr><td style=\"text-align:left\" title=\"3\">3</td><td style=\"text-align:left\" title=\"audi\">audi</td><td style=\"text-align:left\" title=\"a4\">a4</td><td style=\"text-align:left\" title=\"2.0\">2.0</td><td style=\"text-align:left\" title=\"2008\">2008</td><td style=\"text-align:left\" title=\"4\">4</td><td style=\"text-align:left\" title=\"manual(m6)\">manual(m6)</td><td style=\"text-align:left\" title=\"f\">f</td><td style=\"text-align:left\" title=\"20\">20</td><td style=\"text-align:left\" title=\"31\">31</td><td style=\"text-align:left\" title=\"p\">p</td><td style=\"text-align:left\" title=\"compact\">compact</td></tr></table><p>Shape: 3 x 12. \n",
       "</p></body></html>"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "val df = DataFrame.readCSV(\"https://raw.githubusercontent.com/JetBrains/lets-plot-kotlin/master/docs/examples/data/mpg.csv\")\n",
    "df.head(3)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "accepted-afternoon",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "   <div id=\"kto5tG\"></div>\n",
       "   <script type=\"text/javascript\" data-lets-plot-script=\"plot\">\n",
       "       (function() {\n",
       "           var plotSpec={\n",
       "\"ggtitle\":{\n",
       "\"text\":\"Fuel efficiency\\nfor most popular models of car\",\n",
       "\"subtitle\":\"Period 1999-2008\"\n",
       "},\n",
       "\"mapping\":{\n",
       "\"x\":\"displ\",\n",
       "\"y\":\"hwy\"\n",
       "},\n",
       "\"data\":{\n",
       "\"displ\":[1.8,1.8,2.0,2.0,2.8,2.8,3.1,1.8,1.8,2.0,2.0,2.8,2.8,3.1,3.1,2.8,3.1,4.2,5.3,5.3,5.3,5.7,6.0,5.7,5.7,6.2,6.2,7.0,5.3,5.3,5.7,6.5,2.4,2.4,3.1,3.5,3.6,2.4,3.0,3.3,3.3,3.3,3.3,3.3,3.8,3.8,3.8,4.0,3.7,3.7,3.9,3.9,4.7,4.7,4.7,5.2,5.2,3.9,4.7,4.7,4.7,5.2,5.7,5.9,4.7,4.7,4.7,4.7,4.7,4.7,5.2,5.2,5.7,5.9,4.6,5.4,5.4,4.0,4.0,4.0,4.0,4.6,5.0,4.2,4.2,4.6,4.6,4.6,5.4,5.4,3.8,3.8,4.0,4.0,4.6,4.6,4.6,4.6,5.4,1.6,1.6,1.6,1.6,1.6,1.8,1.8,1.8,2.0,2.4,2.4,2.4,2.4,2.5,2.5,3.3,2.0,2.0,2.0,2.0,2.7,2.7,2.7,3.0,3.7,4.0,4.7,4.7,4.7,5.7,6.1,4.0,4.2,4.4,4.6,5.4,5.4,5.4,4.0,4.0,4.6,5.0,2.4,2.4,2.5,2.5,3.5,3.5,3.0,3.0,3.5,3.3,3.3,4.0,5.6,3.1,3.8,3.8,3.8,5.3,2.5,2.5,2.5,2.5,2.5,2.5,2.2,2.2,2.5,2.5,2.5,2.5,2.5,2.5,2.7,2.7,3.4,3.4,4.0,4.7,2.2,2.2,2.4,2.4,3.0,3.0,3.5,2.2,2.2,2.4,2.4,3.0,3.0,3.3,1.8,1.8,1.8,1.8,1.8,4.7,5.7,2.7,2.7,2.7,3.4,3.4,4.0,4.0,2.0,2.0,2.0,2.0,2.8,1.9,2.0,2.0,2.0,2.0,2.5,2.5,2.8,2.8,1.9,1.9,2.0,2.0,2.5,2.5,1.8,1.8,2.0,2.0,2.8,2.8,3.6],\n",
       "\"hwy\":[29.0,29.0,31.0,30.0,26.0,26.0,27.0,26.0,25.0,28.0,27.0,25.0,25.0,25.0,25.0,24.0,25.0,23.0,20.0,15.0,20.0,17.0,17.0,26.0,23.0,26.0,25.0,24.0,19.0,14.0,15.0,17.0,27.0,30.0,26.0,29.0,26.0,24.0,24.0,22.0,22.0,24.0,24.0,17.0,22.0,21.0,23.0,23.0,19.0,18.0,17.0,17.0,19.0,19.0,12.0,17.0,15.0,17.0,17.0,12.0,17.0,16.0,18.0,15.0,16.0,12.0,17.0,17.0,16.0,12.0,15.0,16.0,17.0,15.0,17.0,17.0,18.0,17.0,19.0,17.0,19.0,19.0,17.0,17.0,17.0,16.0,16.0,17.0,15.0,17.0,26.0,25.0,26.0,24.0,21.0,22.0,23.0,22.0,20.0,33.0,32.0,32.0,29.0,32.0,34.0,36.0,36.0,29.0,26.0,27.0,30.0,31.0,26.0,26.0,28.0,26.0,29.0,28.0,27.0,24.0,24.0,24.0,22.0,19.0,20.0,17.0,12.0,19.0,18.0,14.0,15.0,18.0,18.0,15.0,17.0,16.0,18.0,17.0,19.0,19.0,17.0,29.0,27.0,31.0,32.0,27.0,26.0,26.0,25.0,25.0,17.0,17.0,20.0,18.0,26.0,26.0,27.0,28.0,25.0,25.0,24.0,27.0,25.0,26.0,23.0,26.0,26.0,26.0,26.0,25.0,27.0,25.0,27.0,20.0,20.0,19.0,17.0,20.0,17.0,29.0,27.0,31.0,31.0,26.0,26.0,28.0,27.0,29.0,31.0,31.0,26.0,26.0,27.0,30.0,33.0,35.0,37.0,35.0,15.0,18.0,20.0,20.0,22.0,17.0,19.0,18.0,20.0,29.0,26.0,29.0,29.0,24.0,44.0,29.0,26.0,29.0,29.0,29.0,29.0,23.0,24.0,44.0,41.0,29.0,26.0,28.0,29.0,29.0,29.0,28.0,29.0,26.0,26.0,26.0]\n",
       "},\n",
       "\"kind\":\"plot\",\n",
       "\"scales\":[{\n",
       "\"aesthetic\":\"x\",\n",
       "\"name\":\"Engine displacement\\n(litres)\"\n",
       "},{\n",
       "\"aesthetic\":\"y\",\n",
       "\"name\":\"Highway\\nmiles per gallon\"\n",
       "}],\n",
       "\"layers\":[{\n",
       "\"mapping\":{\n",
       "},\n",
       "\"stat\":\"identity\",\n",
       "\"position\":\"identity\",\n",
       "\"geom\":\"point\",\n",
       "\"data\":{\n",
       "}\n",
       "}],\n",
       "\"caption\":{\n",
       "\"text\":\"MPG Dataset\"\n",
       "},\n",
       "\"theme\":{\n",
       "\"name\":\"classic\",\n",
       "\"plot_background\":{\n",
       "\"size\":1.0,\n",
       "\"blank\":false\n",
       "}\n",
       "}\n",
       "};\n",
       "           var plotContainer = document.getElementById(\"kto5tG\");\n",
       "           window.letsPlotCall(function() {{\n",
       "               LetsPlot.buildPlotFromProcessedSpecs(plotSpec, -1, -1, plotContainer);\n",
       "           }});\n",
       "       })();    \n",
       "   </script>"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "val p = letsPlot(df.toMap()) { x = \"displ\"; y = \"hwy\" } + geomPoint() +\n",
    "        labs(\n",
    "            title = \"Fuel efficiency\\nfor most popular models of car\",\n",
    "            subtitle = \"Period 1999-2008\",\n",
    "            caption = \"MPG Dataset\",\n",
    "            x = \"Engine displacement\\n(litres)\", \n",
    "            y = \"Highway\\nmiles per gallon\"\n",
    "        ) + themeClassic() + theme(plotBackground = elementRect(size=1))\n",
    "p"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "posted-newsletter",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "   <div id=\"hGTUBe\"></div>\n",
       "   <script type=\"text/javascript\" data-lets-plot-script=\"plot\">\n",
       "       (function() {\n",
       "           var plotSpec={\n",
       "\"ggtitle\":{\n",
       "\"text\":\"Fuel efficiency\\nfor most popular models of car\",\n",
       "\"subtitle\":\"Period 1999-2008\"\n",
       "},\n",
       "\"mapping\":{\n",
       "\"x\":\"displ\",\n",
       "\"y\":\"hwy\"\n",
       "},\n",
       "\"data\":{\n",
       "\"displ\":[1.8,1.8,2.0,2.0,2.8,2.8,3.1,1.8,1.8,2.0,2.0,2.8,2.8,3.1,3.1,2.8,3.1,4.2,5.3,5.3,5.3,5.7,6.0,5.7,5.7,6.2,6.2,7.0,5.3,5.3,5.7,6.5,2.4,2.4,3.1,3.5,3.6,2.4,3.0,3.3,3.3,3.3,3.3,3.3,3.8,3.8,3.8,4.0,3.7,3.7,3.9,3.9,4.7,4.7,4.7,5.2,5.2,3.9,4.7,4.7,4.7,5.2,5.7,5.9,4.7,4.7,4.7,4.7,4.7,4.7,5.2,5.2,5.7,5.9,4.6,5.4,5.4,4.0,4.0,4.0,4.0,4.6,5.0,4.2,4.2,4.6,4.6,4.6,5.4,5.4,3.8,3.8,4.0,4.0,4.6,4.6,4.6,4.6,5.4,1.6,1.6,1.6,1.6,1.6,1.8,1.8,1.8,2.0,2.4,2.4,2.4,2.4,2.5,2.5,3.3,2.0,2.0,2.0,2.0,2.7,2.7,2.7,3.0,3.7,4.0,4.7,4.7,4.7,5.7,6.1,4.0,4.2,4.4,4.6,5.4,5.4,5.4,4.0,4.0,4.6,5.0,2.4,2.4,2.5,2.5,3.5,3.5,3.0,3.0,3.5,3.3,3.3,4.0,5.6,3.1,3.8,3.8,3.8,5.3,2.5,2.5,2.5,2.5,2.5,2.5,2.2,2.2,2.5,2.5,2.5,2.5,2.5,2.5,2.7,2.7,3.4,3.4,4.0,4.7,2.2,2.2,2.4,2.4,3.0,3.0,3.5,2.2,2.2,2.4,2.4,3.0,3.0,3.3,1.8,1.8,1.8,1.8,1.8,4.7,5.7,2.7,2.7,2.7,3.4,3.4,4.0,4.0,2.0,2.0,2.0,2.0,2.8,1.9,2.0,2.0,2.0,2.0,2.5,2.5,2.8,2.8,1.9,1.9,2.0,2.0,2.5,2.5,1.8,1.8,2.0,2.0,2.8,2.8,3.6],\n",
       "\"hwy\":[29.0,29.0,31.0,30.0,26.0,26.0,27.0,26.0,25.0,28.0,27.0,25.0,25.0,25.0,25.0,24.0,25.0,23.0,20.0,15.0,20.0,17.0,17.0,26.0,23.0,26.0,25.0,24.0,19.0,14.0,15.0,17.0,27.0,30.0,26.0,29.0,26.0,24.0,24.0,22.0,22.0,24.0,24.0,17.0,22.0,21.0,23.0,23.0,19.0,18.0,17.0,17.0,19.0,19.0,12.0,17.0,15.0,17.0,17.0,12.0,17.0,16.0,18.0,15.0,16.0,12.0,17.0,17.0,16.0,12.0,15.0,16.0,17.0,15.0,17.0,17.0,18.0,17.0,19.0,17.0,19.0,19.0,17.0,17.0,17.0,16.0,16.0,17.0,15.0,17.0,26.0,25.0,26.0,24.0,21.0,22.0,23.0,22.0,20.0,33.0,32.0,32.0,29.0,32.0,34.0,36.0,36.0,29.0,26.0,27.0,30.0,31.0,26.0,26.0,28.0,26.0,29.0,28.0,27.0,24.0,24.0,24.0,22.0,19.0,20.0,17.0,12.0,19.0,18.0,14.0,15.0,18.0,18.0,15.0,17.0,16.0,18.0,17.0,19.0,19.0,17.0,29.0,27.0,31.0,32.0,27.0,26.0,26.0,25.0,25.0,17.0,17.0,20.0,18.0,26.0,26.0,27.0,28.0,25.0,25.0,24.0,27.0,25.0,26.0,23.0,26.0,26.0,26.0,26.0,25.0,27.0,25.0,27.0,20.0,20.0,19.0,17.0,20.0,17.0,29.0,27.0,31.0,31.0,26.0,26.0,28.0,27.0,29.0,31.0,31.0,26.0,26.0,27.0,30.0,33.0,35.0,37.0,35.0,15.0,18.0,20.0,20.0,22.0,17.0,19.0,18.0,20.0,29.0,26.0,29.0,29.0,24.0,44.0,29.0,26.0,29.0,29.0,29.0,29.0,23.0,24.0,44.0,41.0,29.0,26.0,28.0,29.0,29.0,29.0,28.0,29.0,26.0,26.0,26.0]\n",
       "},\n",
       "\"kind\":\"plot\",\n",
       "\"scales\":[{\n",
       "\"aesthetic\":\"x\",\n",
       "\"name\":\"Engine displacement\\n(litres)\"\n",
       "},{\n",
       "\"aesthetic\":\"y\",\n",
       "\"name\":\"Highway\\nmiles per gallon\"\n",
       "}],\n",
       "\"layers\":[{\n",
       "\"mapping\":{\n",
       "},\n",
       "\"stat\":\"identity\",\n",
       "\"position\":\"identity\",\n",
       "\"geom\":\"point\",\n",
       "\"data\":{\n",
       "}\n",
       "}],\n",
       "\"caption\":{\n",
       "\"text\":\"MPG Dataset\"\n",
       "},\n",
       "\"theme\":{\n",
       "\"name\":\"classic\",\n",
       "\"plot_background\":{\n",
       "\"size\":1.0,\n",
       "\"blank\":false\n",
       "},\n",
       "\"axis_title_y\":{\n",
       "\"margin\":{\n",
       "\"r\":10.0,\n",
       "\"l\":15.0\n",
       "},\n",
       "\"blank\":false\n",
       "},\n",
       "\"plot_title\":{\n",
       "\"margin\":{\n",
       "\"t\":15.0\n",
       "},\n",
       "\"blank\":false\n",
       "},\n",
       "\"plot_caption\":{\n",
       "\"margin\":{\n",
       "\"b\":15.0\n",
       "},\n",
       "\"blank\":false\n",
       "},\n",
       "\"axis_title_x\":{\n",
       "\"margin\":{\n",
       "\"t\":10.0\n",
       "},\n",
       "\"blank\":false\n",
       "},\n",
       "\"plot_subtitle\":{\n",
       "\"margin\":{\n",
       "\"b\":10.0\n",
       "},\n",
       "\"blank\":false\n",
       "}\n",
       "}\n",
       "};\n",
       "           var plotContainer = document.getElementById(\"hGTUBe\");\n",
       "           window.letsPlotCall(function() {{\n",
       "               LetsPlot.buildPlotFromProcessedSpecs(plotSpec, -1, -1, plotContainer);\n",
       "           }});\n",
       "       })();    \n",
       "   </script>"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "// Change margins around plot title, subtitle, caption and axis titles\n",
    "\n",
    "p + theme(plotTitle = elementText(margin = margin(t=15)), \n",
    "          plotSubtitle = elementText(margin = margin(b=10)),\n",
    "          plotCaption = elementText(margin = margin(b=15)),\n",
    "          axisTitleX = elementText(margin = margin(t=10)), \n",
    "          axisTitleY = elementText(margin = margin(r=10, l=15)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "median-badge",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "   <div id=\"kF66Zl\"></div>\n",
       "   <script type=\"text/javascript\" data-lets-plot-script=\"plot\">\n",
       "       (function() {\n",
       "           var plotSpec={\n",
       "\"ggtitle\":{\n",
       "\"text\":\"Fuel efficiency\\nfor most popular models of car\",\n",
       "\"subtitle\":\"Period 1999-2008\"\n",
       "},\n",
       "\"mapping\":{\n",
       "\"x\":\"displ\",\n",
       "\"y\":\"hwy\"\n",
       "},\n",
       "\"data\":{\n",
       "\"displ\":[1.8,1.8,2.0,2.0,2.8,2.8,3.1,1.8,1.8,2.0,2.0,2.8,2.8,3.1,3.1,2.8,3.1,4.2,5.3,5.3,5.3,5.7,6.0,5.7,5.7,6.2,6.2,7.0,5.3,5.3,5.7,6.5,2.4,2.4,3.1,3.5,3.6,2.4,3.0,3.3,3.3,3.3,3.3,3.3,3.8,3.8,3.8,4.0,3.7,3.7,3.9,3.9,4.7,4.7,4.7,5.2,5.2,3.9,4.7,4.7,4.7,5.2,5.7,5.9,4.7,4.7,4.7,4.7,4.7,4.7,5.2,5.2,5.7,5.9,4.6,5.4,5.4,4.0,4.0,4.0,4.0,4.6,5.0,4.2,4.2,4.6,4.6,4.6,5.4,5.4,3.8,3.8,4.0,4.0,4.6,4.6,4.6,4.6,5.4,1.6,1.6,1.6,1.6,1.6,1.8,1.8,1.8,2.0,2.4,2.4,2.4,2.4,2.5,2.5,3.3,2.0,2.0,2.0,2.0,2.7,2.7,2.7,3.0,3.7,4.0,4.7,4.7,4.7,5.7,6.1,4.0,4.2,4.4,4.6,5.4,5.4,5.4,4.0,4.0,4.6,5.0,2.4,2.4,2.5,2.5,3.5,3.5,3.0,3.0,3.5,3.3,3.3,4.0,5.6,3.1,3.8,3.8,3.8,5.3,2.5,2.5,2.5,2.5,2.5,2.5,2.2,2.2,2.5,2.5,2.5,2.5,2.5,2.5,2.7,2.7,3.4,3.4,4.0,4.7,2.2,2.2,2.4,2.4,3.0,3.0,3.5,2.2,2.2,2.4,2.4,3.0,3.0,3.3,1.8,1.8,1.8,1.8,1.8,4.7,5.7,2.7,2.7,2.7,3.4,3.4,4.0,4.0,2.0,2.0,2.0,2.0,2.8,1.9,2.0,2.0,2.0,2.0,2.5,2.5,2.8,2.8,1.9,1.9,2.0,2.0,2.5,2.5,1.8,1.8,2.0,2.0,2.8,2.8,3.6],\n",
       "\"hwy\":[29.0,29.0,31.0,30.0,26.0,26.0,27.0,26.0,25.0,28.0,27.0,25.0,25.0,25.0,25.0,24.0,25.0,23.0,20.0,15.0,20.0,17.0,17.0,26.0,23.0,26.0,25.0,24.0,19.0,14.0,15.0,17.0,27.0,30.0,26.0,29.0,26.0,24.0,24.0,22.0,22.0,24.0,24.0,17.0,22.0,21.0,23.0,23.0,19.0,18.0,17.0,17.0,19.0,19.0,12.0,17.0,15.0,17.0,17.0,12.0,17.0,16.0,18.0,15.0,16.0,12.0,17.0,17.0,16.0,12.0,15.0,16.0,17.0,15.0,17.0,17.0,18.0,17.0,19.0,17.0,19.0,19.0,17.0,17.0,17.0,16.0,16.0,17.0,15.0,17.0,26.0,25.0,26.0,24.0,21.0,22.0,23.0,22.0,20.0,33.0,32.0,32.0,29.0,32.0,34.0,36.0,36.0,29.0,26.0,27.0,30.0,31.0,26.0,26.0,28.0,26.0,29.0,28.0,27.0,24.0,24.0,24.0,22.0,19.0,20.0,17.0,12.0,19.0,18.0,14.0,15.0,18.0,18.0,15.0,17.0,16.0,18.0,17.0,19.0,19.0,17.0,29.0,27.0,31.0,32.0,27.0,26.0,26.0,25.0,25.0,17.0,17.0,20.0,18.0,26.0,26.0,27.0,28.0,25.0,25.0,24.0,27.0,25.0,26.0,23.0,26.0,26.0,26.0,26.0,25.0,27.0,25.0,27.0,20.0,20.0,19.0,17.0,20.0,17.0,29.0,27.0,31.0,31.0,26.0,26.0,28.0,27.0,29.0,31.0,31.0,26.0,26.0,27.0,30.0,33.0,35.0,37.0,35.0,15.0,18.0,20.0,20.0,22.0,17.0,19.0,18.0,20.0,29.0,26.0,29.0,29.0,24.0,44.0,29.0,26.0,29.0,29.0,29.0,29.0,23.0,24.0,44.0,41.0,29.0,26.0,28.0,29.0,29.0,29.0,28.0,29.0,26.0,26.0,26.0]\n",
       "},\n",
       "\"kind\":\"plot\",\n",
       "\"scales\":[{\n",
       "\"aesthetic\":\"x\",\n",
       "\"name\":\"Engine displacement\\n(litres)\"\n",
       "},{\n",
       "\"aesthetic\":\"y\",\n",
       "\"name\":\"Highway\\nmiles per gallon\"\n",
       "}],\n",
       "\"layers\":[{\n",
       "\"mapping\":{\n",
       "},\n",
       "\"stat\":\"identity\",\n",
       "\"position\":\"identity\",\n",
       "\"geom\":\"point\",\n",
       "\"data\":{\n",
       "}\n",
       "}],\n",
       "\"caption\":{\n",
       "\"text\":\"MPG Dataset\"\n",
       "},\n",
       "\"theme\":{\n",
       "\"name\":\"classic\",\n",
       "\"plot_background\":{\n",
       "\"size\":1.0,\n",
       "\"blank\":false\n",
       "},\n",
       "\"axis_text_y\":{\n",
       "\"margin\":{\n",
       "\"r\":10.0,\n",
       "\"l\":15.0\n",
       "},\n",
       "\"blank\":false\n",
       "},\n",
       "\"axis_text_x\":{\n",
       "\"margin\":{\n",
       "\"t\":10.0,\n",
       "\"b\":15.0\n",
       "},\n",
       "\"blank\":false\n",
       "}\n",
       "}\n",
       "};\n",
       "           var plotContainer = document.getElementById(\"kF66Zl\");\n",
       "           window.letsPlotCall(function() {{\n",
       "               LetsPlot.buildPlotFromProcessedSpecs(plotSpec, -1, -1, plotContainer);\n",
       "           }});\n",
       "       })();    \n",
       "   </script>"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "// Change margins around axis tick labels\n",
    "\n",
    "p + theme(axisTextX = elementText(margin = margin(t=10, b=15)), \n",
    "          axisTextY = elementText(margin = margin(r=10, l=15)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "cutting-justice",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "   <div id=\"JNzVq8\"></div>\n",
       "   <script type=\"text/javascript\" data-lets-plot-script=\"plot\">\n",
       "       (function() {\n",
       "           var plotSpec={\n",
       "\"mapping\":{\n",
       "\"x\":\"class\",\n",
       "\"y\":\"hwy\"\n",
       "},\n",
       "\"data\":{\n",
       "},\n",
       "\"kind\":\"plot\",\n",
       "\"scales\":[],\n",
       "\"layers\":[{\n",
       "\"mapping\":{\n",
       "},\n",
       "\"stat\":\"boxplot\",\n",
       "\"position\":\"dodge\",\n",
       "\"geom\":\"boxplot\",\n",
       "\"data\":{\n",
       "\"..middle..\":[NaN,NaN,NaN,NaN,27.0,27.0,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,17.5,NaN,23.0,NaN,NaN,NaN,NaN,17.0,25.0,NaN,NaN,26.0],\n",
       "\"..upper..\":[NaN,NaN,NaN,NaN,29.0,29.0,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,19.0,NaN,24.0,NaN,NaN,NaN,NaN,18.0,26.0,NaN,NaN,30.5],\n",
       "\"..ymax..\":[NaN,NaN,NaN,NaN,33.0,32.0,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,22.0,NaN,24.0,NaN,NaN,NaN,NaN,20.0,26.0,NaN,NaN,36.0],\n",
       "\"..lower..\":[NaN,NaN,NaN,NaN,26.0,26.0,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,17.0,NaN,22.0,NaN,NaN,NaN,NaN,16.0,24.0,NaN,NaN,24.5],\n",
       "\"..ymin..\":[NaN,NaN,NaN,NaN,23.0,23.0,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,14.0,NaN,21.0,NaN,NaN,NaN,NaN,15.0,23.0,NaN,NaN,20.0],\n",
       "\"hwy\":[35.0,37.0,35.0,44.0,NaN,NaN,12.0,12.0,25.0,24.0,27.0,25.0,26.0,23.0,NaN,17.0,NaN,12.0,12.0,12.0,22.0,NaN,NaN,44.0,41.0,NaN],\n",
       "\"class\":[\"compact\",\"compact\",\"compact\",\"compact\",\"compact\",\"midsize\",\"suv\",\"suv\",\"suv\",\"suv\",\"suv\",\"suv\",\"suv\",\"suv\",\"suv\",\"minivan\",\"minivan\",\"pickup\",\"pickup\",\"pickup\",\"pickup\",\"pickup\",\"2seater\",\"subcompact\",\"subcompact\",\"subcompact\"]\n",
       "}\n",
       "}]\n",
       "};\n",
       "           var plotContainer = document.getElementById(\"JNzVq8\");\n",
       "           window.letsPlotCall(function() {{\n",
       "               LetsPlot.buildPlotFromProcessedSpecs(plotSpec, -1, -1, plotContainer);\n",
       "           }});\n",
       "       })();    \n",
       "   </script>"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "// axis labels at different levels\n",
    "\n",
    "val p2  = letsPlot(df.toMap()) { x = \"class\"; y = \"hwy\" } + geomBoxplot()\n",
    "p2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "lightweight-detroit",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "   <div id=\"47D81n\"></div>\n",
       "   <script type=\"text/javascript\" data-lets-plot-script=\"plot\">\n",
       "       (function() {\n",
       "           var plotSpec={\n",
       "\"mapping\":{\n",
       "\"x\":\"class\",\n",
       "\"y\":\"hwy\"\n",
       "},\n",
       "\"data\":{\n",
       "},\n",
       "\"kind\":\"plot\",\n",
       "\"scales\":[],\n",
       "\"layers\":[{\n",
       "\"mapping\":{\n",
       "},\n",
       "\"stat\":\"boxplot\",\n",
       "\"position\":\"dodge\",\n",
       "\"geom\":\"boxplot\",\n",
       "\"data\":{\n",
       "\"..middle..\":[NaN,NaN,NaN,NaN,27.0,27.0,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,17.5,NaN,23.0,NaN,NaN,NaN,NaN,17.0,25.0,NaN,NaN,26.0],\n",
       "\"..upper..\":[NaN,NaN,NaN,NaN,29.0,29.0,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,19.0,NaN,24.0,NaN,NaN,NaN,NaN,18.0,26.0,NaN,NaN,30.5],\n",
       "\"..ymax..\":[NaN,NaN,NaN,NaN,33.0,32.0,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,22.0,NaN,24.0,NaN,NaN,NaN,NaN,20.0,26.0,NaN,NaN,36.0],\n",
       "\"..lower..\":[NaN,NaN,NaN,NaN,26.0,26.0,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,17.0,NaN,22.0,NaN,NaN,NaN,NaN,16.0,24.0,NaN,NaN,24.5],\n",
       "\"..ymin..\":[NaN,NaN,NaN,NaN,23.0,23.0,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,14.0,NaN,21.0,NaN,NaN,NaN,NaN,15.0,23.0,NaN,NaN,20.0],\n",
       "\"hwy\":[35.0,37.0,35.0,44.0,NaN,NaN,12.0,12.0,25.0,24.0,27.0,25.0,26.0,23.0,NaN,17.0,NaN,12.0,12.0,12.0,22.0,NaN,NaN,44.0,41.0,NaN],\n",
       "\"class\":[\"compact\",\"compact\",\"compact\",\"compact\",\"compact\",\"midsize\",\"suv\",\"suv\",\"suv\",\"suv\",\"suv\",\"suv\",\"suv\",\"suv\",\"suv\",\"minivan\",\"minivan\",\"pickup\",\"pickup\",\"pickup\",\"pickup\",\"pickup\",\"2seater\",\"subcompact\",\"subcompact\",\"subcompact\"]\n",
       "}\n",
       "}],\n",
       "\"theme\":{\n",
       "\"axis_text_x\":{\n",
       "\"margin\":{\n",
       "\"t\":10.0,\n",
       "\"b\":10.0\n",
       "},\n",
       "\"blank\":false\n",
       "}\n",
       "}\n",
       "};\n",
       "           var plotContainer = document.getElementById(\"47D81n\");\n",
       "           window.letsPlotCall(function() {{\n",
       "               LetsPlot.buildPlotFromProcessedSpecs(plotSpec, -1, -1, plotContainer);\n",
       "           }});\n",
       "       })();    \n",
       "   </script>"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "p2 + theme(axisTextX = elementText(margin = margin(t=10, b=10)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "alleged-effects",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "   <div id=\"hWHITv\"></div>\n",
       "   <script type=\"text/javascript\" data-lets-plot-script=\"plot\">\n",
       "       (function() {\n",
       "           var plotSpec={\n",
       "\"mapping\":{\n",
       "\"x\":\"class\",\n",
       "\"y\":\"hwy\"\n",
       "},\n",
       "\"data\":{\n",
       "},\n",
       "\"ggsize\":{\n",
       "\"width\":550.0,\n",
       "\"height\":400.0\n",
       "},\n",
       "\"kind\":\"plot\",\n",
       "\"scales\":[],\n",
       "\"layers\":[{\n",
       "\"mapping\":{\n",
       "},\n",
       "\"stat\":\"boxplot\",\n",
       "\"position\":\"dodge\",\n",
       "\"geom\":\"boxplot\",\n",
       "\"data\":{\n",
       "\"..middle..\":[NaN,NaN,NaN,NaN,27.0,27.0,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,17.5,NaN,23.0,NaN,NaN,NaN,NaN,17.0,25.0,NaN,NaN,26.0],\n",
       "\"..upper..\":[NaN,NaN,NaN,NaN,29.0,29.0,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,19.0,NaN,24.0,NaN,NaN,NaN,NaN,18.0,26.0,NaN,NaN,30.5],\n",
       "\"..ymax..\":[NaN,NaN,NaN,NaN,33.0,32.0,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,22.0,NaN,24.0,NaN,NaN,NaN,NaN,20.0,26.0,NaN,NaN,36.0],\n",
       "\"..lower..\":[NaN,NaN,NaN,NaN,26.0,26.0,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,17.0,NaN,22.0,NaN,NaN,NaN,NaN,16.0,24.0,NaN,NaN,24.5],\n",
       "\"..ymin..\":[NaN,NaN,NaN,NaN,23.0,23.0,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,14.0,NaN,21.0,NaN,NaN,NaN,NaN,15.0,23.0,NaN,NaN,20.0],\n",
       "\"hwy\":[35.0,37.0,35.0,44.0,NaN,NaN,12.0,12.0,25.0,24.0,27.0,25.0,26.0,23.0,NaN,17.0,NaN,12.0,12.0,12.0,22.0,NaN,NaN,44.0,41.0,NaN],\n",
       "\"class\":[\"compact\",\"compact\",\"compact\",\"compact\",\"compact\",\"midsize\",\"suv\",\"suv\",\"suv\",\"suv\",\"suv\",\"suv\",\"suv\",\"suv\",\"suv\",\"minivan\",\"minivan\",\"pickup\",\"pickup\",\"pickup\",\"pickup\",\"pickup\",\"2seater\",\"subcompact\",\"subcompact\",\"subcompact\"]\n",
       "}\n",
       "}]\n",
       "};\n",
       "           var plotContainer = document.getElementById(\"hWHITv\");\n",
       "           window.letsPlotCall(function() {{\n",
       "               LetsPlot.buildPlotFromProcessedSpecs(plotSpec, -1, -1, plotContainer);\n",
       "           }});\n",
       "       })();    \n",
       "   </script>"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "// with rotation\n",
    "\n",
    "val p3 = p2 + ggsize(550, 400)\n",
    "p3"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "scheduled-identity",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "   <div id=\"PV3Otu\"></div>\n",
       "   <script type=\"text/javascript\" data-lets-plot-script=\"plot\">\n",
       "       (function() {\n",
       "           var plotSpec={\n",
       "\"mapping\":{\n",
       "\"x\":\"class\",\n",
       "\"y\":\"hwy\"\n",
       "},\n",
       "\"data\":{\n",
       "},\n",
       "\"ggsize\":{\n",
       "\"width\":550.0,\n",
       "\"height\":400.0\n",
       "},\n",
       "\"kind\":\"plot\",\n",
       "\"scales\":[],\n",
       "\"layers\":[{\n",
       "\"mapping\":{\n",
       "},\n",
       "\"stat\":\"boxplot\",\n",
       "\"position\":\"dodge\",\n",
       "\"geom\":\"boxplot\",\n",
       "\"data\":{\n",
       "\"..middle..\":[NaN,NaN,NaN,NaN,27.0,27.0,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,17.5,NaN,23.0,NaN,NaN,NaN,NaN,17.0,25.0,NaN,NaN,26.0],\n",
       "\"..upper..\":[NaN,NaN,NaN,NaN,29.0,29.0,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,19.0,NaN,24.0,NaN,NaN,NaN,NaN,18.0,26.0,NaN,NaN,30.5],\n",
       "\"..ymax..\":[NaN,NaN,NaN,NaN,33.0,32.0,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,22.0,NaN,24.0,NaN,NaN,NaN,NaN,20.0,26.0,NaN,NaN,36.0],\n",
       "\"..lower..\":[NaN,NaN,NaN,NaN,26.0,26.0,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,17.0,NaN,22.0,NaN,NaN,NaN,NaN,16.0,24.0,NaN,NaN,24.5],\n",
       "\"..ymin..\":[NaN,NaN,NaN,NaN,23.0,23.0,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,14.0,NaN,21.0,NaN,NaN,NaN,NaN,15.0,23.0,NaN,NaN,20.0],\n",
       "\"hwy\":[35.0,37.0,35.0,44.0,NaN,NaN,12.0,12.0,25.0,24.0,27.0,25.0,26.0,23.0,NaN,17.0,NaN,12.0,12.0,12.0,22.0,NaN,NaN,44.0,41.0,NaN],\n",
       "\"class\":[\"compact\",\"compact\",\"compact\",\"compact\",\"compact\",\"midsize\",\"suv\",\"suv\",\"suv\",\"suv\",\"suv\",\"suv\",\"suv\",\"suv\",\"suv\",\"minivan\",\"minivan\",\"pickup\",\"pickup\",\"pickup\",\"pickup\",\"pickup\",\"2seater\",\"subcompact\",\"subcompact\",\"subcompact\"]\n",
       "}\n",
       "}],\n",
       "\"theme\":{\n",
       "\"axis_text_x\":{\n",
       "\"margin\":{\n",
       "\"t\":10.0\n",
       "},\n",
       "\"blank\":false\n",
       "}\n",
       "}\n",
       "};\n",
       "           var plotContainer = document.getElementById(\"PV3Otu\");\n",
       "           window.letsPlotCall(function() {{\n",
       "               LetsPlot.buildPlotFromProcessedSpecs(plotSpec, -1, -1, plotContainer);\n",
       "           }});\n",
       "       })();    \n",
       "   </script>"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "p3 + theme(axisTextX = elementText(margin = margin(t=10)))"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Kotlin",
   "language": "kotlin",
   "name": "kotlin"
  },
  "language_info": {
   "codemirror_mode": "text/x-kotlin",
   "file_extension": ".kt",
   "mimetype": "text/x-kotlin",
   "name": "kotlin",
   "nbconvert_exporter": "",
   "pygments_lexer": "kotlin",
   "version": "1.7.20-dev-1299"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}