{ "cells": [ { "cell_type": "markdown", "id": "1c5474f7-dcb1-41ad-9ede-70a1b146f618", "metadata": {}, "source": [ "# Multiline Axis Labels\n", "\n", "Multiline axis labels allow better visualization of long categorical values. Instead of overcrowding the axis, labels can now be formatted across multiple lines, enhancing readability. \n", "\n", "* To create a multiline axis label, simply add \"\\n\" inside the string where you want the line break." ] }, { "cell_type": "code", "execution_count": 1, "id": "de90a7f0-1e1d-4c26-acc0-8da15c2a96fc", "metadata": {}, "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": [ "import kotlin.random.Random\n", "\n", "%useLatestDescriptors\n", "%use dataframe\n", "%use lets-plot" ] }, { "cell_type": "markdown", "id": "da0c0aa7-62ef-4459-b128-9be1664a0403", "metadata": {}, "source": [ "## Quarters & Years" ] }, { "cell_type": "code", "execution_count": 2, "id": "60243931-5d37-4289-8f35-8c9ae8ca9a2f", "metadata": {}, "outputs": [ { "data": { "application/kotlindataframe+json": "{\"nrow\":4,\"ncol\":3,\"columns\":[\"Quarter_Year\",\"Type\",\"Amount\"],\"kotlin_dataframe\":[{\"Quarter_Year\":\"Q1-2022\",\"Type\":\"Income\",\"Amount\":15425},{\"Quarter_Year\":\"Q1-2022\",\"Type\":\"Expenses\",\"Amount\":7232},{\"Quarter_Year\":\"Q2-2022\",\"Type\":\"Income\",\"Amount\":13012},{\"Quarter_Year\":\"Q2-2022\",\"Type\":\"Expenses\",\"Amount\":8337}]}", "text/html": [ " \n", " \n", " \n", " \n", " \n", "
\n", "\n", "

DataFrame: rowsCount = 4, columnsCount = 3

\n", "
Quarter_YearTypeAmount
Q1-2022Income15425
Q1-2022Expenses7232
Q2-2022Income13012
Q2-2022Expenses8337
\n", " \n", " \n", " " ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "// Create a DataFrame with artificial income and expenses\n", "val years = listOf(2022, 2023, 2024)\n", "val quarters = listOf(\"Q1\", \"Q2\", \"Q3\", \"Q4\")\n", "\n", "val quarterYears = mutableListOf()\n", "val types = mutableListOf()\n", "val amounts = mutableListOf()\n", "\n", "for (year in years) {\n", " val baseIncome = Random.nextInt(5000, 15000)\n", " val baseExpenses = baseIncome * Random.nextDouble(0.6, 0.9)\n", " \n", " for (quarter in quarters) {\n", " val income = baseIncome + Random.nextInt(-2000, 2000)\n", " val expenses = baseExpenses + Random.nextInt(-1500, 1500)\n", " val quarterYear = \"$quarter-$year\"\n", " \n", " quarterYears.add(quarterYear)\n", " types.add(\"Income\")\n", " amounts.add(income.toInt())\n", " \n", " quarterYears.add(quarterYear)\n", " types.add(\"Expenses\")\n", " amounts.add(expenses.toInt())\n", " }\n", "}\n", "\n", "val df = dataFrameOf(\"Quarter_Year\" to quarterYears, \"Type\" to types, \"Amount\" to amounts)\n", "df.head(4)" ] }, { "cell_type": "code", "execution_count": 3, "id": "91397a5c-5128-4e5f-8789-1860838d867e", "metadata": {}, "outputs": [], "source": [ "// Multiline labels for X-axis\n", "val xLabelsMapping = years.flatMap { year ->\n", " quarters.map { quarter -> if (quarter == \"Q1\") \"$quarter\\n$year\" else quarter }\n", "}" ] }, { "cell_type": "code", "execution_count": 4, "id": "228eb185-bdf6-4075-b928-d910b4bf8217", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", " " ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/plot+json": { "apply_color_scheme": true, "output": { "data": { "Amount": [ 15425, 7232, 13012, 8337, 12547, 8680, 15877, 8348, 6557, 6358, 5930, 6412, 4462, 6108, 6076, 6687, 7054, 6273, 8946, 8212, 9370, 7842, 8567, 8284 ], "Quarter_Year": [ "Q1-2022", "Q1-2022", "Q2-2022", "Q2-2022", "Q3-2022", "Q3-2022", "Q4-2022", "Q4-2022", "Q1-2023", "Q1-2023", "Q2-2023", "Q2-2023", "Q3-2023", "Q3-2023", "Q4-2023", "Q4-2023", "Q1-2024", "Q1-2024", "Q2-2024", "Q2-2024", "Q3-2024", "Q3-2024", "Q4-2024", "Q4-2024" ], "Type": [ "Income", "Expenses", "Income", "Expenses", "Income", "Expenses", "Income", "Expenses", "Income", "Expenses", "Income", "Expenses", "Income", "Expenses", "Income", "Expenses", "Income", "Expenses", "Income", "Expenses", "Income", "Expenses", "Income", "Expenses" ] }, "data_meta": { "series_annotations": [ { "column": "Quarter_Year", "type": "str" }, { "column": "Type", "type": "str" }, { "column": "Amount", "type": "int" } ] }, "ggtitle": { "text": "Quarterly Income vs Expenses" }, "guides": { "x": { "title": "Quarters" }, "y": { "title": "Amount ($)" } }, "kind": "plot", "layers": [ { "geom": "line", "mapping": {}, "position": "identity", "size": 1.5, "stat": "identity" }, { "geom": "point", "mapping": {}, "position": "identity", "size": 4, "stat": "identity" } ], "mapping": { "color": "Type", "x": "Quarter_Year", "y": "Amount" }, "scales": [ { "aesthetic": "x", "discrete": true, "labels": [ "Q1\n2022", "Q2", "Q3", "Q4", "Q1\n2023", "Q2", "Q3", "Q4", "Q1\n2024", "Q2", "Q3", "Q4" ] } ], "theme": { "axis_text_x": { "angle": 30, "blank": false } } }, "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " Q1\n", " \n", " \n", " 2022\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " Q2\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " Q3\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " Q4\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " Q1\n", " \n", " \n", " 2023\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " Q2\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " Q3\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " Q4\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " Q1\n", " \n", " \n", " 2024\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " Q2\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " Q3\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " Q4\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " 4,000\n", " \n", " \n", " \n", " \n", " \n", " \n", " 6,000\n", " \n", " \n", " \n", " \n", " \n", " \n", " 8,000\n", " \n", " \n", " \n", " \n", " \n", " \n", " 10,000\n", " \n", " \n", " \n", " \n", " \n", " \n", " 12,000\n", " \n", " \n", " \n", " \n", " \n", " \n", " 14,000\n", " \n", " \n", " \n", " \n", " \n", " \n", " 16,000\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " Quarterly Income vs Expenses\n", " \n", " \n", " \n", " \n", " Amount ($)\n", " \n", " \n", " \n", " \n", " Quarters\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " Type\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " Income\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " Expenses\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n", " " ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "letsPlot(df.toMap()) {\n", " x = \"Quarter_Year\"\n", " y = \"Amount\"\n", " color = \"Type\"\n", "} +\n", " geomLine(size = 1.5) +\n", " geomPoint(size = 4.0) +\n", " scaleXDiscrete(labels = xLabelsMapping) +\n", " ggtitle(\"Quarterly Income vs Expenses\") +\n", " xlab(\"Quarters\") +\n", " ylab(\"Amount ($)\") +\n", " theme(axisTextX = elementText(angle = 30))" ] } ], "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 }