{ "cells": [ { "cell_type": "markdown", "id": "89375319-5ac5-40e0-a8af-eae13ccf07aa", "metadata": {}, "source": [ "# Sunshine Hours" ] }, { "cell_type": "code", "execution_count": 1, "id": "cdd6cc17-7f95-4692-b36d-4f0ec4234e05", "metadata": { "execution": { "iopub.execute_input": "2025-03-21T16:08:36.073646Z", "iopub.status.busy": "2025-03-21T16:08:36.071475Z", "iopub.status.idle": "2025-03-21T16:08:38.652755Z", "shell.execute_reply": "2025-03-21T16:08:38.652457Z" } }, "outputs": [ { "data": { "text/html": [ "
\n", " " ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ " " ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n", " " ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n", " " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%useLatestDescriptors\n", "%use dataframe\n", "%use lets-plot" ] }, { "cell_type": "code", "execution_count": 2, "id": "913838dd-ad3c-4657-a5d7-42ef00972d1e", "metadata": { "execution": { "iopub.execute_input": "2025-03-21T16:08:38.654846Z", "iopub.status.busy": "2025-03-21T16:08:38.654370Z", "iopub.status.idle": "2025-03-21T16:08:39.587113Z", "shell.execute_reply": "2025-03-21T16:08:39.586556Z" } }, "outputs": [ { "data": { "application/kotlindataframe+json": "{\"nrow\":3,\"ncol\":6,\"columns\":[\"Country\",\"City\",\"Year\",\"Month\",\"Sunshine hours\",\"Angle\"],\"kotlin_dataframe\":[{\"Country\":\"Spain\",\"City\":\"Barcelona\",\"Year\":2591.0,\"Month\":\"JAN\",\"Sunshine hours\":158.0,\"Angle\":-15.0},{\"Country\":\"Spain\",\"City\":\"Barcelona\",\"Year\":2591.0,\"Month\":\"FEB\",\"Sunshine hours\":171.0,\"Angle\":-45.0},{\"Country\":\"Spain\",\"City\":\"Barcelona\",\"Year\":2591.0,\"Month\":\"MAR\",\"Sunshine hours\":206.0,\"Angle\":-75.0}]}", "text/html": [ " \n", " \n", " \n", " \n", " \n", "
\n", "\n", "

DataFrame: rowsCount = 3, columnsCount = 6

\n", "
CountryCityYearMonthSunshine hoursAngle
SpainBarcelona2591.000000JAN158.000000-15.000000
SpainBarcelona2591.000000FEB171.000000-45.000000
SpainBarcelona2591.000000MAR206.000000-75.000000
\n", " \n", " \n", " " ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "val shift = 15.0\n", "val targetCities = listOf(\"Barcelona\", \"New York City\", \"Lyon\", \"Paris\", \"Amsterdam\", \"Berlin\")\n", "val angles = mapOf(\n", " \"Jan\" to -shift, \"Feb\" to -30 - shift, \"Mar\" to -60 - shift, \"Apr\" to 90 - shift, \"May\" to 60 - shift, \"Jun\" to 30 - shift,\n", " \"Jul\" to -shift, \"Aug\" to -30 - shift, \"Sep\" to -60 - shift, \"Oct\" to 90 - shift, \"Nov\" to 60 - shift, \"Dec\" to 30 - shift,\n", ")\n", "val df = DataFrame.readCSV(\"https://raw.githubusercontent.com/JetBrains/lets-plot-docs/master/data/sunshine_hours.csv\")\n", " .filter { \"City\"() in targetCities }\n", " .gather(\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\")\n", " .into(\"Month\", \"Sunshine hours\")\n", " .add(\"Angle\") { angles[\"Month\"()] }\n", " .update { \"Month\"() }.with { it.uppercase() }\n", " .add(\"Id\") { targetCities.indexOf(\"City\"()) }.sortBy(\"Id\").remove(\"Id\")\n", "val dataMap = df.toMap()\n", "df.head(3)" ] }, { "cell_type": "code", "execution_count": 3, "id": "fd65e943-652f-42b8-b26b-3d763476d554", "metadata": { "execution": { "iopub.execute_input": "2025-03-21T16:08:39.589771Z", "iopub.status.busy": "2025-03-21T16:08:39.589123Z", "iopub.status.idle": "2025-03-21T16:08:40.081084Z", "shell.execute_reply": "2025-03-21T16:08:40.080921Z" } }, "outputs": [ { "data": { "text/html": [ "
\n", " " ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/plot+json": { "apply_color_scheme": true, "output": { "caption": { "text": "Sunshine duration is expressed in (average) hours per month\nData source: sunshine hours for cities around the world\nOriginal plot: Giulia Mezzadri, PhD's Post" }, "coord": { "name": "polar", "start": 0.2617993877991494 }, "data": { "Angle": [ -15.0, -45.0, -75.0, 75.0, 45.0, 15.0, -15.0, -45.0, -75.0, 75.0, 45.0, 15.0, -15.0, -45.0, -75.0, 75.0, 45.0, 15.0, -15.0, -45.0, -75.0, 75.0, 45.0, 15.0, -15.0, -45.0, -75.0, 75.0, 45.0, 15.0, -15.0, -45.0, -75.0, 75.0, 45.0, 15.0, -15.0, -45.0, -75.0, 75.0, 45.0, 15.0, -15.0, -45.0, -75.0, 75.0, 45.0, 15.0, -15.0, -45.0, -75.0, 75.0, 45.0, 15.0, -15.0, -45.0, -75.0, 75.0, 45.0, 15.0, -15.0, -45.0, -75.0, 75.0, 45.0, 15.0, -15.0, -45.0, -75.0, 75.0, 45.0, 15.0 ], "City": [ "Barcelona", "Barcelona", "Barcelona", "Barcelona", "Barcelona", "Barcelona", "Barcelona", "Barcelona", "Barcelona", "Barcelona", "Barcelona", "Barcelona", "New York City", "New York City", "New York City", "New York City", "New York City", "New York City", "New York City", "New York City", "New York City", "New York City", "New York City", "New York City", "Lyon", "Lyon", "Lyon", "Lyon", "Lyon", "Lyon", "Lyon", "Lyon", "Lyon", "Lyon", "Lyon", "Lyon", "Paris", "Paris", "Paris", "Paris", "Paris", "Paris", "Paris", "Paris", "Paris", "Paris", "Paris", "Paris", "Amsterdam", "Amsterdam", "Amsterdam", "Amsterdam", "Amsterdam", "Amsterdam", "Amsterdam", "Amsterdam", "Amsterdam", "Amsterdam", "Amsterdam", "Amsterdam", "Berlin", "Berlin", "Berlin", "Berlin", "Berlin", "Berlin", "Berlin", "Berlin", "Berlin", "Berlin", "Berlin", "Berlin" ], "Country": [ "Spain", "Spain", "Spain", "Spain", "Spain", "Spain", "Spain", "Spain", "Spain", "Spain", "Spain", "Spain", "United States", "United States", "United States", "United States", "United States", "United States", "United States", "United States", "United States", "United States", "United States", "United States", "France", "France", "France", "France", "France", "France", "France", "France", "France", "France", "France", "France", "France", "France", "France", "France", "France", "France", "France", "France", "France", "France", "France", "France", "Netherlands", "Netherlands", "Netherlands", "Netherlands", "Netherlands", "Netherlands", "Netherlands", "Netherlands", "Netherlands", "Netherlands", "Netherlands", "Netherlands", "Germany", "Germany", "Germany", "Germany", "Germany", "Germany", "Germany", "Germany", "Germany", "Germany", "Germany", "Germany" ], "Month": [ "JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC", "JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC", "JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC", "JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC", "JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC", "JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC" ], "Sunshine hours": [ 158.0, 171.0, 206.0, 239.0, 258.0, 287.0, 293.0, 264.0, 229.0, 196.0, 153.0, 137.0, 162.7, 163.1, 212.5, 225.6, 256.6, 257.3, 268.2, 268.2, 219.3, 211.2, 151.0, 139.0, 74.0, 101.0, 170.0, 191.0, 221.0, 254.0, 283.0, 253.0, 195.0, 130.0, 76.0, 54.0, 63.0, 79.0, 129.0, 166.0, 194.0, 202.0, 212.0, 212.0, 168.0, 118.0, 68.0, 51.0, 63.0, 88.0, 126.0, 183.0, 222.0, 206.0, 217.0, 197.0, 139.0, 109.0, 62.0, 51.0, 47.0, 74.0, 121.0, 159.0, 220.0, 222.0, 217.0, 211.0, 156.0, 112.0, 51.0, 37.0 ], "Year": [ 2591.0, 2591.0, 2591.0, 2591.0, 2591.0, 2591.0, 2591.0, 2591.0, 2591.0, 2591.0, 2591.0, 2591.0, 2534.7, 2534.7, 2534.7, 2534.7, 2534.7, 2534.7, 2534.7, 2534.7, 2534.7, 2534.7, 2534.7, 2534.7, 2002.0, 2002.0, 2002.0, 2002.0, 2002.0, 2002.0, 2002.0, 2002.0, 2002.0, 2002.0, 2002.0, 2002.0, 1662.0, 1662.0, 1662.0, 1662.0, 1662.0, 1662.0, 1662.0, 1662.0, 1662.0, 1662.0, 1662.0, 1662.0, 1662.0, 1662.0, 1662.0, 1662.0, 1662.0, 1662.0, 1662.0, 1662.0, 1662.0, 1662.0, 1662.0, 1662.0, 1626.0, 1626.0, 1626.0, 1626.0, 1626.0, 1626.0, 1626.0, 1626.0, 1626.0, 1626.0, 1626.0, 1626.0 ] }, "data_meta": { "series_annotations": [ { "column": "Month", "factor_levels": [ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" ], "type": "str" }, { "column": "Country", "type": "str" }, { "column": "City", "type": "str" }, { "column": "Year", "type": "float" }, { "column": "Sunshine hours", "type": "float" }, { "column": "Angle", "type": "float" } ] }, "facet": { "dir": "h", "facets": "City", "name": "wrap" }, "ggsize": { "height": 850.0, "width": 1000.0 }, "ggtitle": { "text": "Comparing Sunshine Hours" }, "kind": "plot", "layers": [ { "angle": -15.0, "data": { "text": [ "100.0", "200.0" ], "x": [ "JAN", "JAN" ], "y": [ 100.0, 200.0 ] }, "data_meta": { "series_annotations": [ { "column": "x", "type": "str" }, { "column": "y", "type": "float" }, { "column": "text", "type": "str" } ] }, "family": "ParaType", "fontface": "bold", "geom": "text", "mapping": { "label": "text", "x": "x", "y": "y" }, "position": "identity", "size": 6.0, "stat": "identity", "vjust": 0.0 }, { "color": "black", "fill": "#fbc117", "geom": "bar", "mapping": {}, "position": "stack", "stat": "identity", "tooltips": { "lines": [ "@Month: @{Sunshine hours}" ], "title": "@City" } }, { "family": "ParaType", "fill": "#fcf3e4", "fontface": "bold", "geom": "label", "label_padding": 0.0, "label_r": 0.0, "label_size": 0.0, "mapping": { "angle": "Angle", "label": "Month", "x": "Month" }, "position": "identity", "size": 8.0, "stat": "identity", "y": 330.0 } ], "mapping": { "x": "Month", "y": "Sunshine hours" }, "scales": [], "theme": { "axis": "blank", "panel_grid": { "blank": false, "color": "#ccc2a2", "size": 2.0 }, "plot_background": { "blank": false, "fill": "#fcf3e4" }, "plot_caption": { "blank": false, "face": "bold", "family": "ParaType" }, "plot_title": { "blank": false, "face": "bold", "family": "ParaType", "margin": [ 20.0, 20.0, 30.0 ], "size": 32.0 }, "strip_text": { "blank": false, "face": "bold", "family": "ParaType", "size": 20.0 } } }, "output_type": "lets_plot_spec", "swing_enabled": true }, "text/html": [ "
\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " 100.0\n", " \n", " \n", " \n", " \n", " \n", " \n", " 200.0\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " JAN\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " FEB\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " MAR\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " APR\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " MAY\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " JUN\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " JUL\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " AUG\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " SEP\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " OCT\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " NOV\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " DEC\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " Barcelona\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " 100.0\n", " \n", " \n", " \n", " \n", " \n", " \n", " 200.0\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " JAN\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " FEB\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " MAR\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " APR\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " MAY\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " JUN\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " JUL\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " AUG\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " SEP\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " OCT\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " NOV\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " DEC\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " New York City\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " 100.0\n", " \n", " \n", " \n", " \n", " \n", " \n", " 200.0\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " JAN\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " FEB\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " MAR\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " APR\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " MAY\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " JUN\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " JUL\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " AUG\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " SEP\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " OCT\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " NOV\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " DEC\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " Lyon\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " 100.0\n", " \n", " \n", " \n", " \n", " \n", " \n", " 200.0\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " JAN\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " FEB\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " MAR\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " APR\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " MAY\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " JUN\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " JUL\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " AUG\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " SEP\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " OCT\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " NOV\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " DEC\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " Paris\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " 100.0\n", " \n", " \n", " \n", " \n", " \n", " \n", " 200.0\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " JAN\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " FEB\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " MAR\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " APR\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " MAY\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " JUN\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " JUL\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " AUG\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " SEP\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " OCT\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " NOV\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " DEC\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " Amsterdam\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " 100.0\n", " \n", " \n", " \n", " \n", " \n", " \n", " 200.0\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " JAN\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " FEB\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " MAR\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " APR\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " MAY\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " JUN\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " JUL\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " AUG\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " SEP\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " OCT\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " NOV\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " DEC\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " Berlin\n", " \n", " \n", " \n", " \n", " \n", " Comparing Sunshine Hours\n", " \n", " \n", " \n", " \n", " Sunshine duration is expressed in (average) hours per month\n", " \n", " \n", " Data source: sunshine hours for cities around the world\n", " \n", " \n", " Original plot: Giulia Mezzadri, PhD's Post\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n", " " ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "val fontFamily = \"ParaType\"\n", "val fontFace = \"bold\"\n", "val backgroundColor = \"#fcf3e4\"\n", "val gridColor = \"#ccc2a2\"\n", "\n", "val yBreaks = listOf(100.0, 200.0)\n", "val yBreaksData = mapOf(\n", " \"x\" to List(yBreaks.size) { \"JAN\" },\n", " \"y\" to yBreaks,\n", " \"text\" to yBreaks.map(Any::toString),\n", ")\n", "\n", "letsPlot(dataMap) { x = asDiscrete(\"Month\", levels = angles.keys.toList()); y = \"Sunshine hours\" } +\n", " geomText(data = yBreaksData, size = 6, vjust = 0,\n", " angle = -shift, family = fontFamily, fontface = fontFace)\n", " { x = \"x\"; y = \"y\"; label = \"text\" } +\n", " geomBar(stat = Stat.identity, color = \"black\", fill = \"#fbc117\",\n", " tooltips = layerTooltips().title(\"@City\").line(\"@Month: @{Sunshine hours}\")) +\n", " geomLabel(y = 330, family = fontFamily, fontface = fontFace, size = 8,\n", " labelPadding = 0, labelR = 0, labelSize = 0, fill = backgroundColor)\n", " { x = \"Month\"; label = \"Month\"; angle = \"Angle\" } +\n", " facetWrap(facets = \"City\", order = null) +\n", " coordPolar(start = PI * shift / 180) +\n", " labs(title = \"Comparing Sunshine Hours\",\n", " caption = \"Sunshine duration is expressed in (average) hours per month\\n\" +\n", " \"Data source: \" +\n", " \"\" +\n", " \"sunshine hours for cities around the world\" +\n", " \"\\n\" +\n", " \"Original plot: \" +\n", " \"\" +\n", " \"Giulia Mezzadri, PhD's Post\" +\n", " \"\") +\n", " ggsize(1000, 850) +\n", " theme(axis = \"blank\",\n", " plotTitle = elementText(size = 32, family = fontFamily, face = fontFace, margin = listOf(20, 20, 30)),\n", " plotCaption = elementText(family = fontFamily, face = fontFace),\n", " stripText = elementText(size = 20, family = fontFamily, face = fontFace),\n", " plotBackground = elementRect(fill = backgroundColor),\n", " panelGrid = elementLine(color = gridColor, size = 2))" ] } ], "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.9.23" } }, "nbformat": 4, "nbformat_minor": 5 }