{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "reserved-institution",
   "metadata": {},
   "source": [
    "### Dotplot Geometry"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "engaging-filter",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "   <div id=\"mhyL9x\"></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@v3.2.0/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(\"mhyL9x\").appendChild(div);\n",
       "           };\n",
       "           var e = document.getElementById(\"mhyL9x\");\n",
       "           e.appendChild(script);\n",
       "       })();\n",
       "   </script>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "            <div id=\"kotlin_out_0\"></div>\n",
       "            <script type=\"text/javascript\">\n",
       "                            if(!window.kotlinQueues) {\n",
       "                window.kotlinQueues = {};\n",
       "            }\n",
       "            if(!window.kotlinQueues[\"DataFrame\"]) {\n",
       "                var resQueue = [];\n",
       "                window.kotlinQueues[\"DataFrame\"] = resQueue;\n",
       "                window[\"call_DataFrame\"] = function(f) {\n",
       "                    resQueue.push(f);\n",
       "                }\n",
       "            }\n",
       "            (function (){\n",
       "                var modifiers = [(function(script) {\n",
       "    script.src = \"https://cdn.jsdelivr.net/gh/Kotlin/dataframe@3db46ccccaa1291c0627307d64133317f545e6ae/core/src/main/resources/init.js\"\n",
       "    script.type = \"text/javascript\";\n",
       "})];\n",
       "                var e = document.getElementById(\"kotlin_out_0\");\n",
       "                modifiers.forEach(function (gen) {\n",
       "                    var script = document.createElement(\"script\");\n",
       "                    gen(script)\n",
       "                    script.addEventListener(\"load\", function() {\n",
       "                        window[\"call_DataFrame\"] = function(f) {f();};\n",
       "                        window.kotlinQueues[\"DataFrame\"].forEach(function(f) {f();});\n",
       "                        window.kotlinQueues[\"DataFrame\"] = [];\n",
       "                    }, false);\n",
       "                    script.addEventListener(\"error\", function() {\n",
       "                        window[\"call_DataFrame\"] = function(f) {};\n",
       "                        window.kotlinQueues[\"DataFrame\"] = [];\n",
       "                        var div = document.createElement(\"div\");\n",
       "                        div.style.color = 'darkred';\n",
       "                        div.textContent = 'Error loading resource DataFrame';\n",
       "                        document.getElementById(\"kotlin_out_0\").appendChild(div);\n",
       "                    }, false);\n",
       "                    \n",
       "                    e.appendChild(script);\n",
       "                });\n",
       "            })();\n",
       "            </script>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "                <style>\n",
       "                :root {\n",
       "    --background: #fff;\n",
       "    --background-odd: #f5f5f5;\n",
       "    --background-hover: #d9edfd;\n",
       "    --header-text-color: #474747;\n",
       "    --text-color: #848484;\n",
       "    --text-color-dark: #000;\n",
       "    --text-color-medium: #737373;\n",
       "    --text-color-pale: #b3b3b3;\n",
       "    --inner-border-color: #aaa;\n",
       "    --bold-border-color: #000;\n",
       "    --link-color: #296eaa;\n",
       "    --link-color-pale: #296eaa;\n",
       "    --link-hover: #1a466c;\n",
       "}\n",
       "\n",
       ":root[theme=\"dark\"], :root [data-jp-theme-light=\"false\"], .dataframe_dark{\n",
       "    --background: #303030;\n",
       "    --background-odd: #3c3c3c;\n",
       "    --background-hover: #464646;\n",
       "    --header-text-color: #dddddd;\n",
       "    --text-color: #b3b3b3;\n",
       "    --text-color-dark: #dddddd;\n",
       "    --text-color-medium: #b2b2b2;\n",
       "    --text-color-pale: #737373;\n",
       "    --inner-border-color: #707070;\n",
       "    --bold-border-color: #777777;\n",
       "    --link-color: #008dc0;\n",
       "    --link-color-pale: #97e1fb;\n",
       "    --link-hover: #00688e;\n",
       "}\n",
       "\n",
       "p.dataframe_description {\n",
       "    color: var(--text-color-dark);\n",
       "}\n",
       "\n",
       "table.dataframe {\n",
       "    font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n",
       "    font-size: 12px;\n",
       "    background-color: var(--background);\n",
       "    color: var(--text-color-dark);\n",
       "    border: none;\n",
       "    border-collapse: collapse;\n",
       "}\n",
       "\n",
       "table.dataframe th, td {\n",
       "    padding: 6px;\n",
       "    border: 1px solid transparent;\n",
       "    text-align: left;\n",
       "}\n",
       "\n",
       "table.dataframe th {\n",
       "    background-color: var(--background);\n",
       "    color: var(--header-text-color);\n",
       "}\n",
       "\n",
       "table.dataframe td {\n",
       "    vertical-align: top;\n",
       "}\n",
       "\n",
       "table.dataframe th.bottomBorder {\n",
       "    border-bottom-color: var(--bold-border-color);\n",
       "}\n",
       "\n",
       "table.dataframe tbody > tr:nth-child(odd) {\n",
       "    background: var(--background-odd);\n",
       "}\n",
       "\n",
       "table.dataframe tbody > tr:nth-child(even) {\n",
       "    background: var(--background);\n",
       "}\n",
       "\n",
       "table.dataframe tbody > tr:hover {\n",
       "    background: var(--background-hover);\n",
       "}\n",
       "\n",
       "table.dataframe a {\n",
       "    cursor: pointer;\n",
       "    color: var(--link-color);\n",
       "    text-decoration: none;\n",
       "}\n",
       "\n",
       "table.dataframe tr:hover > td a {\n",
       "    color: var(--link-color-pale);\n",
       "}\n",
       "\n",
       "table.dataframe a:hover {\n",
       "    color: var(--link-hover);\n",
       "    text-decoration: underline;\n",
       "}\n",
       "\n",
       "table.dataframe img {\n",
       "    max-width: fit-content;\n",
       "}\n",
       "\n",
       "table.dataframe th.complex {\n",
       "    background-color: var(--background);\n",
       "    border: 1px solid var(--background);\n",
       "}\n",
       "\n",
       "table.dataframe .leftBorder {\n",
       "    border-left-color: var(--inner-border-color);\n",
       "}\n",
       "\n",
       "table.dataframe .rightBorder {\n",
       "    border-right-color: var(--inner-border-color);\n",
       "}\n",
       "\n",
       "table.dataframe .rightAlign {\n",
       "    text-align: right;\n",
       "}\n",
       "\n",
       "table.dataframe .expanderSvg {\n",
       "    width: 8px;\n",
       "    height: 8px;\n",
       "    margin-right: 3px;\n",
       "}\n",
       "\n",
       "table.dataframe .expander {\n",
       "    display: flex;\n",
       "    align-items: center;\n",
       "}\n",
       "\n",
       "/* formatting */\n",
       "\n",
       "table.dataframe .null {\n",
       "    color: var(--text-color-pale);\n",
       "}\n",
       "\n",
       "table.dataframe .structural {\n",
       "    color: var(--text-color-medium);\n",
       "    font-weight: bold;\n",
       "}\n",
       "\n",
       "table.dataframe .dataFrameCaption {\n",
       "    font-weight: bold;\n",
       "}\n",
       "\n",
       "table.dataframe .numbers {\n",
       "    color: var(--text-color-dark);\n",
       "}\n",
       "\n",
       "table.dataframe td:hover .formatted .structural, .null {\n",
       "    color: var(--text-color-dark);\n",
       "}\n",
       "\n",
       "table.dataframe tr:hover .formatted .structural, .null {\n",
       "    color: var(--text-color-dark);\n",
       "}\n",
       "\n",
       "\n",
       "                </style>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%useLatestDescriptors\n",
    "%use lets-plot\n",
    "%use dataframe"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "trying-liberty",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Lets-Plot Kotlin API v.4.4.1. Frontend: Notebook with dynamically loaded JS. Lets-Plot JS v.3.2.0."
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "LetsPlot.getInfo()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "serial-matthew",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/kotlindataframe+json": "{\"nrow\":5,\"ncol\":12,\"columns\":[\"untitled\",\"manufacturer\",\"model\",\"displ\",\"year\",\"cyl\",\"trans\",\"drv\",\"cty\",\"hwy\",\"fl\",\"class\"],\"kotlin_dataframe\":[{\"untitled\":1,\"manufacturer\":\"audi\",\"model\":\"a4\",\"displ\":1.8,\"year\":1999,\"cyl\":4,\"trans\":\"auto(l5)\",\"drv\":\"f\",\"cty\":18,\"hwy\":29,\"fl\":\"p\",\"class\":\"compact\"},{\"untitled\":2,\"manufacturer\":\"audi\",\"model\":\"a4\",\"displ\":1.8,\"year\":1999,\"cyl\":4,\"trans\":\"manual(m5)\",\"drv\":\"f\",\"cty\":21,\"hwy\":29,\"fl\":\"p\",\"class\":\"compact\"},{\"untitled\":3,\"manufacturer\":\"audi\",\"model\":\"a4\",\"displ\":2.0,\"year\":2008,\"cyl\":4,\"trans\":\"manual(m6)\",\"drv\":\"f\",\"cty\":20,\"hwy\":31,\"fl\":\"p\",\"class\":\"compact\"},{\"untitled\":4,\"manufacturer\":\"audi\",\"model\":\"a4\",\"displ\":2.0,\"year\":2008,\"cyl\":4,\"trans\":\"auto(av)\",\"drv\":\"f\",\"cty\":21,\"hwy\":30,\"fl\":\"p\",\"class\":\"compact\"},{\"untitled\":5,\"manufacturer\":\"audi\",\"model\":\"a4\",\"displ\":2.8,\"year\":1999,\"cyl\":6,\"trans\":\"auto(l5)\",\"drv\":\"f\",\"cty\":16,\"hwy\":26,\"fl\":\"p\",\"class\":\"compact\"}]}",
      "text/html": [
       "        <html>\n",
       "        <head>\n",
       "            <style type=\"text/css\">\n",
       "                :root {\n",
       "    --background: #fff;\n",
       "    --background-odd: #f5f5f5;\n",
       "    --background-hover: #d9edfd;\n",
       "    --header-text-color: #474747;\n",
       "    --text-color: #848484;\n",
       "    --text-color-dark: #000;\n",
       "    --text-color-medium: #737373;\n",
       "    --text-color-pale: #b3b3b3;\n",
       "    --inner-border-color: #aaa;\n",
       "    --bold-border-color: #000;\n",
       "    --link-color: #296eaa;\n",
       "    --link-color-pale: #296eaa;\n",
       "    --link-hover: #1a466c;\n",
       "}\n",
       "\n",
       ":root[theme=\"dark\"], :root [data-jp-theme-light=\"false\"], .dataframe_dark{\n",
       "    --background: #303030;\n",
       "    --background-odd: #3c3c3c;\n",
       "    --background-hover: #464646;\n",
       "    --header-text-color: #dddddd;\n",
       "    --text-color: #b3b3b3;\n",
       "    --text-color-dark: #dddddd;\n",
       "    --text-color-medium: #b2b2b2;\n",
       "    --text-color-pale: #737373;\n",
       "    --inner-border-color: #707070;\n",
       "    --bold-border-color: #777777;\n",
       "    --link-color: #008dc0;\n",
       "    --link-color-pale: #97e1fb;\n",
       "    --link-hover: #00688e;\n",
       "}\n",
       "\n",
       "p.dataframe_description {\n",
       "    color: var(--text-color-dark);\n",
       "}\n",
       "\n",
       "table.dataframe {\n",
       "    font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n",
       "    font-size: 12px;\n",
       "    background-color: var(--background);\n",
       "    color: var(--text-color-dark);\n",
       "    border: none;\n",
       "    border-collapse: collapse;\n",
       "}\n",
       "\n",
       "table.dataframe th, td {\n",
       "    padding: 6px;\n",
       "    border: 1px solid transparent;\n",
       "    text-align: left;\n",
       "}\n",
       "\n",
       "table.dataframe th {\n",
       "    background-color: var(--background);\n",
       "    color: var(--header-text-color);\n",
       "}\n",
       "\n",
       "table.dataframe td {\n",
       "    vertical-align: top;\n",
       "}\n",
       "\n",
       "table.dataframe th.bottomBorder {\n",
       "    border-bottom-color: var(--bold-border-color);\n",
       "}\n",
       "\n",
       "table.dataframe tbody > tr:nth-child(odd) {\n",
       "    background: var(--background-odd);\n",
       "}\n",
       "\n",
       "table.dataframe tbody > tr:nth-child(even) {\n",
       "    background: var(--background);\n",
       "}\n",
       "\n",
       "table.dataframe tbody > tr:hover {\n",
       "    background: var(--background-hover);\n",
       "}\n",
       "\n",
       "table.dataframe a {\n",
       "    cursor: pointer;\n",
       "    color: var(--link-color);\n",
       "    text-decoration: none;\n",
       "}\n",
       "\n",
       "table.dataframe tr:hover > td a {\n",
       "    color: var(--link-color-pale);\n",
       "}\n",
       "\n",
       "table.dataframe a:hover {\n",
       "    color: var(--link-hover);\n",
       "    text-decoration: underline;\n",
       "}\n",
       "\n",
       "table.dataframe img {\n",
       "    max-width: fit-content;\n",
       "}\n",
       "\n",
       "table.dataframe th.complex {\n",
       "    background-color: var(--background);\n",
       "    border: 1px solid var(--background);\n",
       "}\n",
       "\n",
       "table.dataframe .leftBorder {\n",
       "    border-left-color: var(--inner-border-color);\n",
       "}\n",
       "\n",
       "table.dataframe .rightBorder {\n",
       "    border-right-color: var(--inner-border-color);\n",
       "}\n",
       "\n",
       "table.dataframe .rightAlign {\n",
       "    text-align: right;\n",
       "}\n",
       "\n",
       "table.dataframe .expanderSvg {\n",
       "    width: 8px;\n",
       "    height: 8px;\n",
       "    margin-right: 3px;\n",
       "}\n",
       "\n",
       "table.dataframe .expander {\n",
       "    display: flex;\n",
       "    align-items: center;\n",
       "}\n",
       "\n",
       "/* formatting */\n",
       "\n",
       "table.dataframe .null {\n",
       "    color: var(--text-color-pale);\n",
       "}\n",
       "\n",
       "table.dataframe .structural {\n",
       "    color: var(--text-color-medium);\n",
       "    font-weight: bold;\n",
       "}\n",
       "\n",
       "table.dataframe .dataFrameCaption {\n",
       "    font-weight: bold;\n",
       "}\n",
       "\n",
       "table.dataframe .numbers {\n",
       "    color: var(--text-color-dark);\n",
       "}\n",
       "\n",
       "table.dataframe td:hover .formatted .structural, .null {\n",
       "    color: var(--text-color-dark);\n",
       "}\n",
       "\n",
       "table.dataframe tr:hover .formatted .structural, .null {\n",
       "    color: var(--text-color-dark);\n",
       "}\n",
       "\n",
       "\n",
       "\n",
       "\n",
       "            </style>\n",
       "        </head>\n",
       "        <body>\n",
       "            \n",
       "<table class=\"dataframe\" id=\"df_-16777216\"></table>\n",
       "\n",
       "<p class=\"dataframe_description\">DataFrame: rowsCount = 5, columnsCount = 12</p>\n",
       "        </body>\n",
       "        <script>\n",
       "            \n",
       "/*<!--*/\n",
       "call_DataFrame(function() { DataFrame.addTable({ cols: [{ name: \"<span title=\\\"untitled: Int\\\">untitled</span>\", children: [], rightAlign: true, values: [\"<span class=\\\"formatted\\\" title=\\\"\\\"><span class=\\\"numbers\\\">1</span></span>\",\"<span class=\\\"formatted\\\" title=\\\"\\\"><span class=\\\"numbers\\\">2</span></span>\",\"<span class=\\\"formatted\\\" title=\\\"\\\"><span class=\\\"numbers\\\">3</span></span>\",\"<span class=\\\"formatted\\\" title=\\\"\\\"><span class=\\\"numbers\\\">4</span></span>\",\"<span class=\\\"formatted\\\" title=\\\"\\\"><span class=\\\"numbers\\\">5</span></span>\"] }, \n",
       "{ name: \"<span title=\\\"manufacturer: String\\\">manufacturer</span>\", children: [], rightAlign: false, values: [\"audi\",\"audi\",\"audi\",\"audi\",\"audi\"] }, \n",
       "{ name: \"<span title=\\\"model: String\\\">model</span>\", children: [], rightAlign: false, values: [\"a4\",\"a4\",\"a4\",\"a4\",\"a4\"] }, \n",
       "{ name: \"<span title=\\\"displ: Double\\\">displ</span>\", children: [], rightAlign: true, values: [\"<span class=\\\"formatted\\\" title=\\\"\\\"><span class=\\\"numbers\\\">1,8</span></span>\",\"<span class=\\\"formatted\\\" title=\\\"\\\"><span class=\\\"numbers\\\">1,8</span></span>\",\"<span class=\\\"formatted\\\" title=\\\"\\\"><span class=\\\"numbers\\\">2,0</span></span>\",\"<span class=\\\"formatted\\\" title=\\\"\\\"><span class=\\\"numbers\\\">2,0</span></span>\",\"<span class=\\\"formatted\\\" title=\\\"\\\"><span class=\\\"numbers\\\">2,8</span></span>\"] }, \n",
       "{ name: \"<span title=\\\"year: Int\\\">year</span>\", children: [], rightAlign: true, values: [\"<span class=\\\"formatted\\\" title=\\\"\\\"><span class=\\\"numbers\\\">1999</span></span>\",\"<span class=\\\"formatted\\\" title=\\\"\\\"><span class=\\\"numbers\\\">1999</span></span>\",\"<span class=\\\"formatted\\\" title=\\\"\\\"><span class=\\\"numbers\\\">2008</span></span>\",\"<span class=\\\"formatted\\\" title=\\\"\\\"><span class=\\\"numbers\\\">2008</span></span>\",\"<span class=\\\"formatted\\\" title=\\\"\\\"><span class=\\\"numbers\\\">1999</span></span>\"] }, \n",
       "{ name: \"<span title=\\\"cyl: Int\\\">cyl</span>\", children: [], rightAlign: true, values: [\"<span class=\\\"formatted\\\" title=\\\"\\\"><span class=\\\"numbers\\\">4</span></span>\",\"<span class=\\\"formatted\\\" title=\\\"\\\"><span class=\\\"numbers\\\">4</span></span>\",\"<span class=\\\"formatted\\\" title=\\\"\\\"><span class=\\\"numbers\\\">4</span></span>\",\"<span class=\\\"formatted\\\" title=\\\"\\\"><span class=\\\"numbers\\\">4</span></span>\",\"<span class=\\\"formatted\\\" title=\\\"\\\"><span class=\\\"numbers\\\">6</span></span>\"] }, \n",
       "{ name: \"<span title=\\\"trans: String\\\">trans</span>\", children: [], rightAlign: false, values: [\"auto(l5)\",\"manual(m5)\",\"manual(m6)\",\"auto(av)\",\"auto(l5)\"] }, \n",
       "{ name: \"<span title=\\\"drv: String\\\">drv</span>\", children: [], rightAlign: false, values: [\"f\",\"f\",\"f\",\"f\",\"f\"] }, \n",
       "{ name: \"<span title=\\\"cty: Int\\\">cty</span>\", children: [], rightAlign: true, values: [\"<span class=\\\"formatted\\\" title=\\\"\\\"><span class=\\\"numbers\\\">18</span></span>\",\"<span class=\\\"formatted\\\" title=\\\"\\\"><span class=\\\"numbers\\\">21</span></span>\",\"<span class=\\\"formatted\\\" title=\\\"\\\"><span class=\\\"numbers\\\">20</span></span>\",\"<span class=\\\"formatted\\\" title=\\\"\\\"><span class=\\\"numbers\\\">21</span></span>\",\"<span class=\\\"formatted\\\" title=\\\"\\\"><span class=\\\"numbers\\\">16</span></span>\"] }, \n",
       "{ name: \"<span title=\\\"hwy: Int\\\">hwy</span>\", children: [], rightAlign: true, values: [\"<span class=\\\"formatted\\\" title=\\\"\\\"><span class=\\\"numbers\\\">29</span></span>\",\"<span class=\\\"formatted\\\" title=\\\"\\\"><span class=\\\"numbers\\\">29</span></span>\",\"<span class=\\\"formatted\\\" title=\\\"\\\"><span class=\\\"numbers\\\">31</span></span>\",\"<span class=\\\"formatted\\\" title=\\\"\\\"><span class=\\\"numbers\\\">30</span></span>\",\"<span class=\\\"formatted\\\" title=\\\"\\\"><span class=\\\"numbers\\\">26</span></span>\"] }, \n",
       "{ name: \"<span title=\\\"fl: String\\\">fl</span>\", children: [], rightAlign: false, values: [\"p\",\"p\",\"p\",\"p\",\"p\"] }, \n",
       "{ name: \"<span title=\\\"class: String\\\">class</span>\", children: [], rightAlign: false, values: [\"compact\",\"compact\",\"compact\",\"compact\",\"compact\"] }, \n",
       "], id: -16777216, rootId: -16777216, totalRows: 5 } ) });\n",
       "/*-->*/\n",
       "\n",
       "call_DataFrame(function() { DataFrame.renderTable(-16777216) });\n",
       "\n",
       "\n",
       "        </script>\n",
       "        </html>"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "var mpg = DataFrame.readCSV(\"https://raw.githubusercontent.com/JetBrains/lets-plot-kotlin/master/docs/examples/data/mpg.csv\")\n",
    "mpg.head()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "latter-manual",
   "metadata": {},
   "outputs": [],
   "source": [
    "val mpg32 = mpg.shuffle().take(32)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "juvenile-continuity",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "   <div id=\"90RfJh\"></div>\n",
       "   <script type=\"text/javascript\" data-lets-plot-script=\"plot\">\n",
       "       (function() {\n",
       "           var plotSpec={\n",
       "\"mapping\":{\n",
       "},\n",
       "\"data\":{\n",
       "},\n",
       "\"kind\":\"plot\",\n",
       "\"scales\":[],\n",
       "\"layers\":[{\n",
       "\"mapping\":{\n",
       "\"x\":\"hwy\"\n",
       "},\n",
       "\"stat\":\"dotplot\",\n",
       "\"position\":\"identity\",\n",
       "\"geom\":\"dotplot\",\n",
       "\"data\":{\n",
       "\"..binwidth..\":[0.6333333333333333,0.6333333333333333,0.6333333333333333,0.6333333333333333,0.6333333333333333,0.6333333333333333,0.6333333333333333,0.6333333333333333,0.6333333333333333,0.6333333333333333,0.6333333333333333,0.6333333333333333,0.6333333333333333,0.6333333333333333],\n",
       "\"..count..\":[1.0,1.0,1.0,4.0,2.0,3.0,1.0,1.0,3.0,3.0,5.0,3.0,3.0,1.0],\n",
       "\"hwy\":[12.0,14.0,16.0,17.0,18.0,19.0,20.0,21.0,24.0,25.0,26.0,27.0,29.0,31.0]\n",
       "}\n",
       "}]\n",
       "};\n",
       "           var plotContainer = document.getElementById(\"90RfJh\");\n",
       "           window.letsPlotCall(function() {{\n",
       "               LetsPlot.buildPlotFromProcessedSpecs(plotSpec, -1, -1, plotContainer);\n",
       "           }});\n",
       "       })();    \n",
       "   </script>"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "letsPlot(mpg32.toMap()) + geomDotplot {x = \"hwy\"}"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "solved-skirt",
   "metadata": {},
   "source": [
    "### `geomDotplot()` and `geomDensity()`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "informed-protection",
   "metadata": {},
   "outputs": [],
   "source": [
    "val PACIFIC_BLUE = \"#118ed8\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "signed-child",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "   <div id=\"X0pRIX\"></div>\n",
       "   <script type=\"text/javascript\" data-lets-plot-script=\"plot\">\n",
       "       (function() {\n",
       "           var plotSpec={\n",
       "\"mapping\":{\n",
       "\"x\":\"hwy\"\n",
       "},\n",
       "\"data\":{\n",
       "},\n",
       "\"kind\":\"plot\",\n",
       "\"scales\":[],\n",
       "\"layers\":[{\n",
       "\"mapping\":{\n",
       "},\n",
       "\"stat\":\"density\",\n",
       "\"position\":\"identity\",\n",
       "\"geom\":\"density\",\n",
       "\"fill\":\"#118ed8\",\n",
       "\"data\":{\n",
       "\"hwy\":[12.0,12.037181996086106,12.074363992172211,12.111545988258317,12.148727984344422,12.185909980430528,12.223091976516635,12.26027397260274,12.297455968688846,12.33463796477495,12.371819960861057,12.409001956947163,12.446183953033268,12.483365949119374,12.520547945205479,12.557729941291585,12.594911937377692,12.632093933463796,12.669275929549903,12.706457925636007,12.743639921722114,12.780821917808218,12.818003913894325,12.855185909980431,12.892367906066536,12.929549902152642,12.966731898238747,13.003913894324853,13.04109589041096,13.078277886497064,13.11545988258317,13.152641878669275,13.189823874755382,13.227005870841488,13.264187866927593,13.301369863013699,13.338551859099804,13.37573385518591,13.412915851272015,13.450097847358121,13.487279843444227,13.524461839530332,13.561643835616438,13.598825831702545,13.63600782778865,13.673189823874756,13.71037181996086,13.747553816046967,13.784735812133071,13.821917808219178,13.859099804305284,13.896281800391389,13.933463796477495,13.970645792563602,14.007827788649706,14.045009784735813,14.082191780821917,14.119373776908024,14.156555772994128,14.193737769080235,14.230919765166341,14.268101761252446,14.305283757338552,14.342465753424658,14.379647749510763,14.416829745596868,14.454011741682974,14.49119373776908,14.528375733855185,14.565557729941291,14.602739726027398,14.639921722113503,14.677103718199609,14.714285714285714,14.75146771037182,14.788649706457925,14.825831702544031,14.863013698630137,14.900195694716242,14.937377690802348,14.974559686888455,15.01174168297456,15.048923679060666,15.08610567514677,15.123287671232877,15.160469667318981,15.197651663405088,15.234833659491194,15.272015655577299,15.309197651663405,15.346379647749512,15.383561643835616,15.42074363992172,15.457925636007827,15.495107632093934,15.532289628180038,15.569471624266145,15.606653620352251,15.643835616438356,15.681017612524462,15.718199608610568,15.755381604696673,15.792563600782778,15.829745596868884,15.86692759295499,15.904109589041095,15.941291585127201,15.978473581213308,16.015655577299412,16.052837573385517,16.090019569471625,16.12720156555773,16.164383561643834,16.201565557729943,16.238747553816047,16.275929549902152,16.313111545988257,16.350293542074365,16.38747553816047,16.424657534246574,16.461839530332682,16.499021526418787,16.53620352250489,16.573385518590996,16.610567514677104,16.64774951076321,16.684931506849317,16.72211350293542,16.759295499021526,16.79647749510763,16.833659491193735,16.870841487279844,16.908023483365948,16.945205479452056,16.98238747553816,17.019569471624266,17.05675146771037,17.09393346379648,17.131115459882583,17.168297455968688,17.205479452054796,17.2426614481409,17.279843444227005,17.31702544031311,17.354207436399218,17.391389432485322,17.428571428571427,17.465753424657535,17.50293542074364,17.540117416829744,17.57729941291585,17.614481409001957,17.651663405088062,17.68884540117417,17.726027397260275,17.76320939334638,17.800391389432484,17.83757338551859,17.874755381604697,17.9119373776908,17.94911937377691,17.986301369863014,18.02348336594912,18.060665362035223,18.09784735812133,18.135029354207436,18.17221135029354,18.20939334637965,18.246575342465754,18.246575342465754,18.283757338551858,18.320939334637963,18.35812133072407,18.395303326810176,18.43248532289628,18.46966731898239,18.506849315068493,18.544031311154598,18.581213307240702,18.61839530332681,18.655577299412915,18.692759295499023,18.729941291585128,18.767123287671232,18.804305283757337,18.84148727984344,18.87866927592955,18.915851272015654,18.953033268101763,18.990215264187867,19.027397260273972,19.064579256360076,19.101761252446185,19.13894324853229,19.176125244618394,19.213307240704502,19.250489236790607,19.28767123287671,19.324853228962816,19.362035225048924,19.39921722113503,19.436399217221137,19.47358121330724,19.510763209393346,19.54794520547945,19.585127201565555,19.622309197651663,19.659491193737768,19.696673189823876,19.73385518590998,19.771037181996086,19.80821917808219,19.8454011741683,19.882583170254403,19.919765166340508,19.956947162426616,19.99412915851272,20.031311154598825,20.06849315068493,20.105675146771034,20.142857142857142,20.18003913894325,20.217221135029355,20.25440313111546,20.291585127201564,20.32876712328767,20.365949119373777,20.403131115459882,20.44031311154599,20.477495107632095,20.5146771037182,20.551859099804304,20.58904109589041,20.626223091976517,20.66340508806262,20.70058708414873,20.737769080234834,20.77495107632094,20.812133072407043,20.849315068493148,20.886497064579256,20.92367906066536,20.96086105675147,20.998043052837573,21.035225048923678,21.072407045009783,21.109589041095887,21.146771037181995,21.183953033268104,21.22113502935421,21.258317025440313,21.295499021526417,21.332681017612522,21.36986301369863,21.407045009784735,21.444227005870843,21.481409001956948,21.518590998043052,21.555772994129157,21.59295499021526,21.63013698630137,21.667318982387474,21.704500978473583,21.741682974559687,21.77886497064579,21.816046966731896,21.853228962818,21.89041095890411,21.927592954990217,21.964774951076322,22.001956947162427,22.03913894324853,22.076320939334636,22.113502935420744,22.15068493150685,22.187866927592957,22.22504892367906,22.262230919765166,22.29941291585127,22.336594911937375,22.373776908023483,22.410958904109588,22.448140900195696,22.4853228962818,22.522504892367905,22.55968688845401,22.596868884540115,22.634050880626223,22.671232876712327,22.708414872798436,22.74559686888454,22.782778864970645,22.81996086105675,22.857142857142854,22.894324853228962,22.93150684931507,22.968688845401175,23.00587084148728,23.043052837573384,23.043052837573384,23.08023483365949,23.117416829745597,23.1545988258317,23.19178082191781,23.228962818003914,23.26614481409002,23.303326810176124,23.34050880626223,23.377690802348337,23.41487279843444,23.45205479452055,23.489236790606654,23.52641878669276,23.563600782778863,23.600782778864968,23.637964774951076,23.67514677103718,23.71232876712329,23.749510763209393,23.786692759295498,23.823874755381603,23.861056751467707,23.898238747553815,23.935420743639924,23.972602739726028,24.009784735812133,24.046966731898237,24.084148727984342,24.12133072407045,24.158512720156555,24.195694716242663,24.232876712328768,24.270058708414872,24.307240704500977,24.34442270058708,24.38160469667319,24.418786692759294,24.455968688845402,24.493150684931507,24.53033268101761,24.567514677103716,24.60469667318982,24.64187866927593,24.679060665362034,24.716242661448142,24.753424657534246,24.79060665362035,24.827788649706456,24.86497064579256,24.90215264187867,24.939334637964777,24.97651663405088,25.013698630136986,25.05088062622309,25.088062622309195,25.125244618395303,25.162426614481408,25.199608610567516,25.23679060665362,25.273972602739725,25.31115459882583,25.348336594911935,25.385518590998043,25.422700587084147,25.459882583170256,25.49706457925636,25.534246575342465,25.57142857142857,25.608610567514674,25.645792563600782,25.682974559686887,25.720156555772995,25.7573385518591,25.794520547945204,25.83170254403131,25.868884540117413,25.90606653620352,25.94324853228963,25.980430528375734,26.01761252446184,26.054794520547944,26.09197651663405,26.129158512720156,26.16634050880626,26.20352250489237,26.240704500978474,26.27788649706458,26.315068493150683,26.352250489236788,26.389432485322896,26.389432485322896,26.426614481409,26.46379647749511,26.500978473581213,26.538160469667318,26.575342465753423,26.612524461839527,26.649706457925635,26.686888454011743,26.724070450097848,26.761252446183953,26.798434442270057,26.835616438356162,26.87279843444227,26.909980430528375,26.947162426614483,26.984344422700588,27.021526418786692,27.058708414872797,27.0958904109589,27.13307240704501,27.170254403131114,27.207436399217222,27.244618395303327,27.28180039138943,27.318982387475536,27.35616438356164,27.39334637964775,27.430528375733854,27.467710371819962,27.504892367906066,27.54207436399217,27.579256360078276,27.61643835616438,27.65362035225049,27.690802348336597,27.7279843444227,27.765166340508806,27.80234833659491,27.839530332681015,27.876712328767123,27.913894324853228,27.951076320939336,27.98825831702544,28.025440313111545,28.06262230919765,28.099804305283758,28.136986301369863,28.174168297455967,28.211350293542072,28.24853228962818,28.285714285714285,28.32289628180039,28.360078277886497,28.397260273972602,28.434442270058707,28.471624266144815,28.50880626223092,28.545988258317024,28.58317025440313,28.620352250489237,28.65753424657534,28.694716242661446,28.731898238747554,28.76908023483366,28.806262230919764,28.843444227005868,28.880626223091976,28.91780821917808,28.954990215264186,28.992172211350294,29.0293542074364,29.066536203522503,29.10371819960861,29.140900195694716,29.17808219178082,29.215264187866925,29.252446183953033,29.289628180039138,29.326810176125242,29.36399217221135,29.401174168297455,29.43835616438356,29.475538160469668,29.512720156555773,29.549902152641877,29.587084148727982,29.62426614481409,29.661448140900195,29.6986301369863,29.735812133072407,29.772994129158512,29.810176125244617,29.84735812133072,29.88454011741683,29.921722113502934,29.95890410958904,29.996086105675147,30.03326810176125,30.070450097847356,30.107632093933464,30.14481409001957,30.181996086105674,30.219178082191778,30.256360078277886,30.29354207436399,30.330724070450096,30.367906066536204,30.40508806262231,30.442270058708413,30.47945205479452,30.516634050880626,30.55381604696673,30.590998043052835,30.628180039138943,30.665362035225048,30.702544031311152,30.73972602739726,30.776908023483365,30.81409001956947,30.851272015655578,30.888454011741683,30.925636007827787,30.962818003913892,31.0],\n",
       "\"..density..\":[0.012658903677299426,0.012836685949069703,0.013016303213470835,0.013197793363607975,0.013381195199381694,0.01356654838770548,0.013753893419632277,0.013943271564390394,0.014134724820334088,0.014328295862821076,0.014524027989034962,0.014721965059777173,0.014922151438258754,0.01512463192592997,0.015329451695390581,0.01553665622043196,0.015746291203267065,0.015958402499012054,0.016173036037489666,0.016390237742430414,0.01661005344815522,0.016832528813828428,0.017057709235377954,0.017285639755184264,0.017516364969647053,0.017749928934744957,0.01798637506970821,0.01822574605893216,0.018468083752263678,0.018713429063798744,0.018961821869335475,0.01921330090263102,0.019467903650617024,0.01972566624773201,0.01998662336953514,0.020250808125768432,0.02051825195304049,0.020788984507306995,0.021063033556328017,0.021340424872285012,0.021621182124743156,0.0219053267741479,0.022192877966046104,0.02248385242622542,0.02277826435696583,0.023076125334599604,0.023377444208576164,0.023682227002229893,0.02399047681544744,0.024302193729433413,0.024617374713769832,0.024936013535966348,0.025258100673695383,0.025583623229904873,0.025912564850999843,0.026244905648280397,0.026580622122821754,0.02691968709397813,0.027262069631688667,0.027607734992759425,0.027956644561291225,0.028308755793417795,0.028664022166514244,0.029022393133028693,0.02938381407908625,0.029748226288005945,0.030115566908865996,0.030485768930244822,0.030858761159259167,0.031234468206011834,0.031612810473553965,0.031993704153459035,0.03237706122709718,0.032762789472689194,0.03315079247821107,0.0335409696602112,0.03393321628859234,0.034327423517400465,0.034723478421655476,0.035121264040245195,0.0355206594248972,0.035921539695231534,0.03632377609988833,0.03672723608371189,0.037131783360966224,0.0375372779945435,0.037943576481118124,0.038350531842189145,0.03875799372094373,0.039165808484862764,0.03957381933398207,0.039981866414710826,0.04038978693910102,0.04079741530945001,0.04120458324811101,0.04161111993237572,0.04201685213428555,0.04242160436521748,0.04282519902508486,0.04322745655598164,0.04362819560009483,0.0440272331616985,0.04442438477303833,0.0448194646639072,0.045212285934706054,0.04560266073277886,0.04599040043180392,0.04637531581401792,0.04675721725504564,0.04713591491110289,0.04751121890833454,0.047882939534049415,0.04825088742960598,0.04861487378470411,0.0489747105328327,0.04933021054762241,0.04968118783985148,0.05002745775484976,0.05036883717004798,0.050705144692417006,0.05103620085554264,0.05136182831608313,0.05168185204935617,0.051996099543804894,0.05230440099409376,0.05260658949258745,0.05290250121896979,0.05319197562776071,0.053474855633495556,0.05375098779333251,0.05402022248685956,0.05428241409287693,0.05453742116293503,0.05478510659141478,0.05502533778194051,0.055257986809924206,0.05548293058104323,0.055700050985462164,0.055909235047614816,0.0561103750713701,0.05630336878041108,0.056488119453665525,0.056664536055632736,0.05683253336145821,0.056992032076616454,0.057142958951070834,0.05728524688778297,0.057418835045458944,0.05754366893541987,0.05765970051249947,0.05776688825987297,0.05786519726773551,0.05795459930575116,0.058035072889204786,0.058106603338796,0.05816918283402241,0.058222810460105745,0.0582674922484252,0.058303241210426765,0.05833007736498638,0.05834802775921239,0.05835712648267821,0.05835741467508573,0.058348940527364064,0.058331759276218365,0.05830593319214521,0.058271531560943036,0.05822863065874802,0.058177313720633325,0.058177313720633325,0.05811767090281588,0.058049799238519634,0.0579738025875498,0.05788979157963866,0.057797883551626766,0.057698202478549517,0.057590878898704255,0.05747604983277435,0.05735385869709508,0.05722445521114703,0.05708799529936694,0.05694464098737094,0.05679456029268756,0.05663792711009976,0.05647492109170179,0.05630572752177491,0.0561305371865935,0.055949546239271446,0.0557629560597636,0.0555709731101387,0.05537380878524212,0.05517167925886852,0.054964805325567224,0.05475341223820344,0.0545377295414023,0.05431799090100127,0.05409443392964145,0.05386730000862594,0.05363683410617846,0.05340328459223362,0.053166903049893584,0.05292794408368552,0.052686665124756935,0.05244332623314551,0.05219818989726238,0.05195152083072845,0.05170358576670411,0.05145465324985456,0.05120499342609301,0.05095487783024661,0.0507045791717893,0.05045437111878839,0.05020452808021205,0.04995532498674662,0.04970703707027256,0.04945993964215185,0.049214307870477245,0.048970416556438384,0.048728539909959005,0.0484889513247621,0.04825192315301994,0.04801772647974936,0.047786630897111645,0.047558904278779394,0.04733481255453467,0.04711461948526212,0.046898586438504655,0.046686972164749124,0.046480032574611085,0.046278020517090686,0.04608118555907092,0.04588977376623228,0.04570402748555956,0.04552418512961655,0.04535048096276679,0.045183144889519196,0.045022402245178846,0.044868473588983736,0.04472157449991025,0.04458191537532972,0.04444970123270025,0.04432513151447793,0.04420839989643242,0.04409969409955209,0.04399919570572395,0.043907079977373836,0.04382351568125224,0.04374866491655054,0.04368268294753156,0.04362571804085888,0.04357791130780655,0.04353939655153124,0.0435103001195866,0.0434907407618578,0.04348082949409313,0.04348066946720602,0.04349035584251996,0.04350997567312447,0.043539607791508644,0.043579322703634175,0.043629182489607704,0.04368924071110615,0.043759542325707834,0.04384012360827375,0.04393101207952187,0.04403222644193069,0.04414377652310215,0.04426566322671075,0.04439787849115665,0.04454040525603636,0.04469321743653754,0.04485627990585639,0.045029548485730514,0.0452129699451716,0.045406482007473936,0.04561001336556911,0.04582348370578517,0.04604680374006338,0.04627987524667476,0.04652259111947027,0.046774835425688964,0.047036483472338624,0.04730740188115458,0.047587448672130654,0.04787647335560805,0.04817431703289638,0.048480812505390485,0.048795784392137304,0.049119049255794474,0.04945041573691384,0.04978968469646914,0.05013664936653942,0.050491095509045875,0.05085280158243059,0.051221538916153705,0.051597071892874186,0.05197915813816971,0.05236754871763847,0.05276198834121541,0.05276198834121541,0.0531622155745255,0.053567963057084014,0.05397895772714491,0.05439492105298703,0.054815569270417835,0.05524061362626394,0.05566976062760851,0.05610271229652525,0.056539166430049824,0.05697881686511982,0.05742135374820669,0.057866463809353216,0.05831383064032277,0.05876313497655866,0.059214054982644294,0.05966626654094837,0.06011944354313121,0.06057325818418458,0.06102738125866924,0.06148148245881054,0.06193523067410718,0.062388294292103526,0.06284034149997378,0.0632910405865595,0.06374006024450392,0.06418706987211988,0.06463173987462927,0.06507374196440967,0.06551274945988407,0.06594843758268772,0.06638048375275002,0.0668085678809273,0.06723237265882569,0.0676515838454561,0.06806589055036459,0.0684749855128875,0.06887856537718151,0.06927633096268783,0.0696679875296897,0.07005324503963475,0.07043181840989368,0.07080342776263845,0.07116779866752967,0.07152466237790898,0.0718737560602047,0.07221482301626395,0.07254761289833878,0.07287188191645959,0.07318739303794354,0.07349391617879507,0.07379122838676708,0.07407911401586484,0.0743573648920859,0.07462578047020269,0.07488416798140825,0.07513234257165767,0.07537012743055402,0.07559735391063963,0.07581386163696922,0.07601949860685646,0.07621412127969926,0.0763975946568053,0.07656979235115441,0.07673059664704965,0.07687989854962515,0.0770175978241924,0.07714360302542601,0.0772578315164016,0.07736020947751687,0.0774506719053416,0.07752916260145765,0.07759563415136603,0.07765004789355248,0.07769237387881946,0.07772259082000553,0.07774068603222975,0.07774665536381103,0.07774050311802853,0.0777222419659013,0.07769189285017906,0.07764948488075073,0.07759505522168658,0.07752864897014607,0.07745031902739112,0.07736012596215966,0.07725813786666162,0.07714443020547203,0.0770190856576047,0.0768821939520587,0.07673385169713925,0.07673385169713925,0.07657416220386129,0.07640323530375248,0.07622118716137843,0.07602814008191874,0.0758242223141279,0.07560956784902026,0.0753843162146214,0.07514861226713243,0.07490260597885508,0.07464645222322909,0.07438031055733316,0.07410434500220157,0.07381872382130963,0.07352361929757821,0.07321920750924764,0.07290566810496903,0.07258318407845683,0.07225194154304534,0.07191212950648436,0.07156393964630864,0.07120756608610598,0.07084320517300662,0.07047105525670701,0.0700913164703365,0.06970419051346542,0.06930988043754688,0.06890859043407457,0.06850052562573061,0.06808589186078641,0.0676648955110122,0.06723774327333726,0.06680464197549456,0.06636579838587112,0.06592141902777456,0.06547170999831428,0.06501687679208379,0.06455712412981868,0.06409265579219266,0.06362367445890052,0.06315038155316582,0.06267297709179674,0.06219165954090161,0.06170662567736353,0.061218070456158465,0.06072618688359086,0.06023116589650659,0.05973319624753085,0.059232464396365724,0.05872915440717064,0.058223447852035724,0.05771552372054678,0.05720555833542788,0.056693725274237654,0.05618019529708252,0.055665136280299454,0.05514871315605137,0.05463108785776645,0.05411241927134343,0.05359286319203563,0.05307257228691675,0.05255169606282311,0.05203038083965804,0.0515087697289375,0.050987002617447374,0.05046521615587574,0.04994354375227861,0.04942211557022931,0.04890105853149819,0.04838049632310218,0.04786054940856129,0.0473413350431936,0.046822967293276535,0.046305557058900396,0.045789212100336464,0.045274037067739366,0.04476013353400341,0.04424760003058952,0.04373653208614015,0.04322702226769755,0.04271916022434306,0.042213032733073946,0.04170872374673541,0.041206314443828246,0.04070588328001277,0.04020750604113229,0.039711255897582697,0.03921720345985655,0.03872541683509417,0.0382359616844767,0.037748901281301296,0.03726429656958191,0.03678220622302292,0.036302686704219204,0.03582579232393944,0.03535157530035539,0.034880085818084536,0.03441137208691972,0.0339454804001244,0.03348245519217727,0.033022339095857424,0.03256517299856565,0.03211099609778362,0.03165984595557978,0.0312117585520757,0.03076676833779314,0.030324908284808112,0.029886209936644724,0.029450703456847093,0.029018417676173407,0.028589380138363363,0.028163617144434876,0.027741153795471856,0.0273220140338716,0.026906220683024555,0.02649379548540582,0.02608475913906183,0.02567913133248245,0.025276930777852438,0.024878175242681124,0.024482881579815118,0.02409106575584193,0.023702742877897174,0.023317927218892833,0.022936632241187048],\n",
       "\"..quantile..\":[0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0]\n",
       "}\n",
       "},{\n",
       "\"mapping\":{\n",
       "},\n",
       "\"stat\":\"dotplot\",\n",
       "\"color\":\"#118ed8\",\n",
       "\"position\":\"identity\",\n",
       "\"binwidth\":1.5,\n",
       "\"geom\":\"dotplot\",\n",
       "\"fill\":\"white\",\n",
       "\"data\":{\n",
       "\"..binwidth..\":[1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5],\n",
       "\"..count..\":[1.0,1.0,5.0,5.0,2.0,6.0,8.0,3.0,1.0],\n",
       "\"hwy\":[12.0,14.0,16.5,18.5,20.5,24.5,26.5,29.0,31.0]\n",
       "}\n",
       "}]\n",
       "};\n",
       "           var plotContainer = document.getElementById(\"X0pRIX\");\n",
       "           window.letsPlotCall(function() {{\n",
       "               LetsPlot.buildPlotFromProcessedSpecs(plotSpec, -1, -1, plotContainer);\n",
       "           }});\n",
       "       })();    \n",
       "   </script>"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "letsPlot(mpg32.toMap()) {x = \"hwy\"} +\n",
    "    geomDensity(fill = PACIFIC_BLUE) + \n",
    "    geomDotplot(binWidth = 1.5, fill = \"white\", color = PACIFIC_BLUE)\n",
    "    "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "broad-single",
   "metadata": {},
   "source": [
    "### `geomDotplot()` and `geomHistogram()`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "international-passing",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "   <div id=\"sHI0oY\"></div>\n",
       "   <script type=\"text/javascript\" data-lets-plot-script=\"plot\">\n",
       "       (function() {\n",
       "           var plotSpec={\n",
       "\"mapping\":{\n",
       "\"x\":\"hwy\"\n",
       "},\n",
       "\"data\":{\n",
       "},\n",
       "\"kind\":\"plot\",\n",
       "\"scales\":[],\n",
       "\"layers\":[{\n",
       "\"mapping\":{\n",
       "},\n",
       "\"stat\":\"bin\",\n",
       "\"color\":\"white\",\n",
       "\"position\":\"stack\",\n",
       "\"binwidth\":1.5,\n",
       "\"geom\":\"histogram\",\n",
       "\"data\":{\n",
       "\"..count..\":[1.0,0.0,1.0,1.0,6.0,3.0,2.0,0.0,3.0,3.0,8.0,0.0,3.0,1.0,0.0],\n",
       "\"hwy\":[11.7,13.2,14.7,16.2,17.7,19.2,20.7,22.2,23.7,25.2,26.7,28.2,29.7,31.2,32.7]\n",
       "}\n",
       "},{\n",
       "\"mapping\":{\n",
       "},\n",
       "\"stat\":\"dotplot\",\n",
       "\"color\":\"#118ed8\",\n",
       "\"method\":\"histodot\",\n",
       "\"position\":\"identity\",\n",
       "\"binwidth\":1.5,\n",
       "\"geom\":\"dotplot\",\n",
       "\"fill\":\"white\",\n",
       "\"data\":{\n",
       "\"..binwidth..\":[1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5],\n",
       "\"..count..\":[1.0,0.0,1.0,1.0,6.0,3.0,2.0,0.0,3.0,3.0,8.0,0.0,3.0,1.0,0.0],\n",
       "\"hwy\":[11.7,13.2,14.7,16.2,17.7,19.2,20.7,22.2,23.7,25.2,26.7,28.2,29.7,31.2,32.7]\n",
       "}\n",
       "}]\n",
       "};\n",
       "           var plotContainer = document.getElementById(\"sHI0oY\");\n",
       "           window.letsPlotCall(function() {{\n",
       "               LetsPlot.buildPlotFromProcessedSpecs(plotSpec, -1, -1, plotContainer);\n",
       "           }});\n",
       "       })();    \n",
       "   </script>"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "letsPlot(mpg32.toMap()) {x = \"hwy\"} +\n",
    "    geomHistogram(binWidth = 1.5, color = \"white\") + \n",
    "    geomDotplot(method = \"histodot\", binWidth = 1.5, fill = \"white\", color = PACIFIC_BLUE)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "engaging-cycling",
   "metadata": {},
   "source": [
    "### Parameter `stackDir`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "psychological-kernel",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "   <div id=\"ImtmlD\"></div>\n",
       "   <script type=\"text/javascript\" data-lets-plot-script=\"plot\">\n",
       "       (function() {\n",
       "           var plotSpec={\n",
       "\"kind\":\"ggbunch\",\n",
       "\"items\":[{\n",
       "\"x\":0,\n",
       "\"width\":400,\n",
       "\"y\":0,\n",
       "\"feature_spec\":{\n",
       "\"ggtitle\":{\n",
       "\"text\":\"stackDir = \\\"up\\\"\"\n",
       "},\n",
       "\"mapping\":{\n",
       "\"x\":\"hwy\"\n",
       "},\n",
       "\"data\":{\n",
       "},\n",
       "\"kind\":\"plot\",\n",
       "\"scales\":[],\n",
       "\"layers\":[{\n",
       "\"stackdir\":\"up\",\n",
       "\"mapping\":{\n",
       "},\n",
       "\"stat\":\"dotplot\",\n",
       "\"position\":\"identity\",\n",
       "\"binwidth\":1.5,\n",
       "\"geom\":\"dotplot\",\n",
       "\"data\":{\n",
       "\"..binwidth..\":[1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5],\n",
       "\"..count..\":[1.0,1.0,5.0,5.0,2.0,6.0,8.0,3.0,1.0],\n",
       "\"hwy\":[12.0,14.0,16.5,18.5,20.5,24.5,26.5,29.0,31.0]\n",
       "}\n",
       "}]\n",
       "},\n",
       "\"height\":310\n",
       "},{\n",
       "\"x\":400,\n",
       "\"width\":400,\n",
       "\"y\":0,\n",
       "\"feature_spec\":{\n",
       "\"ggtitle\":{\n",
       "\"text\":\"stackDir = \\\"down\\\"\"\n",
       "},\n",
       "\"mapping\":{\n",
       "\"x\":\"hwy\"\n",
       "},\n",
       "\"data\":{\n",
       "},\n",
       "\"kind\":\"plot\",\n",
       "\"scales\":[],\n",
       "\"layers\":[{\n",
       "\"stackdir\":\"down\",\n",
       "\"mapping\":{\n",
       "},\n",
       "\"stat\":\"dotplot\",\n",
       "\"position\":\"identity\",\n",
       "\"binwidth\":1.5,\n",
       "\"geom\":\"dotplot\",\n",
       "\"data\":{\n",
       "\"..binwidth..\":[1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5],\n",
       "\"..count..\":[1.0,1.0,5.0,5.0,2.0,6.0,8.0,3.0,1.0],\n",
       "\"hwy\":[12.0,14.0,16.5,18.5,20.5,24.5,26.5,29.0,31.0]\n",
       "}\n",
       "}]\n",
       "},\n",
       "\"height\":310\n",
       "},{\n",
       "\"x\":0,\n",
       "\"width\":400,\n",
       "\"y\":360,\n",
       "\"feature_spec\":{\n",
       "\"ggtitle\":{\n",
       "\"text\":\"stackDir = \\\"center\\\"\"\n",
       "},\n",
       "\"mapping\":{\n",
       "\"x\":\"hwy\"\n",
       "},\n",
       "\"data\":{\n",
       "},\n",
       "\"kind\":\"plot\",\n",
       "\"scales\":[],\n",
       "\"layers\":[{\n",
       "\"stackdir\":\"center\",\n",
       "\"mapping\":{\n",
       "},\n",
       "\"stat\":\"dotplot\",\n",
       "\"position\":\"identity\",\n",
       "\"binwidth\":1.5,\n",
       "\"geom\":\"dotplot\",\n",
       "\"data\":{\n",
       "\"..binwidth..\":[1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5],\n",
       "\"..count..\":[1.0,1.0,5.0,5.0,2.0,6.0,8.0,3.0,1.0],\n",
       "\"hwy\":[12.0,14.0,16.5,18.5,20.5,24.5,26.5,29.0,31.0]\n",
       "}\n",
       "}]\n",
       "},\n",
       "\"height\":310\n",
       "},{\n",
       "\"x\":400,\n",
       "\"width\":400,\n",
       "\"y\":360,\n",
       "\"feature_spec\":{\n",
       "\"ggtitle\":{\n",
       "\"text\":\"stackDir = \\\"centerwhole\\\"\"\n",
       "},\n",
       "\"mapping\":{\n",
       "\"x\":\"hwy\"\n",
       "},\n",
       "\"data\":{\n",
       "},\n",
       "\"kind\":\"plot\",\n",
       "\"scales\":[],\n",
       "\"layers\":[{\n",
       "\"stackdir\":\"centerwhole\",\n",
       "\"mapping\":{\n",
       "},\n",
       "\"stat\":\"dotplot\",\n",
       "\"position\":\"identity\",\n",
       "\"binwidth\":1.5,\n",
       "\"geom\":\"dotplot\",\n",
       "\"data\":{\n",
       "\"..binwidth..\":[1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5],\n",
       "\"..count..\":[1.0,1.0,5.0,5.0,2.0,6.0,8.0,3.0,1.0],\n",
       "\"hwy\":[12.0,14.0,16.5,18.5,20.5,24.5,26.5,29.0,31.0]\n",
       "}\n",
       "}]\n",
       "},\n",
       "\"height\":310\n",
       "}]\n",
       "};\n",
       "           var plotContainer = document.getElementById(\"ImtmlD\");\n",
       "           window.letsPlotCall(function() {{\n",
       "               LetsPlot.buildPlotFromProcessedSpecs(plotSpec, -1, -1, plotContainer);\n",
       "           }});\n",
       "       })();    \n",
       "   </script>"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "val plotBase = letsPlot(mpg32.toMap()) {x = \"hwy\"}\n",
    "val plots = listOf(\n",
    "    plotBase + geomDotplot(binWidth = 1.5, stackDir = \"up\") + ggtitle(\"stackDir = \\\"up\\\"\"),\n",
    "    plotBase + geomDotplot(binWidth = 1.5, stackDir = \"down\") + ggtitle(\"stackDir = \\\"down\\\"\"),\n",
    "    plotBase + geomDotplot(binWidth = 1.5, stackDir = \"center\") + ggtitle(\"stackDir = \\\"center\\\"\"),\n",
    "    plotBase + geomDotplot(binWidth = 1.5, stackDir = \"centerwhole\") + ggtitle(\"stackDir = \\\"centerwhole\\\"\"),\n",
    ")\n",
    "\n",
    "gggrid(plots, 2, 400, 310, fit = true)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "documented-guatemala",
   "metadata": {},
   "source": [
    "### Parameter `stackRatio`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "peaceful-sentence",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "   <div id=\"hzo17A\"></div>\n",
       "   <script type=\"text/javascript\" data-lets-plot-script=\"plot\">\n",
       "       (function() {\n",
       "           var plotSpec={\n",
       "\"kind\":\"ggbunch\",\n",
       "\"items\":[{\n",
       "\"x\":0,\n",
       "\"width\":400,\n",
       "\"y\":0,\n",
       "\"feature_spec\":{\n",
       "\"ggtitle\":{\n",
       "\"text\":\"stackRatio = 1\"\n",
       "},\n",
       "\"mapping\":{\n",
       "\"x\":\"hwy\"\n",
       "},\n",
       "\"data\":{\n",
       "},\n",
       "\"kind\":\"plot\",\n",
       "\"scales\":[],\n",
       "\"layers\":[{\n",
       "\"mapping\":{\n",
       "},\n",
       "\"stat\":\"dotplot\",\n",
       "\"stackratio\":1.0,\n",
       "\"position\":\"identity\",\n",
       "\"binwidth\":1.5,\n",
       "\"geom\":\"dotplot\",\n",
       "\"data\":{\n",
       "\"..binwidth..\":[1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5],\n",
       "\"..count..\":[1.0,1.0,5.0,5.0,2.0,6.0,8.0,3.0,1.0],\n",
       "\"hwy\":[12.0,14.0,16.5,18.5,20.5,24.5,26.5,29.0,31.0]\n",
       "}\n",
       "}]\n",
       "},\n",
       "\"height\":310\n",
       "},{\n",
       "\"x\":400,\n",
       "\"width\":400,\n",
       "\"y\":0,\n",
       "\"feature_spec\":{\n",
       "\"ggtitle\":{\n",
       "\"text\":\"stackRatio = 0.5\"\n",
       "},\n",
       "\"mapping\":{\n",
       "\"x\":\"hwy\"\n",
       "},\n",
       "\"data\":{\n",
       "},\n",
       "\"kind\":\"plot\",\n",
       "\"scales\":[],\n",
       "\"layers\":[{\n",
       "\"mapping\":{\n",
       "},\n",
       "\"stat\":\"dotplot\",\n",
       "\"stackratio\":0.5,\n",
       "\"position\":\"identity\",\n",
       "\"binwidth\":1.5,\n",
       "\"geom\":\"dotplot\",\n",
       "\"data\":{\n",
       "\"..binwidth..\":[1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5],\n",
       "\"..count..\":[1.0,1.0,5.0,5.0,2.0,6.0,8.0,3.0,1.0],\n",
       "\"hwy\":[12.0,14.0,16.5,18.5,20.5,24.5,26.5,29.0,31.0]\n",
       "}\n",
       "}]\n",
       "},\n",
       "\"height\":310\n",
       "},{\n",
       "\"x\":0,\n",
       "\"width\":400,\n",
       "\"y\":360,\n",
       "\"feature_spec\":{\n",
       "\"ggtitle\":{\n",
       "\"text\":\"stackRatio = 1.5\"\n",
       "},\n",
       "\"mapping\":{\n",
       "\"x\":\"hwy\"\n",
       "},\n",
       "\"data\":{\n",
       "},\n",
       "\"kind\":\"plot\",\n",
       "\"scales\":[],\n",
       "\"layers\":[{\n",
       "\"mapping\":{\n",
       "},\n",
       "\"stat\":\"dotplot\",\n",
       "\"stackratio\":1.5,\n",
       "\"position\":\"identity\",\n",
       "\"binwidth\":1.5,\n",
       "\"geom\":\"dotplot\",\n",
       "\"data\":{\n",
       "\"..binwidth..\":[1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5],\n",
       "\"..count..\":[1.0,1.0,5.0,5.0,2.0,6.0,8.0,3.0,1.0],\n",
       "\"hwy\":[12.0,14.0,16.5,18.5,20.5,24.5,26.5,29.0,31.0]\n",
       "}\n",
       "}]\n",
       "},\n",
       "\"height\":310\n",
       "}]\n",
       "};\n",
       "           var plotContainer = document.getElementById(\"hzo17A\");\n",
       "           window.letsPlotCall(function() {{\n",
       "               LetsPlot.buildPlotFromProcessedSpecs(plotSpec, -1, -1, plotContainer);\n",
       "           }});\n",
       "       })();    \n",
       "   </script>"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "val plots1 = listOf(\n",
    "    plotBase + geomDotplot(binWidth = 1.5, stackRatio = 1) + ggtitle(\"stackRatio = 1\"),\n",
    "    plotBase + geomDotplot(binWidth = 1.5, stackRatio = 0.5) + ggtitle(\"stackRatio = 0.5\"),\n",
    "    plotBase + geomDotplot(binWidth = 1.5, stackRatio = 1.5) + ggtitle(\"stackRatio = 1.5\"),\n",
    ")\n",
    "\n",
    "gggrid(plots1, 2, 400, 310, fit = true)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "refined-queensland",
   "metadata": {},
   "source": [
    "### Parameter `dotSize`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "geographic-delivery",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "   <div id=\"WFVg0A\"></div>\n",
       "   <script type=\"text/javascript\" data-lets-plot-script=\"plot\">\n",
       "       (function() {\n",
       "           var plotSpec={\n",
       "\"kind\":\"ggbunch\",\n",
       "\"items\":[{\n",
       "\"x\":0,\n",
       "\"width\":400,\n",
       "\"y\":0,\n",
       "\"feature_spec\":{\n",
       "\"ggtitle\":{\n",
       "\"text\":\"dotSize = 1\"\n",
       "},\n",
       "\"mapping\":{\n",
       "\"x\":\"hwy\"\n",
       "},\n",
       "\"data\":{\n",
       "},\n",
       "\"kind\":\"plot\",\n",
       "\"scales\":[],\n",
       "\"layers\":[{\n",
       "\"mapping\":{\n",
       "},\n",
       "\"stat\":\"dotplot\",\n",
       "\"position\":\"identity\",\n",
       "\"binwidth\":1.5,\n",
       "\"dotsize\":1.0,\n",
       "\"geom\":\"dotplot\",\n",
       "\"data\":{\n",
       "\"..binwidth..\":[1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5],\n",
       "\"..count..\":[1.0,1.0,5.0,5.0,2.0,6.0,8.0,3.0,1.0],\n",
       "\"hwy\":[12.0,14.0,16.5,18.5,20.5,24.5,26.5,29.0,31.0]\n",
       "}\n",
       "}]\n",
       "},\n",
       "\"height\":310\n",
       "},{\n",
       "\"x\":400,\n",
       "\"width\":400,\n",
       "\"y\":0,\n",
       "\"feature_spec\":{\n",
       "\"ggtitle\":{\n",
       "\"text\":\"dotSize = 0.5\"\n",
       "},\n",
       "\"mapping\":{\n",
       "\"x\":\"hwy\"\n",
       "},\n",
       "\"data\":{\n",
       "},\n",
       "\"kind\":\"plot\",\n",
       "\"scales\":[],\n",
       "\"layers\":[{\n",
       "\"mapping\":{\n",
       "},\n",
       "\"stat\":\"dotplot\",\n",
       "\"position\":\"identity\",\n",
       "\"binwidth\":1.5,\n",
       "\"dotsize\":0.5,\n",
       "\"geom\":\"dotplot\",\n",
       "\"data\":{\n",
       "\"..binwidth..\":[1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5],\n",
       "\"..count..\":[1.0,1.0,5.0,5.0,2.0,6.0,8.0,3.0,1.0],\n",
       "\"hwy\":[12.0,14.0,16.5,18.5,20.5,24.5,26.5,29.0,31.0]\n",
       "}\n",
       "}]\n",
       "},\n",
       "\"height\":310\n",
       "},{\n",
       "\"x\":0,\n",
       "\"width\":400,\n",
       "\"y\":360,\n",
       "\"feature_spec\":{\n",
       "\"ggtitle\":{\n",
       "\"text\":\"dotSize = 1.5\"\n",
       "},\n",
       "\"mapping\":{\n",
       "\"x\":\"hwy\"\n",
       "},\n",
       "\"data\":{\n",
       "},\n",
       "\"kind\":\"plot\",\n",
       "\"scales\":[],\n",
       "\"layers\":[{\n",
       "\"mapping\":{\n",
       "},\n",
       "\"stat\":\"dotplot\",\n",
       "\"position\":\"identity\",\n",
       "\"binwidth\":1.5,\n",
       "\"dotsize\":1.5,\n",
       "\"geom\":\"dotplot\",\n",
       "\"data\":{\n",
       "\"..binwidth..\":[1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5],\n",
       "\"..count..\":[1.0,1.0,5.0,5.0,2.0,6.0,8.0,3.0,1.0],\n",
       "\"hwy\":[12.0,14.0,16.5,18.5,20.5,24.5,26.5,29.0,31.0]\n",
       "}\n",
       "}]\n",
       "},\n",
       "\"height\":310\n",
       "}]\n",
       "};\n",
       "           var plotContainer = document.getElementById(\"WFVg0A\");\n",
       "           window.letsPlotCall(function() {{\n",
       "               LetsPlot.buildPlotFromProcessedSpecs(plotSpec, -1, -1, plotContainer);\n",
       "           }});\n",
       "       })();    \n",
       "   </script>"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "val plots2 = listOf(\n",
    "    plotBase + geomDotplot(binWidth = 1.5, dotSize = 1) + ggtitle(\"dotSize = 1\"),\n",
    "    plotBase + geomDotplot(binWidth = 1.5, dotSize = 0.5) + ggtitle(\"dotSize = 0.5\"),\n",
    "    plotBase + geomDotplot(binWidth = 1.5, dotSize = 1.5) + ggtitle(\"dotSize = 1.5\"),\n",
    ")\n",
    "\n",
    "gggrid(plots2, 2, 400, 310, fit = true)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "laughing-occupation",
   "metadata": {},
   "source": [
    "### Parameter `center`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "resident-carpet",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "   <div id=\"DrKsCh\"></div>\n",
       "   <script type=\"text/javascript\" data-lets-plot-script=\"plot\">\n",
       "       (function() {\n",
       "           var plotSpec={\n",
       "\"kind\":\"ggbunch\",\n",
       "\"items\":[{\n",
       "\"x\":0,\n",
       "\"width\":400,\n",
       "\"y\":0,\n",
       "\"feature_spec\":{\n",
       "\"ggtitle\":{\n",
       "\"text\":\"Default\"\n",
       "},\n",
       "\"mapping\":{\n",
       "\"x\":\"hwy\"\n",
       "},\n",
       "\"data\":{\n",
       "},\n",
       "\"kind\":\"plot\",\n",
       "\"scales\":[],\n",
       "\"layers\":[{\n",
       "\"mapping\":{\n",
       "},\n",
       "\"stat\":\"dotplot\",\n",
       "\"method\":\"histodot\",\n",
       "\"position\":\"identity\",\n",
       "\"binwidth\":1.5,\n",
       "\"geom\":\"dotplot\",\n",
       "\"data\":{\n",
       "\"..binwidth..\":[1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5],\n",
       "\"..count..\":[1.0,0.0,1.0,1.0,6.0,3.0,2.0,0.0,3.0,3.0,8.0,0.0,3.0,1.0,0.0],\n",
       "\"hwy\":[11.7,13.2,14.7,16.2,17.7,19.2,20.7,22.2,23.7,25.2,26.7,28.2,29.7,31.2,32.7]\n",
       "}\n",
       "}]\n",
       "},\n",
       "\"height\":310\n",
       "},{\n",
       "\"x\":400,\n",
       "\"width\":400,\n",
       "\"y\":0,\n",
       "\"feature_spec\":{\n",
       "\"ggtitle\":{\n",
       "\"text\":\"center = 11\"\n",
       "},\n",
       "\"mapping\":{\n",
       "\"x\":\"hwy\"\n",
       "},\n",
       "\"data\":{\n",
       "},\n",
       "\"kind\":\"plot\",\n",
       "\"scales\":[],\n",
       "\"layers\":[{\n",
       "\"mapping\":{\n",
       "},\n",
       "\"stat\":\"dotplot\",\n",
       "\"method\":\"histodot\",\n",
       "\"center\":11.0,\n",
       "\"position\":\"identity\",\n",
       "\"binwidth\":1.5,\n",
       "\"geom\":\"dotplot\",\n",
       "\"data\":{\n",
       "\"..binwidth..\":[1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5],\n",
       "\"..count..\":[0.0,1.0,1.0,1.0,4.0,5.0,1.0,1.0,0.0,6.0,5.0,3.0,3.0,1.0,0.0],\n",
       "\"hwy\":[11.0,12.5,14.0,15.5,17.0,18.5,20.0,21.5,23.0,24.5,26.0,27.5,29.0,30.5,32.0]\n",
       "}\n",
       "}]\n",
       "},\n",
       "\"height\":310\n",
       "}]\n",
       "};\n",
       "           var plotContainer = document.getElementById(\"DrKsCh\");\n",
       "           window.letsPlotCall(function() {{\n",
       "               LetsPlot.buildPlotFromProcessedSpecs(plotSpec, -1, -1, plotContainer);\n",
       "           }});\n",
       "       })();    \n",
       "   </script>"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "val plots3 = listOf(\n",
    "    plotBase + geomDotplot(binWidth = 1.5, method = \"histodot\") + ggtitle(\"Default\"),\n",
    "    plotBase + geomDotplot(binWidth = 1.5, method = \"histodot\", center = 11) + ggtitle(\"center = 11\"),\n",
    ")\n",
    "\n",
    "gggrid(plots3, 2, 400, 310, fit = true)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "agricultural-roots",
   "metadata": {},
   "source": [
    "### Parameter `boundary`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "compliant-transcription",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "   <div id=\"d7G5yN\"></div>\n",
       "   <script type=\"text/javascript\" data-lets-plot-script=\"plot\">\n",
       "       (function() {\n",
       "           var plotSpec={\n",
       "\"kind\":\"ggbunch\",\n",
       "\"items\":[{\n",
       "\"x\":0,\n",
       "\"width\":400,\n",
       "\"y\":0,\n",
       "\"feature_spec\":{\n",
       "\"ggtitle\":{\n",
       "\"text\":\"Default\"\n",
       "},\n",
       "\"mapping\":{\n",
       "\"x\":\"hwy\"\n",
       "},\n",
       "\"data\":{\n",
       "},\n",
       "\"kind\":\"plot\",\n",
       "\"scales\":[],\n",
       "\"layers\":[{\n",
       "\"mapping\":{\n",
       "},\n",
       "\"stat\":\"dotplot\",\n",
       "\"method\":\"histodot\",\n",
       "\"position\":\"identity\",\n",
       "\"binwidth\":1.5,\n",
       "\"geom\":\"dotplot\",\n",
       "\"data\":{\n",
       "\"..binwidth..\":[1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5],\n",
       "\"..count..\":[1.0,0.0,1.0,1.0,6.0,3.0,2.0,0.0,3.0,3.0,8.0,0.0,3.0,1.0,0.0],\n",
       "\"hwy\":[11.7,13.2,14.7,16.2,17.7,19.2,20.7,22.2,23.7,25.2,26.7,28.2,29.7,31.2,32.7]\n",
       "}\n",
       "}]\n",
       "},\n",
       "\"height\":310\n",
       "},{\n",
       "\"x\":400,\n",
       "\"width\":400,\n",
       "\"y\":0,\n",
       "\"feature_spec\":{\n",
       "\"ggtitle\":{\n",
       "\"text\":\"boundary = 12\"\n",
       "},\n",
       "\"mapping\":{\n",
       "\"x\":\"hwy\"\n",
       "},\n",
       "\"data\":{\n",
       "},\n",
       "\"kind\":\"plot\",\n",
       "\"scales\":[],\n",
       "\"layers\":[{\n",
       "\"boundary\":12.0,\n",
       "\"mapping\":{\n",
       "},\n",
       "\"stat\":\"dotplot\",\n",
       "\"method\":\"histodot\",\n",
       "\"position\":\"identity\",\n",
       "\"binwidth\":1.5,\n",
       "\"geom\":\"dotplot\",\n",
       "\"data\":{\n",
       "\"..binwidth..\":[1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5],\n",
       "\"..count..\":[0.0,1.0,1.0,1.0,4.0,5.0,1.0,1.0,0.0,6.0,5.0,3.0,3.0,1.0,0.0],\n",
       "\"hwy\":[11.25,12.75,14.25,15.75,17.25,18.75,20.25,21.75,23.25,24.75,26.25,27.75,29.25,30.75,32.25]\n",
       "}\n",
       "}]\n",
       "},\n",
       "\"height\":310\n",
       "}]\n",
       "};\n",
       "           var plotContainer = document.getElementById(\"d7G5yN\");\n",
       "           window.letsPlotCall(function() {{\n",
       "               LetsPlot.buildPlotFromProcessedSpecs(plotSpec, -1, -1, plotContainer);\n",
       "           }});\n",
       "       })();    \n",
       "   </script>"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "val plots4 = listOf(\n",
    "    plotBase + geomDotplot(binWidth = 1.5, method = \"histodot\") + ggtitle(\"Default\"),\n",
    "    plotBase + geomDotplot(binWidth = 1.5, method = \"histodot\", boundary = 12) + ggtitle(\"boundary = 12\"),\n",
    ")\n",
    "\n",
    "gggrid(plots4, 2, 400, 310, fit = true)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "downtown-rebate",
   "metadata": {},
   "source": [
    "### Parameter `bins`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "scenic-treasure",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "   <div id=\"lsINIX\"></div>\n",
       "   <script type=\"text/javascript\" data-lets-plot-script=\"plot\">\n",
       "       (function() {\n",
       "           var plotSpec={\n",
       "\"kind\":\"ggbunch\",\n",
       "\"items\":[{\n",
       "\"x\":0,\n",
       "\"width\":400,\n",
       "\"y\":0,\n",
       "\"feature_spec\":{\n",
       "\"ggtitle\":{\n",
       "\"text\":\"Default (30)\"\n",
       "},\n",
       "\"mapping\":{\n",
       "\"x\":\"hwy\"\n",
       "},\n",
       "\"data\":{\n",
       "},\n",
       "\"kind\":\"plot\",\n",
       "\"scales\":[],\n",
       "\"layers\":[{\n",
       "\"mapping\":{\n",
       "},\n",
       "\"stat\":\"dotplot\",\n",
       "\"method\":\"histodot\",\n",
       "\"position\":\"identity\",\n",
       "\"geom\":\"dotplot\",\n",
       "\"data\":{\n",
       "\"..binwidth..\":[0.6628888888888889,0.6628888888888889,0.6628888888888889,0.6628888888888889,0.6628888888888889,0.6628888888888889,0.6628888888888889,0.6628888888888889,0.6628888888888889,0.6628888888888889,0.6628888888888889,0.6628888888888889,0.6628888888888889,0.6628888888888889,0.6628888888888889,0.6628888888888889,0.6628888888888889,0.6628888888888889,0.6628888888888889,0.6628888888888889,0.6628888888888889,0.6628888888888889,0.6628888888888889,0.6628888888888889,0.6628888888888889,0.6628888888888889,0.6628888888888889,0.6628888888888889,0.6628888888888889,0.6628888888888889],\n",
       "\"..count..\":[1.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,4.0,2.0,0.0,3.0,1.0,0.0,1.0,0.0,0.0,0.0,3.0,0.0,3.0,5.0,0.0,3.0,0.0,0.0,3.0,0.0,0.0,1.0],\n",
       "\"hwy\":[11.888111111111112,12.551,13.213888888888889,13.876777777777779,14.539666666666667,15.202555555555556,15.865444444444446,16.528333333333336,17.191222222222223,17.85411111111111,18.517,19.17988888888889,19.842777777777776,20.505666666666666,21.168555555555557,21.831444444444443,22.494333333333334,23.157222222222224,23.82011111111111,24.483,25.14588888888889,25.808777777777777,26.471666666666668,27.134555555555558,27.797444444444444,28.460333333333335,29.12322222222222,29.78611111111111,30.449,31.11188888888889]\n",
       "}\n",
       "}]\n",
       "},\n",
       "\"height\":310\n",
       "},{\n",
       "\"x\":400,\n",
       "\"width\":400,\n",
       "\"y\":0,\n",
       "\"feature_spec\":{\n",
       "\"ggtitle\":{\n",
       "\"text\":\"bins = 15\"\n",
       "},\n",
       "\"mapping\":{\n",
       "\"x\":\"hwy\"\n",
       "},\n",
       "\"data\":{\n",
       "},\n",
       "\"kind\":\"plot\",\n",
       "\"scales\":[],\n",
       "\"layers\":[{\n",
       "\"mapping\":{\n",
       "},\n",
       "\"stat\":\"dotplot\",\n",
       "\"bins\":15.0,\n",
       "\"method\":\"histodot\",\n",
       "\"position\":\"identity\",\n",
       "\"geom\":\"dotplot\",\n",
       "\"data\":{\n",
       "\"..binwidth..\":[1.3848888888888888,1.3848888888888888,1.3848888888888888,1.3848888888888888,1.3848888888888888,1.3848888888888888,1.3848888888888888,1.3848888888888888,1.3848888888888888,1.3848888888888888,1.3848888888888888,1.3848888888888888,1.3848888888888888,1.3848888888888888,1.3848888888888888],\n",
       "\"..count..\":[1.0,0.0,1.0,1.0,6.0,3.0,1.0,1.0,0.0,3.0,8.0,3.0,3.0,0.0,1.0],\n",
       "\"hwy\":[11.805777777777777,13.190666666666665,14.575555555555555,15.960444444444445,17.345333333333333,18.73022222222222,20.115111111111112,21.5,22.884888888888888,24.269777777777776,25.654666666666664,27.039555555555555,28.424444444444443,29.80933333333333,31.194222222222223]\n",
       "}\n",
       "}]\n",
       "},\n",
       "\"height\":310\n",
       "}]\n",
       "};\n",
       "           var plotContainer = document.getElementById(\"lsINIX\");\n",
       "           window.letsPlotCall(function() {{\n",
       "               LetsPlot.buildPlotFromProcessedSpecs(plotSpec, -1, -1, plotContainer);\n",
       "           }});\n",
       "       })();    \n",
       "   </script>"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "val plots5 = listOf(\n",
    "    plotBase + geomDotplot(method = \"histodot\") + ggtitle(\"Default (30)\"),\n",
    "    plotBase + geomDotplot(method = \"histodot\", bins = 15) + ggtitle(\"bins = 15\"),\n",
    ")\n",
    "\n",
    "gggrid(plots5, 2, 400, 310, fit = true)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "banner-assault",
   "metadata": {},
   "source": [
    "### Grouping"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "streaming-promotion",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "   <div id=\"GvRHjx\"></div>\n",
       "   <script type=\"text/javascript\" data-lets-plot-script=\"plot\">\n",
       "       (function() {\n",
       "           var plotSpec={\n",
       "\"ggtitle\":{\n",
       "\"text\":\"method='dotdensity'\"\n",
       "},\n",
       "\"mapping\":{\n",
       "\"x\":\"hwy\"\n",
       "},\n",
       "\"data\":{\n",
       "},\n",
       "\"kind\":\"plot\",\n",
       "\"scales\":[],\n",
       "\"layers\":[{\n",
       "\"mapping\":{\n",
       "\"fill\":\"@as_discrete@cyl\"\n",
       "},\n",
       "\"stat\":\"dotplot\",\n",
       "\"color\":\"black\",\n",
       "\"position\":\"identity\",\n",
       "\"binwidth\":2.0,\n",
       "\"geom\":\"dotplot\",\n",
       "\"data_meta\":{\n",
       "\"mapping_annotations\":[{\n",
       "\"aes\":\"fill\",\n",
       "\"annotation\":\"as_discrete\",\n",
       "\"parameters\":{\n",
       "\"label\":\"cyl\"\n",
       "}\n",
       "}]\n",
       "},\n",
       "\"data\":{\n",
       "\"@as_discrete@cyl\":[6.0,6.0,6.0,6.0,5.0,8.0,8.0,8.0,8.0,8.0,8.0,8.0,4.0,4.0,4.0,4.0,4.0],\n",
       "\"..binwidth..\":[2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0],\n",
       "\"..count..\":[3.0,1.0,3.0,3.0,1.0,1.0,1.0,3.0,3.0,1.0,1.0,1.0,1.0,3.0,3.0,2.0,1.0],\n",
       "\"hwy\":[17.5,19.0,24.5,26.0,29.0,12.0,14.0,16.5,18.5,21.0,24.0,26.0,20.0,25.5,27.0,29.0,31.0]\n",
       "}\n",
       "}]\n",
       "};\n",
       "           var plotContainer = document.getElementById(\"GvRHjx\");\n",
       "           window.letsPlotCall(function() {{\n",
       "               LetsPlot.buildPlotFromProcessedSpecs(plotSpec, -1, -1, plotContainer);\n",
       "           }});\n",
       "       })();    \n",
       "   </script>"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "plotBase +\n",
    "    geomDotplot(binWidth = 2, color=\"black\") {fill = asDiscrete(\"cyl\")} +\n",
    "    ggtitle(\"method='dotdensity'\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "quick-discretion",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "   <div id=\"condzV\"></div>\n",
       "   <script type=\"text/javascript\" data-lets-plot-script=\"plot\">\n",
       "       (function() {\n",
       "           var plotSpec={\n",
       "\"kind\":\"ggbunch\",\n",
       "\"items\":[{\n",
       "\"x\":0,\n",
       "\"width\":400,\n",
       "\"y\":0,\n",
       "\"feature_spec\":{\n",
       "\"ggtitle\":{\n",
       "\"text\":\"method='histodot'\"\n",
       "},\n",
       "\"mapping\":{\n",
       "\"x\":\"hwy\"\n",
       "},\n",
       "\"data\":{\n",
       "},\n",
       "\"kind\":\"plot\",\n",
       "\"scales\":[],\n",
       "\"layers\":[{\n",
       "\"mapping\":{\n",
       "\"fill\":\"@as_discrete@cyl\"\n",
       "},\n",
       "\"stat\":\"dotplot\",\n",
       "\"color\":\"black\",\n",
       "\"method\":\"histodot\",\n",
       "\"position\":\"identity\",\n",
       "\"binwidth\":2.0,\n",
       "\"geom\":\"dotplot\",\n",
       "\"data_meta\":{\n",
       "\"mapping_annotations\":[{\n",
       "\"aes\":\"fill\",\n",
       "\"annotation\":\"as_discrete\",\n",
       "\"parameters\":{\n",
       "\"label\":\"cyl\"\n",
       "}\n",
       "}]\n",
       "},\n",
       "\"data\":{\n",
       "\"@as_discrete@cyl\":[6.0,6.0,6.0,6.0,6.0,6.0,6.0,6.0,6.0,6.0,6.0,5.0,5.0,5.0,5.0,5.0,5.0,5.0,5.0,5.0,5.0,5.0,8.0,8.0,8.0,8.0,8.0,8.0,8.0,8.0,8.0,8.0,8.0,4.0,4.0,4.0,4.0,4.0,4.0,4.0,4.0,4.0,4.0,4.0],\n",
       "\"..binwidth..\":[2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0],\n",
       "\"..count..\":[0.0,0.0,0.0,3.0,1.0,0.0,2.0,4.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1.0,1.0,1.0,3.0,2.0,1.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,3.0,3.0,2.0,1.0],\n",
       "\"hwy\":[11.6,13.6,15.6,17.6,19.6,21.6,23.6,25.6,27.6,29.6,31.6,11.6,13.6,15.6,17.6,19.6,21.6,23.6,25.6,27.6,29.6,31.6,11.6,13.6,15.6,17.6,19.6,21.6,23.6,25.6,27.6,29.6,31.6,11.6,13.6,15.6,17.6,19.6,21.6,23.6,25.6,27.6,29.6,31.6]\n",
       "}\n",
       "}]\n",
       "},\n",
       "\"height\":310\n",
       "},{\n",
       "\"x\":400,\n",
       "\"width\":400,\n",
       "\"y\":0,\n",
       "\"feature_spec\":{\n",
       "\"ggtitle\":{\n",
       "\"text\":\"method='histodot', stackGroups = true\"\n",
       "},\n",
       "\"mapping\":{\n",
       "\"x\":\"hwy\"\n",
       "},\n",
       "\"data\":{\n",
       "},\n",
       "\"kind\":\"plot\",\n",
       "\"scales\":[],\n",
       "\"layers\":[{\n",
       "\"mapping\":{\n",
       "\"fill\":\"@as_discrete@cyl\"\n",
       "},\n",
       "\"stat\":\"dotplot\",\n",
       "\"stackgroups\":true,\n",
       "\"color\":\"black\",\n",
       "\"method\":\"histodot\",\n",
       "\"position\":\"identity\",\n",
       "\"binwidth\":2.0,\n",
       "\"geom\":\"dotplot\",\n",
       "\"data_meta\":{\n",
       "\"mapping_annotations\":[{\n",
       "\"aes\":\"fill\",\n",
       "\"annotation\":\"as_discrete\",\n",
       "\"parameters\":{\n",
       "\"label\":\"cyl\"\n",
       "}\n",
       "}]\n",
       "},\n",
       "\"data\":{\n",
       "\"@as_discrete@cyl\":[6.0,6.0,6.0,6.0,6.0,6.0,6.0,6.0,6.0,6.0,6.0,5.0,5.0,5.0,5.0,5.0,5.0,5.0,5.0,5.0,5.0,5.0,8.0,8.0,8.0,8.0,8.0,8.0,8.0,8.0,8.0,8.0,8.0,4.0,4.0,4.0,4.0,4.0,4.0,4.0,4.0,4.0,4.0,4.0],\n",
       "\"..binwidth..\":[2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0],\n",
       "\"..count..\":[0.0,0.0,0.0,3.0,1.0,0.0,2.0,4.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1.0,1.0,1.0,3.0,2.0,1.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,3.0,3.0,2.0,1.0],\n",
       "\"hwy\":[11.6,13.6,15.6,17.6,19.6,21.6,23.6,25.6,27.6,29.6,31.6,11.6,13.6,15.6,17.6,19.6,21.6,23.6,25.6,27.6,29.6,31.6,11.6,13.6,15.6,17.6,19.6,21.6,23.6,25.6,27.6,29.6,31.6,11.6,13.6,15.6,17.6,19.6,21.6,23.6,25.6,27.6,29.6,31.6]\n",
       "}\n",
       "}]\n",
       "},\n",
       "\"height\":310\n",
       "}]\n",
       "};\n",
       "           var plotContainer = document.getElementById(\"condzV\");\n",
       "           window.letsPlotCall(function() {{\n",
       "               LetsPlot.buildPlotFromProcessedSpecs(plotSpec, -1, -1, plotContainer);\n",
       "           }});\n",
       "       })();    \n",
       "   </script>"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "val plots6 = listOf(\n",
    "    plotBase + geomDotplot(method = \"histodot\", binWidth = 2, color = \"black\") {\n",
    "        fill = asDiscrete(\"cyl\")\n",
    "    } + ggtitle(\"method='histodot'\"),\n",
    "    plotBase + geomDotplot(method = \"histodot\", stackGroups = true, binWidth = 2, color = \"black\") {\n",
    "        fill = asDiscrete(\"cyl\")\n",
    "    } + ggtitle(\"method='histodot', stackGroups = true\"),\n",
    ")\n",
    "\n",
    "gggrid(plots6, 2, 400, 310, fit = true)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "rural-manchester",
   "metadata": {},
   "source": [
    "### Tooltips"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "standing-gender",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "   <div id=\"SPVKbL\"></div>\n",
       "   <script type=\"text/javascript\" data-lets-plot-script=\"plot\">\n",
       "       (function() {\n",
       "           var plotSpec={\n",
       "\"mapping\":{\n",
       "\"x\":\"hwy\"\n",
       "},\n",
       "\"data\":{\n",
       "},\n",
       "\"kind\":\"plot\",\n",
       "\"scales\":[],\n",
       "\"layers\":[{\n",
       "\"mapping\":{\n",
       "},\n",
       "\"stat\":\"dotplot\",\n",
       "\"bins\":15.0,\n",
       "\"position\":\"identity\",\n",
       "\"geom\":\"dotplot\",\n",
       "\"tooltips\":{\n",
       "\"lines\":[\"stack center|^x\",\"Number of dots in stack|@..count..\",\"Dot diameter|@..binwidth..\"]\n",
       "},\n",
       "\"data\":{\n",
       "\"..binwidth..\":[1.2666666666666666,1.2666666666666666,1.2666666666666666,1.2666666666666666,1.2666666666666666,1.2666666666666666,1.2666666666666666,1.2666666666666666,1.2666666666666666],\n",
       "\"..count..\":[1.0,1.0,5.0,5.0,2.0,6.0,8.0,3.0,1.0],\n",
       "\"hwy\":[12.0,14.0,16.5,18.5,20.5,24.5,26.5,29.0,31.0]\n",
       "}\n",
       "}]\n",
       "};\n",
       "           var plotContainer = document.getElementById(\"SPVKbL\");\n",
       "           window.letsPlotCall(function() {{\n",
       "               LetsPlot.buildPlotFromProcessedSpecs(plotSpec, -1, -1, plotContainer);\n",
       "           }});\n",
       "       })();    \n",
       "   </script>"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "letsPlot(mpg32.toMap()) {x = \"hwy\"} + \n",
    "    geomDotplot(tooltips = layerTooltips()\n",
    "                   .line(\"stack center|^x\")\n",
    "                   .line(\"Number of dots in stack|@..count..\")\n",
    "                   .line(\"Dot diameter|@..binwidth..\"),\n",
    "               bins = 15)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "least-sodium",
   "metadata": {},
   "source": [
    "### Facets"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "healthy-master",
   "metadata": {},
   "outputs": [],
   "source": [
    "val plotBase2 = plotBase + \n",
    "    scaleColorBrewer(type=\"qual\", palette=\"Set1\") + \n",
    "    scaleFillBrewer(type=\"qual\", palette=\"Set1\") +\n",
    "    themeGrey()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "magnetic-keeping",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "   <div id=\"HJRYjU\"></div>\n",
       "   <script type=\"text/javascript\" data-lets-plot-script=\"plot\">\n",
       "       (function() {\n",
       "           var plotSpec={\n",
       "\"ggtitle\":{\n",
       "\"text\":\"facetGrid\"\n",
       "},\n",
       "\"mapping\":{\n",
       "\"x\":\"hwy\"\n",
       "},\n",
       "\"data\":{\n",
       "},\n",
       "\"kind\":\"plot\",\n",
       "\"scales\":[{\n",
       "\"aesthetic\":\"color\",\n",
       "\"scale_mapper_kind\":\"color_brewer\",\n",
       "\"palette\":\"Set1\",\n",
       "\"type\":\"qual\"\n",
       "},{\n",
       "\"aesthetic\":\"fill\",\n",
       "\"scale_mapper_kind\":\"color_brewer\",\n",
       "\"palette\":\"Set1\",\n",
       "\"type\":\"qual\"\n",
       "}],\n",
       "\"layers\":[{\n",
       "\"mapping\":{\n",
       "\"color\":\"@as_discrete@cyl\",\n",
       "\"fill\":\"@as_discrete@cyl\"\n",
       "},\n",
       "\"stat\":\"dotplot\",\n",
       "\"position\":\"identity\",\n",
       "\"binwidth\":2.0,\n",
       "\"geom\":\"dotplot\",\n",
       "\"data_meta\":{\n",
       "\"mapping_annotations\":[{\n",
       "\"aes\":\"color\",\n",
       "\"annotation\":\"as_discrete\",\n",
       "\"parameters\":{\n",
       "\"label\":\"cyl\"\n",
       "}\n",
       "},{\n",
       "\"aes\":\"fill\",\n",
       "\"annotation\":\"as_discrete\",\n",
       "\"parameters\":{\n",
       "\"label\":\"cyl\"\n",
       "}\n",
       "}],\n",
       "\"series_annotations\":[{\n",
       "\"column\":\"cyl\",\n",
       "\"factor_levels\":[6.0,5.0,8.0,4.0]\n",
       "}]\n",
       "},\n",
       "\"data\":{\n",
       "\"@as_discrete@cyl\":[4.0,4.0,4.0,4.0,4.0,5.0,6.0,6.0,6.0,6.0,8.0,8.0,8.0,8.0,8.0,8.0,8.0],\n",
       "\"..binwidth..\":[2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0],\n",
       "\"..count..\":[1.0,3.0,3.0,2.0,1.0,1.0,3.0,1.0,3.0,3.0,1.0,1.0,3.0,3.0,1.0,1.0,1.0],\n",
       "\"cyl\":[4.0,4.0,4.0,4.0,4.0,5.0,6.0,6.0,6.0,6.0,8.0,8.0,8.0,8.0,8.0,8.0,8.0],\n",
       "\"hwy\":[20.0,25.5,27.0,29.0,31.0,29.0,17.5,19.0,24.5,26.0,12.0,14.0,16.5,18.5,21.0,24.0,26.0]\n",
       "}\n",
       "}],\n",
       "\"theme\":{\n",
       "\"name\":\"grey\"\n",
       "},\n",
       "\"facet\":{\n",
       "\"name\":\"grid\",\n",
       "\"x\":\"cyl\",\n",
       "\"x_order\":1.0,\n",
       "\"y_order\":1.0\n",
       "}\n",
       "};\n",
       "           var plotContainer = document.getElementById(\"HJRYjU\");\n",
       "           window.letsPlotCall(function() {{\n",
       "               LetsPlot.buildPlotFromProcessedSpecs(plotSpec, -1, -1, plotContainer);\n",
       "           }});\n",
       "       })();    \n",
       "   </script>"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "plotBase2 + geomDotplot(binWidth = 2) {\n",
    "        color = asDiscrete(\"cyl\")\n",
    "        fill = asDiscrete(\"cyl\")\n",
    "    } + facetGrid(x = \"cyl\") + ggtitle(\"facetGrid\")\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "defensive-sight",
   "metadata": {},
   "source": [
    "### `coord_flip()`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "straight-acrylic",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "   <div id=\"om8nc2\"></div>\n",
       "   <script type=\"text/javascript\" data-lets-plot-script=\"plot\">\n",
       "       (function() {\n",
       "           var plotSpec={\n",
       "\"mapping\":{\n",
       "\"x\":\"hwy\"\n",
       "},\n",
       "\"coord\":{\n",
       "\"name\":\"flip\",\n",
       "\"flip\":true\n",
       "},\n",
       "\"data\":{\n",
       "},\n",
       "\"kind\":\"plot\",\n",
       "\"scales\":[],\n",
       "\"layers\":[{\n",
       "\"mapping\":{\n",
       "},\n",
       "\"stat\":\"dotplot\",\n",
       "\"position\":\"identity\",\n",
       "\"geom\":\"dotplot\",\n",
       "\"data\":{\n",
       "\"..binwidth..\":[0.6333333333333333,0.6333333333333333,0.6333333333333333,0.6333333333333333,0.6333333333333333,0.6333333333333333,0.6333333333333333,0.6333333333333333,0.6333333333333333,0.6333333333333333,0.6333333333333333,0.6333333333333333,0.6333333333333333,0.6333333333333333],\n",
       "\"..count..\":[1.0,1.0,1.0,4.0,2.0,3.0,1.0,1.0,3.0,3.0,5.0,3.0,3.0,1.0],\n",
       "\"hwy\":[12.0,14.0,16.0,17.0,18.0,19.0,20.0,21.0,24.0,25.0,26.0,27.0,29.0,31.0]\n",
       "}\n",
       "}]\n",
       "};\n",
       "           var plotContainer = document.getElementById(\"om8nc2\");\n",
       "           window.letsPlotCall(function() {{\n",
       "               LetsPlot.buildPlotFromProcessedSpecs(plotSpec, -1, -1, plotContainer);\n",
       "           }});\n",
       "       })();    \n",
       "   </script>"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "letsPlot(mpg32.toMap()) {x = \"hwy\"} +\n",
    "    geomDotplot() + coordFlip()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "happy-isolation",
   "metadata": {},
   "source": [
    "### \"identity\" statistic"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "french-mount",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Line_47.jupyter.kts (7:30 - 34) Cannot find a parameter with this name: stat"
     ]
    }
   ],
   "source": [
    "val data = mapOf(\n",
    "    \"x\" to listOf(0.5, 1.5, 2.5, null),\n",
    "    \"count\" to listOf(0, 3, null, 0),\n",
    "    \"binwidth\" to listOf(.5, .5, .5, .5),\n",
    ")\n",
    "\n",
    "letsPlot(data) + geomDotplot(stat = Stat.identity) {\n",
    "    x = \"x\"\n",
    "    stackSize = \"count\"\n",
    "    binWidth = \"binwidth\"\n",
    "} + ggtitle(\"stat = Stat.identity\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "purple-buffer",
   "metadata": {},
   "source": [
    "### Dotplot"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "collect-prague",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Line_48.jupyter.kts (9:21 - 25) Cannot find a parameter with this name: size"
     ]
    }
   ],
   "source": [
    "letsPlot(mpg32.toMap()) {x = \"hwy\"} +\n",
    "    geomDotplot(\n",
    "        method = \"histodot\",\n",
    "        bins = 9, \n",
    "        stackDir = \"center\",\n",
    "        stackRatio = 0.8, \n",
    "        dotSize = 0.8,\n",
    "        color = \"black\", \n",
    "        alpha = .5, size = 1\n",
    "    ) {\n",
    "        fill = asDiscrete(\"cyl\")\n",
    "    } + \n",
    "    scaleFillBrewer(palette = \"Set1\") +\n",
    "    themeGrey()"
   ]
  }
 ],
 "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.8.20"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}