diff --git a/README.md b/README.md index 4532bdb..ef34bcf 100644 --- a/README.md +++ b/README.md @@ -22,6 +22,22 @@ The `plotLaTeX` package is a recent project to make exporting Python data to a L Fig3

+**[Barplot](examples/BarPlot.ipynb)** + +

+ Fig4 +

+

+ Fig5 +

+

+ Fig6 +

+ +**TBD** + +- 3D scatter + ## Installation diff --git a/examples/BarPlot.ipynb b/examples/BarPlot.ipynb new file mode 100644 index 0000000..66d4368 --- /dev/null +++ b/examples/BarPlot.ipynb @@ -0,0 +1,524 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "0e5d95f5-b33e-4d68-8abd-9a8a762e4d37", + "metadata": {}, + "source": [ + "# Bar plots" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "43f2ed36-7d0f-41dc-b199-2991b366cdad", + "metadata": {}, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "import pandas as pd" + ] + }, + { + "cell_type": "markdown", + "id": "3757fb5d-c0fa-4a84-b7d4-659e184aa65b", + "metadata": {}, + "source": [ + "## Barplot" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "eccc6618-bdcd-4c16-99ed-56c45e548b9c", + "metadata": {}, + "outputs": [], + "source": [ + "from plotLaTeX import Barplot" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "3818906f-0d4e-473f-92e3-1a814c024319", + "metadata": {}, + "outputs": [], + "source": [ + "# create data\n", + "fruits = [\"Apples\", \"Bananas\", \"Cherries\"]\n", + "sales = [345, 234, 512]" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "ed6738e9-ef28-4d8f-8942-916df31ca3a1", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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pksBUE8ee+wxORwO+6d58+bq37+/vv76a9OlAfABBQUFGjNmjNq2bauAgAC1atVKAwYMUFZWlpF6nn76aWNj+zICeQOycOFCjRkzRps3b9bhw4dNlwOgnvTv319HjhzRkSNHlJWVpUaNGum+++4zXRYAww4ePKj4+Hht2LBBL730knbv3q21a9eqd+/eSk1NvWLjVlRUVGqzLEtnzpxRSEiImjdvfsXGvloRyBuIkydP6v3339fo0aOVkpKixYsX2/s2btwoh8Ohjz/+WF27dlVgYKASEhL0zTff2H0WL16ssLAwrVq1Su3bt1dgYKCSkpJ06NChS467YMECde7cWYGBgerUqZPeeOMNe19FRYXS0tIUExOjwMBAxcbGaubMmXV+7sC1LiAgQNHR0YqOjlb37t01YcIEHTp0SMeOHZMkPfvss+rQoYOCgoLUtm1bPf/88zp9+rR9+/MvIb/99ttq06aNQkND9fDDD+vEiRN2n7Vr1+qOO+5QWFiYmjdvrvvuu0/ff/+9vf/gwYNyOBz68MMP1bt3bwUFBalbt27Kzs62+/z8888aOnSofvOb3ygoKEhdunTRe++953UuK1euVJcuXdSkSRM1b95ciYmJOnXq1JW664AG7V/+5V/kcDi0Y8cODR48WB06dNANN9yg9PR0bdu2ze73008/6YEHHlBQUJDat2+vv/71r17H+eabb5ScnKyQkBBFRUVp+PDh+umnn+z9d999t9LS0jR27Fi1aNFCSUlJdvb45JNPFB8fr4CAAH355ZdVXrJCliCQNxgffPCBOnXqpI4dO+qRRx7RW2+9pV9+ouX48eP18ssva+fOnYqIiNCAAQO8npT/8Y9/aMaMGVq6dKm2bNmi4uJiPfzwwxcd891339XkyZM1Y8YM7du3T3/605/0/PPPa8mSJZKkuXPn6q9//as++OAD5eXl6d1331WbNm2uyPkDOOfkyZN655131K5dO3sVqmnTplq8eLH27t2r1157TfPnz9err77qdbvvv/9eq1atUmZmpjIzM7Vp0ybNmjXL3n/q1Cmlp6dr165dysrKktPp1AMPPCCPx+N1nOeee05PP/20cnNz1aFDBw0dOlRnzpyRJJWVlSk+Pl4ff/yxvvnmGz3xxBMaPny4duzYIUk6cuSIhg4dqt///vfat2+fNm7cqEGDBlWaywBc3vHjx7V27VqlpqYqODi40v6wsDD731OnTtVDDz2kr7/+Wvfee6+GDRum48ePS5KKi4vVp08f9ejRQ7t27dLatWtVWFiohx56yOt4S5Yskb+/v7Zs2aI333zTbp8wYYJmzZqlffv2qWvXrpXqIEv8HwsNwm233WbNmTPHsizLOn36tNWiRQvr888/tyzLsj7//HNLkrV8+XK7/88//2w1adLEev/99y3LsqxFixZZkqxt27bZffbt22dJsrZv325ZlmW98MILVrdu3ez9v/3tb61ly5Z51TF9+nTL7XZblmVZY8aMsfr06WN5PJ46P18A54wYMcLy8/OzgoODreDgYEuSFRMTY+Xk5Fz0Ni+99JIVHx9vb7/wwgtWUFCQVVpaareNHz/e6tmz50WPcezYMUuStXv3bsuyLOvAgQOWJGvBggV2nz179liSrH379l30OCkpKdZTTz1lWZZl5eTkWJKsgwcPXv7EAVzS9u3bLUnWhx9+eMl+kqxJkybZ2ydPnrQkWZ988ollWeee1/v16+d1m0OHDlmSrLy8PMuyLOuuu+6yevTo4dXnfPZYtWqVVztZomqskDcAeXl52rFjh4YOHSpJatSokYYMGaKFCxd69XO73fa/w8PD1bFjR+3bt89ua9SokW655RZ7u1OnTgoLC/Pqc96pU6f0/fffa9SoUQoJCbF/XnzxRftl7Mcee0y5ubnq2LGjnnzySa1bt65OzxvAOb1791Zubq5yc3O1Y8cOJSUlKTk5Wf/1X/8lSXr//fd1++23Kzo6WiEhIZo0aZLy8/O9jtGmTRs1bdrU3o6JidHRo0ft7W+//VZDhw5V27Zt5XK57BWqXx7nwhWwmJgYSbKPc/bsWU2fPl1dunRReHi4QkJC9Omnn9rH6Natm/r27asuXbrod7/7nebPn6+ioqI6upeAa4tVg1eWLnzcBgcHy+Vy2Y/bv/3tb/r888+9nus7deokSV6XrcXHx1d57Jtvvvmi45Il/l8j0wXg11u4cKHOnDmjli1b2m2WZSkgIECvv/76FRnz5MmTkqT58+erZ8+eXvv8/PwkSTfddJMOHDigTz75RJ999pkeeughJSYmauXKlVekJuBaFRwcrHbt2tnbCxYsUGhoqObPn6+UlBQNGzZMU6dOVVJSkkJDQ7V8+XK9/PLLXsdo3Lix17bD4fC6HGXAgAGKjY3V/Pnz1bJlS3k8Ht14442V3rx14XEcDock2cd56aWX9Nprr2nOnDnq0qWLgoODNXbsWPsYfn5+Wr9+vbZu3ap169bpz3/+s5577jlt375d119/fR3cU8C1o3379nI4HNq/f/9l+17q8X/y5EkNGDBA//qv/1rpduf/6JZU5WUxl2o/f2yJLCERyK96Z86c0dKlS/Xyyy+rX79+XvsGDhyo9957z/5Ldtu2bWrdurUkqaioSH//+9/VuXNnr2Pt2rVLt956q6RzK+/FxcVefc6LiopSy5Yt9cMPP2jYsGEXrc/lcmnIkCEaMmSIHnzwQfXv31/Hjx9XeHj4rz53AFVzOBxyOp36n//5H23dulWxsbF67rnn7P3nV86r6+eff1ZeXp7mz5+vXr16SZK+/PLLGte1ZcsW3X///XrkkUcknQvqf//73xUXF+dV++23367bb79dkydPVmxsrD766COlp6fXeDzgWhYeHq6kpCRlZGToySefrBSMi4uLva4jv5ibbrpJ//Ef/6E2bdqoUaO6jY1kif9HIL/KZWZmqqioSKNGjVJoaKjXvsGDB2vhwoV66aWXJEnTpk1T8+bNFRUVpeeee04tWrTQwIED7f6NGzfWmDFjNHfuXDVq1EhpaWlKSEiwA/ovTZ06VU8++aRCQ0PVv39/lZeXa9euXSoqKlJ6erpeeeUVxcTEqEePHnI6nVqxYoWio6OrNQEAqL7y8nIVFBRIOvfH9uuvv26vapWWlio/P1/Lly/XLbfcoo8//lgfffRRjY7frFkzNW/eXH/5y18UExOj/Px8TZgwocZ1tm/fXitXrtTWrVvVrFkzvfLKKyosLLQD+fbt25WVlaV+/fopMjJS27dv17Fjx6pcFABweRkZGbr99tt16623atq0aeratavOnDmj9evXa968eVVekvpLqampmj9/voYOHapnnnlG4eHh+u6777R8+XItWLDAXsmuLbLEOQTyq9zChQuVmJhYKYxL5wL57Nmz7S8ImTVrlv74xz/q22+/Vffu3bV69Wr5+/vb/YOCgvTss8/qn/7pn/Tjjz+qV69ela5Dv9A///M/KygoSC+99JLGjx+v4OBgdenSRWPHjpV07pMdZs+erW+//VZ+fn665ZZbtGbNGjmdvHUBqEtr1661Xzpu2rSpOnXqpBUrVujuu++WJI0bN05paWkqLy9XSkqKnn/+eU2ZMqXax3c6nVq+fLmefPJJ3XjjjerYsaPmzp1rH7+6Jk2apB9++EFJSUkKCgrSE088oYEDB6qkpETSuVWwzZs3a86cOSotLVVsbKxefvllJScn12gcAOe0bdtWX331lWbMmKGnnnpKR44cUUREhOLj4zVv3rxqHaNly5basmWLnn32WfXr10/l5eWKjY1V//796+T5nCxxjsOqyVX/uCpt3LhRvXv3VlFR0UX/oly8eLHGjh2r4uLieq0NAADgWtew/rwAAAAArjIEcgAAAMAgLlkBAAAADGKFHAAAADCIQA4AAAAYRCAHAAAADCKQAwAAAAYRyAEAAACDCOQAgFrZuHGjHA4HXygGAL8SgRwArhGPPfaYHA5HpZ/vvvuuVse77bbbdOTIEYWGhko6942/F/s2YADAxTUyXQAAoP70799fixYt8mqLiIjw2q6oqJC/v/9lj+Xv76/o6Og6rQ8ArkWskAPANSQgIEDR0dFeP3379lVaWprGjh2rFi1aKCkpSQcPHpTD4VBubq592+LiYjkcDm3cuFGS9yUrGzdu1MiRI1VSUmKvvE+ZMkWS9MYbb6h9+/YKDAxUVFSUHnzwwfo/cQDwYayQAwC0ZMkSjR49Wlu2bKnV7W+77TbNmTNHkydPVl5eniQpJCREu3bt0pNPPqm3335bt912m44fP64vvviiLksHgKsegRwAriGZmZkKCQmxt5OTkyVJ7du31+zZs+32gwcP1ui4/v7+Cg0NlcPh8LqMJT8/X8HBwbrvvvvUtGlTxcbGqkePHr/uJACggSGQA8A1pHfv3po3b569HRwcrKFDhyo+Pv6KjHfPPfcoNjZWbdu2Vf/+/dW/f3898MADCgoKuiLjAcDViGvIAeAaEhwcrHbt2tk/MTExdvuFnM5zTw+WZdltp0+frvF4TZs21VdffaX33ntPMTExmjx5srp168ZHJQLABQjkAIBKzn/yypEjR+y2C9/gWRV/f3+dPXu2UnujRo2UmJio2bNn6+uvv9bBgwe1YcOGOq0XAK5mXLICAKikSZMmSkhI0KxZs3T99dfr6NGjmjRp0iVv06ZNG508eVJZWVnq1q2bgoKCtGHDBv3www+688471axZM61Zs0Yej0cdO3aspzMBAN/HCjkAoEpvvfWWzpw5o/j4eI0dO1YvvvjiJfvfdttt+sMf/qAhQ4YoIiJCs2fPVlhYmD788EP16dNHnTt31ptvvqn33ntPN9xwQz2dBQD4Pod14QWCAAAAAOoVK+QAAACAQQRyAAAAwCACOQAAAGAQgRwAAAAwiEAOAAAAGEQgBwAAAAwikAMAAAAGEcgBAAAAgwjkAAAAgEEEcgAAAMAgAjkAAABgEIEcAAAAMOh/Ae3Oh30M4kaNAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.figure(figsize=(7.5, 3))\n", + "plt.bar(fruits, sales, width=0.3)\n", + "plt.xlabel(\"Fruits\")\n", + "plt.ylabel(\"Sales\")\n", + "plt.grid(alpha=0.3)\n", + "plt.tight_layout()\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "d017fd28-cf1f-455f-8d98-0dc749f00db7", + "metadata": {}, + "outputs": [ + { + "data": { + "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", + "
categoriessales
0Apples345
1Bananas234
2Cherries512
\n", + "
" + ], + "text/plain": [ + " categories sales\n", + "0 Apples 345\n", + "1 Bananas 234\n", + "2 Cherries 512" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# create a dataframe\n", + "data = {\"categories\": fruits, \"sales\": sales}\n", + "\n", + "df = pd.DataFrame(data)\n", + "df" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "35278478-2171-40d9-b6e1-c788f9961444", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " categories sales\n", + "0 Apples 345\n", + "1 Bananas 234\n", + "2 Cherries 512\n" + ] + } + ], + "source": [ + "barplot = Barplot(df)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "2c4196d3-f8ea-47c0-833c-3a011b628bec", + "metadata": {}, + "outputs": [], + "source": [ + "barplot.add_axis_labels(xlabel=\"Fruits\", ylabel=\"Sales\")" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "b2fcc422-e511-4491-9edf-dfe5482a178b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\tDon´t forget to import the packages:\n", + "\n", + "\\usepackage{graphicx}\n", + "\\usepackage{tikz,pgfplots}\n", + "\\usepgfplotslibrary{statistics}\n", + "\n", + "*\t*********\n", + "\n", + "\\begin{figure}[ht]\n", + " \\centering\n", + " \\tikzstyle{every node}=[font=\\footnotesize]\n", + " \\begin{tikzpicture}\n", + " \\begin{axis}[\n", + " ylabel=Sales,\n", + " xlabel=Fruits,\n", + " xticklabels={Apples,Bananas,Cherries},\n", + " ybar,\n", + " bar width=0.5cm,\n", + " xtick=data,\n", + " width=7.5cm,\n", + " height=3cm,\n", + " at={(0cm,0cm)},\n", + " scale only axis,\n", + " axis background/.style={fill=white},\n", + " grid=both,\n", + " legend columns = 1,\n", + " legend style={at={(1,1.05)}, legend cell align=left, align=left, draw=white!15!black, mark options={draw=none}, anchor=south east},\n", + " ]\n", + "\n", + " \\addplot[fill=black!70!black,opacity=0.7] \n", + " coordinates {(1,345) (2,234) (3,512)};\n", + "\n", + " \\end{axis}\n", + " \\end{tikzpicture}\n", + " \\caption{Caption of the default barchart.}\n", + " \\label{fig:Caption of the default barchart.}\n", + "\\end{figure}\n" + ] + } + ], + "source": [ + "barplot.LaTeXcode()" + ] + }, + { + "cell_type": "markdown", + "id": "55131a72-28d4-4ab7-bfa3-93471bd6c02a", + "metadata": {}, + "source": [ + "## Multiple bar plots" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "26727340-5cda-429b-8d65-d7810a8271e9", + "metadata": {}, + "outputs": [], + "source": [ + "from plotLaTeX import MultipleBars" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "a12bb314-a8b5-4f28-9328-5f7b6ef3e414", + "metadata": {}, + "outputs": [], + "source": [ + "# create data\n", + "categories = [\"Apples\", \"Bananas\", \"Cherries\"]\n", + "sales = {\n", + " \"2022\": [345, 234, 512],\n", + " \"2023\": [420, 304, 412],\n", + " \"2024\": [501, 324, 242],\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "294d1daf-aa8a-4cb4-aa37-d764b228f285", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAuQAAAEiCAYAAACx/cdRAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA660lEQVR4nO3deXRV5b3/8c85CUnIcBISMkBNAhRk0DAYKYk4MKQJiCwpaVUualRaKk2wkJYKFRmlUKyCthGviAwionBRSkAUQUBIAIkXZZKiwsVbyCCQAXozcfbvD1b2z9MEyHDITsL7tVbW4uz9nGd/91l5sj885zn72AzDMAQAAADAEnarCwAAAABuZARyAAAAwEIEcgAAAMBCBHIAAADAQgRyAAAAwEIEcgAAAMBCBHIAAADAQgRyAAAAwEKeVhfQFDidTp0+fVoBAQGy2WxWlwMAAIBmzjAMlZSUqH379rLbrz4HTiCXdPr0aUVGRlpdBgAAAFqY7777TjfddNNV2xDIJQUEBEi6/II5HA6Lq2kZnE6nCgoKFBoaes3/FQJoPhjbQMvDuL4+iouLFRkZaebMqyGQS+YyFYfDQSB3E6fTqdLSUjkcDgY30IIwtoGWh3F9fdVmOTSvOgAAAGAhAjkAAABgIQI5AAAAYCHWkANAE3Lp0iVVVFRYXcYVOZ1OVVRUqLS0tEmvNfXy8mrS9QHADxHIAaAJMAxDubm5KiwstLqUqzIMQ06nUyUlJU36exvsdrs6duwoLy8vq0sBgGsikANAE1AVxsPCwuTr69tkw65hGKqsrJSnp2eTrbHqy97OnDmjqKioJlsnAFQhkAOAxS5dumSG8ZCQEKvLuarmEMglKTQ0VKdPn1ZlZaVatWpldTkAcFUssAMAi1WtGff19bW4kpajaqnKpUuXLK4EAK7N0hnyGTNmaObMmS7bunbtqq+++kqSVFpaqt/97ndavXq1ysrKlJSUpFdeeUXh4eFm+1OnTmncuHH65JNP5O/vr5SUFM2dO1eenkz+A2hemvKMc3PDa4nrocPkjVaXUM3JecOsLgFuYHlqveWWW/Txxx+bj38YpCdOnKiNGzdqzZo1CgwMVFpamkaOHKndu3dLujzzMWzYMEVERCgrK0tnzpzRo48+qlatWulPf/pTo58LAAAAUFeWB3JPT09FRERU215UVKQlS5Zo1apVGjRokCRp6dKl6t69u/bs2aO4uDh99NFHOnLkiD7++GOFh4erd+/emj17tp5++mnNmDGDT9cDAACgybM8kB8/flzt27eXj4+P4uPjNXfuXEVFRSknJ0cVFRVKSEgw23br1k1RUVHKzs5WXFycsrOzFRMT47KEJSkpSePGjdPhw4fVp08fK04JANymsd8ir+vb33PnztW6dev01VdfqXXr1rrjjjv05z//WV27djXbXGv54RdffKF58+Zp165d+v7779WhQwc9+eST+u1vf2v2sW7dOi1atEgHDhxQWVmZbrnlFs2YMUNJSUnuOXEAsJClgbxfv35atmyZunbtqjNnzmjmzJm66667dOjQIeXm5srLy0tBQUEuzwkPD1dubq6ky7cJ+2EYr9pfte9KysrKVFZWZj4uLi6WdPlWWU6n0x2ndsNzOp3m/Yrdoc+bTe8/V//9yH9bXQJaiKrxUvVjpdocv6qNYRjasWOHfvOb36hv376qrKzUM888o8TERB0+fFh+fn6SpAkTJmjTpk169913FRgYqPHjx2vkyJHatWuXJGn//v0KDQ3Vm2++qcjISGVlZenXv/617Ha70tLSJEk7duxQQkKC5syZo6CgIC1dulTDhw/Xnj17apx8qXot+bsOd7LL2vFZE3f8frv7mo3L6vJ6WhrIhw4dav67Z8+e6tevn6Kjo/Xuu++qdevW1+24c+fOrfZhUkkqKChQaWnpdTvujcTpdKqoqEiGYbjl2/K6eHZxQ1XulZ+fb3UJaCEqKirkdDpVWVmpyspKS2u51vENwzDvXGKz2bRhwwaX/YsXL9aPfvQj7du3T3fddZeKior0xhtvaMWKFbr77rslSa+99pp69uyp3bt3q1+/fnr00Udd+oiKilJWVpbWrVunJ598UpL0l7/8xaXNrFmztH79eq1fv14xMTE1nofT6dTZs2e57SHcpnubphfI3XEtcvc1G5eVlJTUuq3lS1Z+KCgoSDfffLO+/vpr/fSnP1V5ebkKCwtdZsnz8vLMNecRERHat2+fSx95eXnmviuZMmWK0tPTzcfFxcWKjIxUaGioHA6HG8/oxuV0OmWz2RQaGuqWwX288rgbqnKvsLAwq0tAC1FaWqqSkhJ5enpafoeo2h7/SiH34sWLki7fB9zT01NffPGFKioqlJSUZPZ96623KioqSvv27VP//v1r7KekpEQh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likoKEjvv/++unTpIh8fHyUlJem777676nFff/11de/eXT4+PurWrZteeeUVc195ebnS0tLUrl07+fj4KDo6WnPnznX7uQPNnbe3tyIiIhQREaHevXtr8uTJ+u6771RQUCBJevrpp3XzzTfL19dXnTp10rPPPquKigrz+VVvQb/55pvq0KGDAgMD9dBDD6mkpMRss3nzZt15550KCgpSSEiI7rvvPn3zzTfm/pMnT8pms2ndunUaOHCgfH191atXL2VnZ5ttzp49q1GjRulHP/qRfH19FRMTo7ffftvlXNauXauYmBi1bt1aISEhSkhI0MWLF6/XSwc0ab/5zW9ks9m0b98+JScn6+abb9Ytt9yi9PR07dmzx2z3/fff62c/+5l8fX3VpUsX/f3vf3fp59ChQxo6dKj8/f0VHh6uRx55RN9//725f8CAAUpLS9OECRPUtm1bJSUlmdf+Dz74QLGxsfL29tauXbtqXLLCtbzhCOSQJL377rvq1q2bunbtqocfflhvvPGG/v2OmJMmTdILL7ygzz77TKGhoRo+fLjLRf1f//qX5syZoxUrVmj37t0qLCzUQw89dMVjvvXWW5o2bZrmzJmjo0eP6k9/+pOeffZZLV++XJL08ssv6+9//7veffddHTt2TG+99ZY6dOhwXc4faCkuXLiglStXqnPnzuYsVkBAgJYtW6YjR47opZde0uLFi7VgwQKX533zzTd6//33lZmZqczMTO3YsUPz5s0z91+8eFHp6enav3+/tm7dKrvdrp/97GdyOp0u/TzzzDP6/e9/rwMHDujmm2/WqFGjVFlZKUkqLS1VbGysNm7cqEOHDmns2LF65JFHtG/fPknSmTNnNGrUKD3xxBM6evSotm/frpEjR1b7WwTcCM6dO6fNmzcrNTVVfn5+1fYHBQWZ/545c6YeeOABffnll7r33ns1evRonTt3TpJUWFioQYMGqU+fPtq/f782b96svLw8PfDAAy79LV++XF5eXtq9e7deffVVc/vkyZM1b948HT16VD179qxWB9dyNzEAwzDuuOMOY+HChYZhGEZFRYXRtm1b45NPPjEMwzA++eQTQ5KxevVqs/3Zs2eN1q1bG++8845hGIaxdOlSQ5KxZ88es83Ro0cNScbevXsNwzCM6dOnG7169TL3//jHPzZWrVrlUsfs2bON+Ph4wzAMY/z48cagQYMMp9Pp9vMFWoqUlBTDw8PD8PPzM/z8/AxJRrt27YycnJwrPuf55583YmNjzcfTp083fH19jeLiYnPbpEmTjH79+l2xj4KCAkOScfDgQcMwDOPEiROGJOP111832xw+fNiQZBw9evSK/QwbNsz43e9+ZxiGYeTk5BiSjJMnT177xIEWbu/evYYkY926dVdtJ8mYOnWq+fjChQuGJOODDz4wDOPydTUxMdHlOd99950hyTh27JhhGIZxzz33GH369HFpU3Xtf//99122cy2/Ppghh44dO6Z9+/Zp1KhRkiRPT089+OCDWrJkiUu7+Ph489/BwcHq2rWrjh49am7z9PRU3759zcfdunVTUFCQS5sqFy9e1DfffKMxY8bI39/f/HnuuefMt8Efe+wxHThwQF27dtVTTz2ljz76yK3nDbQUAwcO1IEDB3TgwAHt27dPSUlJGjp0qP7nf/5HkvTOO++of//+ioiIkL+/v6ZOnapTp0659NGhQwcFBASYj9u1a6f8/Hzz8fHjxzVq1Ch16tRJDofDnOH6935+OIPWrl07STL7uXTpkmbPnq2YmBgFBwfL399fH374odlHr169NHjwYMXExOgXv/iFFi9erPPnz7vpVQKaF6MO7wz9cNz5+fnJ4XCY4+6LL77QJ5984nKt7datmyS5LDuLjY2tse/bb7/9isflWu4+nlYXAOstWbJElZWVat++vbnNMAx5e3vrb3/723U55oULFyRJixcvVr9+/Vz2eXh4SJJuu+02nThxQh988IE+/vhjPfDAA0pISNDatWuvS01Ac+Xn56fOnTubj19//XUFBgZq8eLFGjZsmEaPHq2ZM2cqKSlJgYGBWr16tV544QWXPlq1auXy2GazuSxHGT58uKKjo7V48WK1b99eTqdTt956a7UPf/2wH5vNJklmP88//7xeeuklLVy4UDExMfLz89OECRPMPjw8PLRlyxZlZWXpo48+0l//+lc988wz2rt3rzp27OiGVwpoPrp06SKbzaavvvrqmm2vNn4vXLig4cOH689//nO151X9p1lSjctirra9qm+Ja7k7EMhvcJWVlVqxYoVeeOEFJSYmuuwbMWKE3n77bfN/0nv27FFUVJQk6fz58/rHP/6h7t27u/S1f/9+/eQnP5F0eea9sLDQpU2V8PBwtW/fXt9++61Gjx59xfocDoce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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "bar_width = 0.15\n", + "\n", + "plt.figure(figsize=(7.5, 3))\n", + "x = np.arange(len(categories))\n", + "for i, (label, value) in enumerate(sales.items()):\n", + " plt.bar(\n", + " x + i * bar_width - ((len(sales) - 1) * bar_width / 2),\n", + " value,\n", + " width=bar_width,\n", + " label=label,\n", + " )\n", + "plt.xlabel(\"Fruits\")\n", + "plt.ylabel(\"Sales\")\n", + "plt.xticks(x, categories) # Set x-ticks to fruit names\n", + "plt.legend()\n", + "plt.grid(alpha=0.3)\n", + "plt.tight_layout()\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "e3d04b62-13c5-410c-af2f-bf58cd1276f5", + "metadata": {}, + "outputs": [], + "source": [ + "m_bar = MultipleBars(categories=categories, bars=sales)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "e36d8b29-46e3-4cc6-b5af-ad80f0d256f7", + "metadata": {}, + "outputs": [], + "source": [ + "m_bar.add_axis_labels(xlabel=\"Fruits\", ylabel=\"Sales\")" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "ed08dbd0-6858-44f9-aa73-ce304c145751", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\\begin{figure}[ht]\n", + "\\centering\n", + "\\tikzstyle{every node}=[font=\\footnotesize]\n", + "\\begin{tikzpicture}\n", + " \\begin{axis}[\n", + " ylabel=Sales,\n", + " xlabel=Fruits,\n", + " xtick={ 0, 1, 2 },\n", + " xticklabels={ Apples, Bananas, Cherries },\n", + " ybar,\n", + " bar width=0.3cm,\n", + " xtick=data,\n", + " width=7.5cm,\n", + " height=3cm,\n", + " at={(0cm,0cm)},\n", + " scale only axis,\n", + " axis background/.style={fill=white},\n", + " grid=both,\n", + " legend columns = 3,\n", + " legend style={at={(1,1.05)}, legend cell align=left, align=left, draw=white!15!black, mark options={draw=none}, anchor=south east},\n", + " ]\n", + " \\addplot[fill=black!70!black,opacity=0.7]\n", + " coordinates {(1,345) (2,234) (3,512)};\n", + " \\addlegendentry{2022};\n", + "\n", + " \\addplot[fill=blue!70!black,opacity=0.7]\n", + " coordinates {(1,420) (2,304) (3,412)};\n", + " \\addlegendentry{2023};\n", + "\n", + " \\addplot[fill=brown!70!black,opacity=0.7]\n", + " coordinates {(1,501) (2,324) (3,242)};\n", + " \\addlegendentry{2024};\n", + "\n", + "\n", + " \\end{axis}\n", + "\\end{tikzpicture}\n", + " \\caption{Caption of the barchart.}\n", + " \\label{fig:Caption of the barchart.}\n", + "\\end{figure}\n" + ] + } + ], + "source": [ + "m_bar.LaTeXcode()" + ] + }, + { + "cell_type": "markdown", + "id": "02d1bfb9-f246-4465-bb0a-8d68db56d452", + "metadata": {}, + "source": [ + "## Stacked bar plots" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "e9c0d457-9f93-488b-9911-bc7201343778", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAuQAAAEiCAYAAACx/cdRAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA6bUlEQVR4nO3deXxU9b3/8fdMQhKyTGJCFqhJgIIsymakJOLCkiYg8pCSunBRI9JSaYKFtFSpyCrFYhW0jXhFZBERhYtSFlEEASEBJF6UTeoCF28hIYJZiL+sc35/0JzLmLAknuQk8Ho+HvMo55zvfM73TOM373znO2cchmEYAgAAAGALp90dAAAAAK5mBHIAAADARgRyAAAAwEYEcgAAAMBGBHIAAADARgRyAAAAwEYEcgAAAMBGBHIAAADARt52d6ApcLvdOnHihIKCguRwOOzuDgAAAJo5wzBUXFysNm3ayOm8+Bw4gVzSiRMnFB0dbXc3AAAAcIX55ptvdO211160DYFcUlBQkKRzL5jL5bK5Nz+O2+1Wfn6+wsPDL/nXGADUFWMMgIZ0JY0xRUVFio6ONnPmxRDIJXOZisvluiICeWlpqVwuV7P/QQbQ9DDGAGhIV+IYcznLoa+MKwUAAACaKQI5AAAAYCMCOQAAAGAj1pADQBNSVVWliooKu7txQW63WxUVFSotLW3S6zt9fHyadP8A4HwEcgBoAgzDUG5urgoKCuzuykUZhiG3263i4uIm/b0NTqdT7dq1k4+Pj91dAYBLIpADQBNQHcYjIiLk7+/fZMOuYRiqrKyUt7d3k+1j9Ze9nTx5UjExMU22nwBQjUAOADarqqoyw3hYWJjd3bmo5hDIJSk8PFwnTpxQZWWlWrRoYXd3AOCiWGAHADarXjPu7+9vc0+uHNVLVaqqqmzuCQBcmq0z5NOmTdP06dM99nXq1Emff/65JKm0tFS///3vtWLFCpWVlSk5OVkvvviiIiMjzfbHjx/X2LFj9eGHHyowMFCpqamaPXu2vL2Z/AfQvDTlGefmhtcSaBzLdx+3tqBhyKusSFXHyiQL/zv+jz4xltVqCLan1uuvv14ffPCBuX1+kJ4wYYLWr1+vlStXKjg4WOnp6Ro+fLh27twp6dzMx5AhQxQVFaWsrCydPHlSDz74oFq0aKE///nPjX4tAAAAQF3ZHsi9vb0VFRVVY39hYaEWLlyo5cuXa8CAAZKkRYsWqUuXLtq1a5fi4+P1/vvv69ChQ/rggw8UGRmpnj17aubMmXrsscc0bdo0Pl0PAACAJs/2QP7FF1+oTZs28vPzU0JCgmbPnq2YmBjl5OSooqJCiYmJZtvOnTsrJiZG2dnZio+PV3Z2trp16+axhCU5OVljx47VwYMH1atXLzsuCQAsY/nbwZdQ17d1Z8+erdWrV+vzzz9Xy5YtdfPNN+svf/mLOnXqZLa51PLDTz/9VE8//bR27Nihb7/9Vm3bttUjjzyi3/3ud2aN1atXa/78+dq3b5/Kysp0/fXXa9q0aUpOTrbmwgHARrYG8j59+mjx4sXq1KmTTp48qenTp+vWW2/VgQMHlJubKx8fH4WEhHg8JzIyUrm5uZLO3Sbs/DBefbz62IWUlZWprKzM3C4qKpJ07lZZbrfbiku7bP/1xX9ZW9CQHGcdMgoMycIllCkdU6wrBsCD2+2WYRjm43yGjAs8q2H88PwXa2MYhrZt26bf/va36t27tyorK/XEE08oKSlJBw8eVEBAgCRp/Pjx2rBhg9566y0FBwdr3LhxGj58uHbs2CFJ2rt3r8LDw/Xaa68pOjpaWVlZ+s1vfiOn06n09HRJ0rZt25SYmKhZs2YpJCREixYt0tChQ7Vr165aJ1+qX0s7xnXgqnIZY0ad61U/LGTHOFCXc9oayAcPHmz+u3v37urTp49iY2P11ltvqWXLlg123tmzZ9f4MKkk5efnq7S0tMHOWxvHWYs/eGRIjtJ/17Sw9KlTp6wrBsBDRUWF3G63KisrVVlZ6XHMXdW4v0R+eP4fMgzDvHOJw+HQ2rVrPY4vWLBAP/nJT7Rnzx7deuutKiws1KuvvqqlS5fqtttukyS9/PLL6t69u3bu3Kk+ffrowQcf9KgRExOjrKwsrV69Wo888ogk6a9//atHmxkzZmjNmjVas2aNunXrVut1uN1unT59mtseAg3Iq6zI4oqGnJXf/zvDWBdk7MgxxcXFl93W9iUr5wsJCdF1112nL7/8Uj//+c9VXl6ugoICj1nyvLw8c815VFSU9uzZ41EjLy/PPHYhkyZNUkZGhrldVFSk6OhohYeHy+VyWXhFl2YUWv2X5b//J9DaGfKIiAjrigHwUFpaquLiYnl7e9e4Q5TTq3HvTnu5d6i6UMgtKSmRdO4+4N7e3vr0009VUVGh5ORks/YNN9ygmJgY7dmzR3379q21TnFxscLCwi7YH7fbrbNnz6pVq1a1tvH29pbT6VRYWJj8/Pwu65oA1F3VsbJLN6oLw5AMqcrHZeldVuzIMXUZe5pUID979qy++uorPfDAA4qLi1OLFi20efNmpaScWy5x5MgRHT9+XAkJCZKkhIQEzZo1S6dOnTJf6E2bNsnlcqlr164XPI+vr698fX1r7Hc6nXI6G/nW7A1xZy7HeQ+LNPrrAlxFnE6nHA6H+Tifo0EGiQu71O0CDcMw2/ywrdvt1oQJE9S3b19z1jovL08+Pj665pprPNpGRkYqLy+v1vNlZWXpzTff1Pr16y/Yn2effVZnz57VvffeW2ub6tfSlnEduJo0xC1GHY7/e1jEjnGgLue0NZD/4Q9/0NChQxUbG6sTJ05o6tSp8vLy0ogRIxQcHKzRo0crIyNDoaGhcrlcGjdunBISEhQfHy9JSkpKUteuXfXAAw9ozpw5ys3N1eTJk5WWllZr4AYANJy0tDQdOHDAXBteHwcOHNBdd92lqVOnKikpqdY2y5cv1/Tp07VmzRrevQNwRbA1kP/v//6vRowYodOnTys8PFy33HKLdu3apfDwcEnS3Llz5XQ6lZKS4vHJ/GpeXl5at26dxo4dq4SEBAUEBCg1NVUzZsyw65IA4KqUnp6udevWafv27br22mvN/VFRUZdcfljt0KFDGjhwoMaMGaPJkyfXep4VK1boV7/6lVauXOlxFy4AaM5sDeQrVqy46HE/Pz9lZmYqMzPzgm1iY2O1YcMGq7sGALgMhmFo3Lhxevvtt7V161a1a9fO4/jlLD+UpIMHD2rAgAFKTU3VrFmzaj3XG2+8oYcfflgrVqzQkCFDGu6iAKCRNak15ACA5iUtLU3Lly/XmjVrFBQUZN5yNjg4WC1btrys5YcHDhzQgAEDlJycrIyMDLOGl5eX+Y7p8uXLlZqaqueff159+vQx21SfAwCaMz7pAgCot/nz56uwsFD9+vVT69atzcebb75ptpk7d67uvPNOpaSk6LbbblNUVJRWr15tHl+1apXy8/O1bNkyjxq9e/c227z88suqrKxUWlqaR5vzvzwIAJorh3E53wJxhSsqKlJwcLAKCwsb/baHK/+50tqC1V8MZPFtD+++7m7rigHwUFpaqqNHj6pdu3ZN/hZ9hmGosrJS3t7el7wji52a02sKNGeWf5uwYcirrEhVvtbe9rCu30JshbrkS2bIAQAAABsRyAEAAAAbEcgBAAAAGxHIAQAAABsRyAEAAAAbEcgBAAAAGxHIAQAAABsRyAEAAAAbEcgBAAAAGxHIAQD1Nnv2bPXu3VtBQUGKiIjQsGHDdOTIEY82paWlSktLU1hYmAIDA5WSkqK8vDzz+KeffqoRI0YoOjpaLVu2VJcuXfT888971NixY4f69u2rsLAwtWzZUp07d9bcuXMb5RoBoKF5290BAMBF7F3UuOe7aVSdmm/btk1paWnq3bu3Kisr9ac//UlJSUk6dOiQAgICJEkTJkzQ+vXrtXLlSgUHBys9PV3Dhw/Xzp07JUk5OTmKiIjQsmXLFB0draysLI0ZM0ZeXl5KT0+XJAUEBCg9PV3du3dXQECAduzYod/85jcKCAjQmDFjrH0NAKCREcgBAPW2ceNGj+3FixcrIiJCOTk5uu2221RYWKiFCxdq+fLlGjBggCRp0aJF6tKli3bt2qX4+Hg9/PDDHjXat2+v7OxsrV692gzkvXr1Uq9evcw2bdu21erVq/XRRx8RyAE0eyxZAQBYprCwUJIUGhoq6dzsd0VFhRITE802nTt3VkxMjLKzsy9ap7pGbf77v/9bWVlZuv322y3qOQDYhxlyAIAl3G63xo8fr759++qGG26QJOXm5srHx0chISEebSMjI5Wbm1trnaysLL355ptav359jWPXXnut8vPzVVlZqWnTpulXv/qV5dcBAI2NQA4AsERaWpoOHDigHTt21LvGgQMHdNddd2nq1KlKSkqqcfyjjz7S2bNntWvXLj3++OPq0KGDRowY8WO6DQC2I5ADAH609PR0rVu3Ttu3b9e1115r7o+KilJ5ebkKCgo8Zsnz8vIUFRXlUePQoUMaOHCgxowZo8mTJ9d6nnbt2kmSunXrpry8PE2bNo1ADqDZYw05AKDeDMNQenq63n77bW3ZssUMzNXi4uLUokULbd682dx35MgRHT9+XAkJCea+gwcPqn///kpNTdWsWbMu69xut1tlZWXWXAgA2IgZcgBAvaWlpWn58uVas2aNgoKCzHXhwcHBatmypYKDgzV69GhlZGQoNDRULpdL48aNU0JCguLj4yWdW6YyYMAAJScnKyMjw6zh5eWl8PBwSVJmZqZiYmLUuXNnSdL27dv117/+VY8++qgNVw0A1iKQAwDqbf78+ZKkfv36eexftGiRHnroIUnS3Llz5XQ6lZKSorKyMiUnJ+vFF180265atUr5+flatmyZli1bZu6PjY3VsWPHJJ2bDZ80aZKOHj0qb29v/fSnP9Vf/vIX/eY3v2nQ6wOAxuAwDMOwuxN2KyoqUnBwsAoLC+VyuRr13Cv/udLagobkOOuQEWhIDuvK3n3d3dYVA+ChtLRUR48eVbt27eTn52d3dy7KMAxVVlbK29tbDoeFg4zFmtNrCjRny3cft7agYcirrEhVvi7JwjHmP/rEWFbrctUlX7KGHAAAALARgRwAAACwEYEcAAAAsBGBHAAAALARgRwAAACwEbc9tNuxLGvrGQ7JHSp9e0ZyWHgDHe6yAgAA0CCYIQcAAABsRCAHAAAAbMSSFQAAANTLT49b+wWHhqQyh798je+t/H5Dqc/vraxmuSYzQ/7000/L4XBo/Pjx5r7S0lKlpaUpLCxMgYGBSklJUV5ensfzjh8/riFDhsjf318RERGaOHGiKisrG7n3AAAAQP00iUD+8ccf6z//8z/VvXt3j/0TJkzQ2rVrtXLlSm3btk0nTpzQ8OHDzeNVVVUaMmSIysvLlZWVpSVLlmjx4sWaMmVKY18CAFyVZs+erd69eysoKEgREREaNmyYjhw54tHmUpMrn376qUaMGKHo6Gi1bNlSXbp00fPPP3/Bc+7cuVPe3t7q2bNnQ10WADQq25esnD17ViNHjtSCBQv01FNPmfsLCwu1cOFCLV++XAMGDJAkLVq0SF26dNGuXbsUHx+v999/X4cOHdIHH3ygyMhI9ezZUzNnztRjjz2madOmycfHx67LAgBLrPyntW8HX8rddbyj0rZt25SWlqbevXursrJSf/rTn5SUlKRDhw4pICBA0rnJlfXr12vlypUKDg5Wenq6hg8frp07d0qScnJyFBERoWXLlik6OlpZWVkaM2aMvLy8lJ6e7nG+goICPfjggxo4cGCNd0wBoLmyPZCnpaVpyJAhSkxM9AjkOTk5qqioUGJiormvc+fOiomJUXZ2tuLj45Wdna1u3bopMjLSbJOcnKyxY8fq4MGD6tWrV63nLCsrU1lZmbldVFQkSXK73XK73VZf4sUZlq6QOrf4qvph4eqrRn9dgKuI2+2WYRjmw4OFdy+9HDXOf5E2hmHo3Xff9Ti2aNEiRUZGau/evbrtttvMyZXXX39d/fv3lyS9+uqr6tq1qzmWjxo1yqNGu3btlJWVpdWrVystLc3j2COPPKIRI0bIy8tLa9asuWB/q19LW8Z14Cpi9RDlEWMsZMc4UJdz2hrIV6xYoU8++UQff/xxjWO5ubny8fFRSEiIx/7IyEjl5uaabc4P49XHq49dyOzZszV9+vQa+/Pz81VaWlrXy/hRHO5QawsaDjmMQMntsPQ+5KdOnbKsFgBPFRUVcrvdqqysrPEZmCp3VaP25VKfwTEMQ1VV5/rkcNT8o//06dOSJJfLpcrKSu3Zs0cVFRXq16+fWbtDhw6KiYnRzp07ddNNN9V6noKCAoWEhHj0Z8mSJfrqq6+0aNEi/fnPf5ZhGBfsb2Vlpdxut06fPq0WLVpc+sIB1EuZw9/ympUOX2s/0Cl7ckxxcfFlt7UtkH/zzTf63e9+p02bNsnPz69Rzz1p0iRlZGSY20VFRYqOjlZ4eLhcLlej9sVwnrG4oCS3ca6uhT/NERER1hUD4KG0tFTFxcXy9vaWt7fnsOzl9GrUvvzw/BdSW8h1u92aOHGi+vbta67vzs/Pl4+Pj1q1auXRNjIyUqdOnar1fFlZWVq5cqXWrVtnHv/iiy/0xBNPaPv27fLz85PT6ZTD4bhgf729veV0OhUWFtbov2OAq8kx43tL61XPjvtYfJcVO3JMXcYe2wJ5Tk6OTp06pRtvvNHcV1VVpe3bt+vvf/+73nvvPZWXl5uzJNXy8vIUFRUlSYqKitKePXs86lavKaxuUxtfX1/5+vrW2O90OuV0NvLnXK38Ns1zBc8FcYe1tRv9dQGuItXhsvrhweppokuobdb7fIZhmG1+2DY9PV0HDhzQjh07arSprW5t13vgwAENGzZMU6dOVXJysqRzvxtGjhyp6dOnq1OnTpese35tW8Z14CrSEEOU47yHVewYB+pyTttGqYEDB2r//v3at2+f+bjppps0cuRI898tWrTQ5s2bzeccOXJEx48fV0JCgiQpISFB+/fv93gbYtOmTXK5XOratWujXxMAXK3S09O1bt06ffjhh7r22mvN/VFRUebkyvnOn1ypdujQIQ0cOFBjxozR5MmTzf3FxcXau3ev0tPTzXcRZsyYoU8//VTe3t7asmVLg14bADQ022bIg4KCdMMNN3jsCwgIUFhYmLl/9OjRysjIUGhoqFwul8aNG6eEhATFx8dLkpKSktS1a1c98MADmjNnjnJzczV58mSlpaXVOgMOALCWYRgaN26c3n77bW3dulXt2rXzOB4XF2dOrqSkpEiqObkiSQcPHtSAAQOUmpqqWbNmedRwuVzav3+/x74XX3xRW7Zs0apVq2qcEwCaG9vvsnIxc+fOldPpVEpKisrKypScnKwXX3zRPO7l5aV169Zp7NixSkhIUEBAgFJTUzVjxgwbew0AV4+0tDQtX75ca9asUVBQkPmB+uDgYLVs2VLBwcGXnFw5cOCABgwYoOTkZGVkZJg1vLy8FB4eLqfTWWMCJyIiQn5+fjX2A0Bz1KQC+datWz22/fz8lJmZqczMzAs+JzY2Vhs2bGjgngEAajN//nxJUr9+/Tz2L1q0SA899JCkS0+urFq1Svn5+Vq2bJmWLVtm7o+NjdWxY8ca+hIAwHYO43JuOnuFKyoqUnBwsAoLCxv9Lisr359gbUHDIYc79N93WbHu/9q7k+ZaVguAp9LSUh09elTt2rVr8ncEqb7VoLe39yU/AGqn5vSaAs3Z7pXPWlrP0LlbKfpafJeVPnf/3sJql6cu+ZKPngMAAAA2IpADAAAANiKQAwAAADYikAMAAAA2IpADAAAANiKQA0ATwU2vrMNrCaA5IZADgM1atGghSfr+++9t7smVo7y8XNK5LxcCgKauSX0xEABcjby8vBQSEqJTp05Jkvz9/ZvsPb6bw33I3W638vPz5e/vL29vfs0BaPoYqQCgCYiKipIkM5Q3VYZhyO12y+l0NtlALklOp1MxMTFNuo8AUI1ADgBNgMPhUOvWrRUREaGKigq7u3NBbrdbp0+fVlhYmJzOprvq0cfHp0n3DwDORyAHgCbEy8urSa97drvdatGihfz8/Ai8AGARRlMAAADARgRyAAAAwEYEcgAAAMBGBHIAAADARnyo02ZHT5dYXNGhAC9/lVSVSOKb6gAAAJo6ZsgBAAAAGxHIAQAAABsRyAEAAAAbEcgBAAAAGxHIAQAAABsRyAEAAAAbEcgBAAAAGxHIAQAAABvxxUAAcAVb+c+V1hY0JMdZh4xCQ3JYV/bu6+62rhgANDPMkAMAAAA2IpADAAAANiKQAwAAADYikAMAAAA2IpADAAAANrI1kM+fP1/du3eXy+WSy+VSQkKC3n33XfN4aWmp0tLSFBYWpsDAQKWkpCgvL8+jxvHjxzVkyBD5+/srIiJCEydOVGVlZWNfCgAAAFAvlgTyqqoq7du3T999912dnnfttdfq6aefVk5Ojvbu3asBAwborrvu0sGDByVJEyZM0Nq1a7Vy5Upt27ZNJ06c0PDhwz3OO2TIEJWXlysrK0tLlizR4sWLNWXKFCsuCwAAAGhw9Qrk48eP18KFCyWdC8W33367brzxRkVHR2vr1q2XXWfo0KG644471LFjR1133XWaNWuWAgMDtWvXLhUWFmrhwoV67rnnNGDAAMXFxWnRokXKysrSrl27JEnvv/++Dh06pGXLlqlnz54aPHiwZs6cqczMTJWXl9fn0gAAAIBGVa8vBlq1apXuv/9+SdLatWt19OhRff7553rttdf0xBNPaOfOnXWuWVVVpZUrV6qkpEQJCQnKyclRRUWFEhMTzTadO3dWTEyMsrOzFR8fr+zsbHXr1k2RkZFmm+TkZI0dO1YHDx5Ur169aj1XWVmZysrKzO2ioiJJktvtltvtrnPffxwLv1nDo561dRv/dQFgiaPZ1tYzJLlDpfwzlg4z7g4p1hUD0GiMBqhX/bCSHTmmLuesVyD/9ttvFRUVJUnasGGD7r77bl133XV6+OGH9fzzz9ep1v79+5WQkKDS0lIFBgbq7bffVteuXbVv3z75+PgoJCTEo31kZKRyc3MlSbm5uR5hvPp49bELmT17tqZPn15jf35+vkpLS+vU/x8rwCvc4ooO+TldOveb0rof51OnTllWC0DjcbhDrS1oOOQwAiW3Q3IwxgBXuzKHv+U1Kx2+lk9X2jHGFBcXX3bbegXyyMhIHTp0SK1bt9bGjRs1f/58SdL3338vLy+vOtXq1KmT9u3bp8LCQq1atUqpqanatm1bfbp12SZNmqSMjAxzu6ioSNHR0QoPD5fL5WrQc/9QSVW+xRXPBfGSqm9lZSCPiIiwrBaAxmM4z1hcUJLbOFfXwt+YjDFA83TM+N7SetWz4z7G95aGcjvGGD8/v8tuW69APmrUKN1zzz1q3bq1HA6Huaxk9+7d6ty5c51q+fj4qEOHDpKkuLg4ffzxx3r++ed17733qry8XAUFBR6z5Hl5eebsfFRUlPbs2eNRr/ouLNVtauPr6ytfX98a+51Op5zOxr7xjNVvypxf17rajf+6ALCEhbPY/y54Log7rK3NGAM0T1bPZFfXrH5YxY4xpi7nrFfvpk2bpldeeUVjxozRzp07zXDr5eWlxx9/vD4lTW63W2VlZYqLi1OLFi20efNm89iRI0d0/PhxJSQkSJISEhK0f/9+j7chNm3aJJfLpa5du/6ofgAAAACNoV4z5JL0y1/+UpI81lynpqbWqcakSZM0ePBgxcTEqLi4WMuXL9fWrVv13nvvKTg4WKNHj1ZGRoZCQ0Plcrk0btw4JSQkKD4+XpKUlJSkrl276oEHHtCcOXOUm5uryZMnKy0trdYZcAAAAKCpqdcMeVVVlWbOnKmf/OQnCgwM1Ndffy1JevLJJ83bIV6OU6dO6cEHH1SnTp00cOBAffzxx3rvvff085//XJI0d+5c3XnnnUpJSdFtt92mqKgorV692ny+l5eX1q1bJy8vLyUkJOj+++/Xgw8+qBkzZtTnsgAAAIBGV68Z8lmzZmnJkiWaM2eOfv3rX5v7b7jhBs2bN0+jR4++rDqXCu9+fn7KzMxUZmbmBdvExsZqw4YNl9dxAAAAoImp1wz50qVL9fLLL2vkyJEed1Xp0aOHPv/8c8s6BwAAAFzp6hXI//Wvf5l3Rjmf2+1WRUXFj+4UAAAAcLWoVyDv2rWrPvrooxr7V61adcFvxwQAAABQU73WkE+ZMkWpqan617/+JbfbrdWrV+vIkSNaunSp1q1bZ3UfAQAAgCtWvWbI77rrLq1du1YffPCBAgICNGXKFB0+fFhr164175ACAAAA4NLqfR/yW2+9VZs2bbKyLwAAAMBVh+8qBgAAAGx02TPk11xzjRwOx2W1PXPmTL07BAAAAFxNLjuQz5s3rwG7AQAAAFydLjuQp6amNmQ/AAAAgKtSvT/UWa20tFTl5eUe+1wu148tCwAAAFwV6vWhzpKSEqWnpysiIkIBAQG65pprPB4AAAAALk+9Avkf//hHbdmyRfPnz5evr69eeeUVTZ8+XW3atNHSpUut7iMAAABwxarXkpW1a9dq6dKl6tevn0aNGqVbb71VHTp0UGxsrF5//XWNHDnS6n4CAAAAV6R6zZCfOXNG7du3l3RuvXj1bQ5vueUWbd++3breAQAAAFe4egXy9u3b6+jRo5Kkzp0766233pJ0buY8JCTEss4BAAAAV7p6BfJRo0bp008/lSQ9/vjjyszMlJ+fnyZMmKCJEyda2kEAAADgSlavNeQTJkww/52YmKjPP/9cOTk56tChg7p3725Z5wAAAIArXZ0CeXZ2tk6fPq0777zT3Ld06VJNnTpVJSUlGjZsmP72t7/J19fX8o4CAACgadlWecTiig4FeIWrpCpfkmFZ1T6WVWoYdVqyMmPGDB08eNDc3r9/v0aPHq3ExERNmjRJa9eu1ezZsy3vJAAAAHClqlMg37dvnwYOHGhur1ixQn369NGCBQs0YcIEvfDCC+YHPAEAAABcWp2WrHz33XeKjIw0t7dt26bBgweb271799Y333xjXe8AAD/K0dMlFld0KMDLXyVVJbLy7WQAuJrVaYY8MjLSvN1heXm5PvnkE8XHx5vHi4uL1aJFC2t7CAAAAFzB6hTI77jjDj3++OP66KOPNGnSJPn7++vWW281j3/22Wf66U9/anknAQAAgCtVnZaszJw5U8OHD9ftt9+uwMBALVmyRD4+PubxV199VUlJSZZ3EgAAALhS1SmQt2rVStu3b1dhYaECAwPl5eXlcXzlypUKDAy0tIMAAADAlaxeXwwUHBxc6/7Q0NAf1RkAAADgalOnNeQAAAAArEUgBwAAAGxEIAcAAABsRCAHAAAAbGRrIJ89e7Z69+6toKAgRUREaNiwYTpy5IhHm9LSUqWlpSksLEyBgYFKSUlRXl6eR5vjx49ryJAh8vf3V0REhCZOnKjKysrGvBQAAACgXmwN5Nu2bVNaWpp27dqlTZs2qaKiQklJSSop+b+vep4wYYLWrl2rlStXatu2bTpx4oSGDx9uHq+qqtKQIUNUXl6urKwsLVmyRIsXL9aUKVPsuCQAAACgTup120OrbNy40WN78eLFioiIUE5Ojm677TYVFhZq4cKFWr58uQYMGCBJWrRokbp06aJdu3YpPj5e77//vg4dOqQPPvhAkZGR6tmzp2bOnKnHHntM06ZN8/jiIgAAAKCpsTWQ/1BhYaGk/7ufeU5OjioqKpSYmGi26dy5s2JiYpSdna34+HhlZ2erW7duioyMNNskJydr7NixOnjwoHr16lXjPGVlZSorKzO3i4qKJElut1tut7tBru3CHA1Uz9q6jf+6ALAGYwyAhsQYY8U5m0wgd7vdGj9+vPr27asbbrhBkpSbmysfHx+FhIR4tI2MjFRubq7Z5vwwXn28+lhtZs+erenTp9fYn5+fr9LS0h97KXUS4BVucUWH/JwunftBNiyreurUKctqAWg8jDEAGhJjzIUVFxdfdtsmE8jT0tJ04MAB7dixo8HPNWnSJGVkZJjbRUVFio6OVnh4uFwuV4Of/3wlVfkWVzz3A1xS9a2s/EGOiIiwrBaAxsMYA6AhMcZcmJ+f32W3bRKBPD09XevWrdP27dt17bXXmvujoqJUXl6ugoICj1nyvLw8RUVFmW327NnjUa/6LizVbX7I19dXvr6+NfY7nU45nY39OVfrfthq1rWuduO/LgCswRgDoCExxlhxTltHQMMwlJ6errfffltbtmxRu3btPI7HxcWpRYsW2rx5s7nvyJEjOn78uBISEiRJCQkJ2r9/v8dbEZs2bZLL5VLXrl0b50IAAACAerJ1hjwtLU3Lly/XmjVrFBQUZK75Dg4OVsuWLRUcHKzRo0crIyNDoaGhcrlcGjdunBISEhQfHy9JSkpKUteuXfXAAw9ozpw5ys3N1eTJk5WWllbrLDgAAADQlNgayOfPny9J6tevn8f+RYsW6aGHHpIkzZ07V06nUykpKSorK1NycrJefPFFs62Xl5fWrVunsWPHKiEhQQEBAUpNTdWMGTMa6zIAAACAerM1kBvGpdcG+fn5KTMzU5mZmRdsExsbqw0bNljZNQAAAKBR8CkaAAAAwEYEcgAAAMBGBHIAAADARgRyAAAAwEYEcgAAAMBGBHIAAADARgRyAAAAwEYEcgAAAMBGBHIAAADARgRyAAAAwEYEcgAAAMBGBHIAAADARgRyAAAAwEYEcgAAAMBGBHIAAADARgRyAAAAwEYEcgAAAMBGBHIAAADARgRyAAAAwEYEcgAAAMBGBHIAAADARgRyAAAAwEYEcgAAAMBGBHIAAADARgRyAAAAwEYEcgAAAMBGBHIAAADARgRyAAAAwEYEcgAAAMBGBHIAAADARgRyAAAAwEa2BvLt27dr6NChatOmjRwOh9555x2P44ZhaMqUKWrdurVatmypxMREffHFFx5tzpw5o5EjR8rlcikkJESjR4/W2bNnG/EqAAAAgPqzNZCXlJSoR48eyszMrPX4nDlz9MILL+ill17S7t27FRAQoOTkZJWWlpptRo4cqYMHD2rTpk1at26dtm/frjFjxjTWJQAAAAA/iredJx88eLAGDx5c6zHDMDRv3jxNnjxZd911lyRp6dKlioyM1DvvvKP77rtPhw8f1saNG/Xxxx/rpptukiT97W9/0x133KG//vWvatOmTaNdCwAAAFAfTXYN+dGjR5Wbm6vExERzX3BwsPr06aPs7GxJUnZ2tkJCQswwLkmJiYlyOp3avXt3o/cZAAAAqCtbZ8gvJjc3V5IUGRnpsT8yMtI8lpubq4iICI/j3t7eCg0NNdvUpqysTGVlZeZ2UVGRJMntdsvtdlvS/8vnaKB61tZt/NcFgDUYYwA0JMYYK87ZZAN5Q5o9e7amT59eY39+fr7H+vTGEOAVbnFFh/ycLp37QTYsq3rq1CnLagFoPIwxABoSY8yFFRcXX3bbJhvIo6KiJEl5eXlq3bq1uT8vL089e/Y02/zwBa6srNSZM2fM59dm0qRJysjIMLeLiooUHR2t8PBwuVwuC6/i0kqq8i2ueO4HuKTqW1n5g/zDdyIANA+MMQAaEmPMhfn5+V122yYbyNu1a6eoqCht3rzZDOBFRUXavXu3xo4dK0lKSEhQQUGBcnJyFBcXJ0nasmWL3G63+vTpc8Havr6+8vX1rbHf6XTK6WzsZfXW/bDVrGtd7cZ/XQBYgzEGQENijLHinLYG8rNnz+rLL780t48ePap9+/YpNDRUMTExGj9+vJ566il17NhR7dq105NPPqk2bdpo2LBhkqQuXbpo0KBB+vWvf62XXnpJFRUVSk9P13333ccdVgAAANAs2BrI9+7dq/79+5vb1ctIUlNTtXjxYv3xj39USUmJxowZo4KCAt1yyy3auHGjx1sAr7/+utLT0zVw4EA5nU6lpKTohRdeaPRrAQAAAOrD1kDer18/GcaF345wOByaMWOGZsyYccE2oaGhWr58eUN0DwAAAGhwLNoDAAAAbEQgBwAAAGxEIAcAAABsRCAHAAAAbEQgBwAAAGxEIAcAAABsRCAHAAAAbEQgBwAAAGxEIAcAAABsRCAHAAAAbEQgBwAAAGxEIAcAAABsRCAHAAAAbEQgBwAAAGxEIAcAAABsRCAHAAAAbEQgBwAAAGxEIAcAAABsRCAHAAAAbEQgBwAAAGxEIAcAAABsRCAHAAAAbEQgBwAAAGxEIAcAAABsRCAHAAAAbEQgBwAAAGxEIAcAAABsRCAHAAAAbEQgBwAAAGxEIAcAAABsRCAHAAAAbHTFBPLMzEy1bdtWfn5+6tOnj/bs2WN3lwAAAIBLuiIC+ZtvvqmMjAxNnTpVn3zyiXr06KHk5GSdOnXK7q4BAAAAF3VFBPLnnntOv/71rzVq1Ch17dpVL730kvz9/fXqq6/a3TUAAADgopp9IC8vL1dOTo4SExPNfU6nU4mJicrOzraxZwAAAMCledvdgR/r22+/VVVVlSIjIz32R0ZG6vPPP6/1OWVlZSorKzO3CwsLJUkFBQVyu90N19lalH5fYXFFh5xeZSqtqpBkWFa1oKDAsloAGg9jDICGxBhzYUVFRZIkw7j0dTT7QF4fs2fP1vTp02vsj42NtaE3zcPUXy22uwsArmCMMQAakp1jTHFxsYKDgy/aptkH8latWsnLy0t5eXke+/Py8hQVFVXrcyZNmqSMjAxz2+1268yZMwoLC5PD4WjQ/ja0oqIiRUdH65tvvpHL5bK7OwCuMIwxABrSlTTGGIah4uJitWnT5pJtm30g9/HxUVxcnDZv3qxhw4ZJOhewN2/erPT09Fqf4+vrK19fX499ISEhDdzTxuVyuZr9DzKAposxBkBDulLGmEvNjFdr9oFckjIyMpSamqqbbrpJP/vZzzRv3jyVlJRo1KhRdncNAAAAuKgrIpDfe++9ys/P15QpU5Sbm6uePXtq48aNNT7oCQAAADQ1V0Qgl6T09PQLLlG5mvj6+mrq1Kk1luQAgBUYYwA0pKt1jHEYl3MvFgAAAAANotl/MRAAAADQnBHIAQAAABsRyK8C06ZNU8+ePe3uBgAAuII5HA698847jXa+KynfEMibgOzsbHl5eWnIkCF2dwVAM/PQQw/J4XCYj7CwMA0aNEifffaZ3V0DcIXJzc3VuHHj1L59e/n6+io6OlpDhw7V5s2bbenPH/7wB9vObTUCeROwcOFCjRs3Ttu3b9eJEyfs7g6AZmbQoEE6efKkTp48qc2bN8vb21t33nmn3d0CcAU5duyY4uLitGXLFj3zzDPav3+/Nm7cqP79+ystLa3BzlteXl5jn2EYqqysVGBgoMLCwhrs3I2JQG6zs2fP6s0339TYsWM1ZMgQLV682Dy2detWORwOrV+/Xt27d5efn5/i4+N14MABs83ixYsVEhKid955Rx07dpSfn5+Sk5P1zTffXPS8r7zyirp06SI/Pz917txZL774onmsvLxc6enpat26tfz8/BQbG6vZs2dbfu0ArOHr66uoqChFRUWpZ8+eevzxx/XNN98oPz9fkvTYY4/puuuuk7+/v9q3b68nn3xSFRUV5vOr3/Z97bXX1LZtWwUHB+u+++5TcXGx2Wbjxo265ZZbFBISorCwMN1555366quvzOPHjh2Tw+HQ6tWr1b9/f/n7+6tHjx7Kzs4225w+fVojRozQT37yE/n7+6tbt2564403PK5l1apV6tatm1q2bKmwsDAlJiaqpKSkoV46AJfpt7/9rRwOh/bs2aOUlBRdd911uv7665WRkaFdu3aZ7b799lv94he/kL+/vzp27Kh//OMfHnUOHDigwYMHKzAwUJGRkXrggQf07bffmsf79eun9PR0jR8/Xq1atVJycrKZh959913FxcXJ19dXO3bsqHXJSnPNNwRym7311lvq3LmzOnXqpPvvv1+vvvqqfngnyokTJ+rZZ5/Vxx9/rPDwcA0dOtTjl+n333+vWbNmaenSpdq5c6cKCgp03333XfCcr7/+uqZMmaJZs2bp8OHD+vOf/6wnn3xSS5YskSS98MIL+sc//qG33npLR44c0euvv662bds2yPUDsNbZs2e1bNkydejQwZw5CgoK0uLFi3Xo0CE9//zzWrBggebOnevxvK+++krvvPOO1q1bp3Xr1mnbtm16+umnzeMlJSXKyMjQ3r17tXnzZjmdTv3iF7+Q2+32qPPEE0/oD3/4g/bt26frrrtOI0aMUGVlpSSptLRUcXFxWr9+vQ4cOKAxY8bogQce0J49eyRJJ0+e1IgRI/Twww/r8OHD2rp1q4YPH15jTATQuM6cOaONGzcqLS1NAQEBNY6HhISY/54+fbruueceffbZZ7rjjjs0cuRInTlzRpJUUFCgAQMGqFevXtq7d682btyovLw83XPPPR71lixZIh8fH+3cuVMvvfSSuf/xxx/X008/rcOHD6t79+41+tGs840BW918883GvHnzDMMwjIqKCqNVq1bGhx9+aBiGYXz44YeGJGPFihVm+9OnTxstW7Y03nzzTcMwDGPRokWGJGPXrl1mm8OHDxuSjN27dxuGYRhTp041evToYR7/6U9/aixfvtyjHzNnzjQSEhIMwzCMcePGGQMGDDDcbrfl1wvAWqmpqYaXl5cREBBgBAQEGJKM1q1bGzk5ORd8zjPPPGPExcWZ21OnTjX8/f2NoqIic9/EiRONPn36XLBGfn6+IcnYv3+/YRiGcfToUUOS8corr5htDh48aEgyDh8+fME6Q4YMMX7/+98bhmEYOTk5hiTj2LFjl75wAI1m9+7dhiRj9erVF20nyZg8ebK5ffbsWUOS8e677xqGcS5rJCUleTznm2++MSQZR44cMQzDMG6//XajV69eHm2q89A777zjsf9KyjfMkNvoyJEj2rNnj0aMGCFJ8vb21r333quFCxd6tEtISDD/HRoaqk6dOunw4cPmPm9vb/Xu3dvc7ty5s0JCQjzaVCspKdFXX32l0aNHKzAw0Hw89dRT5tvPDz30kPbt26dOnTrp0Ucf1fvvv2/pdQOwVv/+/bVv3z7t27dPe/bsUXJysgYPHqz/+Z//kSS9+eab6tu3r6KiohQYGKjJkyfr+PHjHjXatm2roKAgc7t169Y6deqUuf3FF19oxIgRat++vVwulzmr9MM6589atW7dWpLMOlVVVZo5c6a6deum0NBQBQYG6r333jNr9OjRQwMHDlS3bt109913a8GCBfruu+8sepUA1JdRh3epzh8DAgIC5HK5zDHg008/1YcffuiRPzp37ixJHkvg4uLiaq190003XfC8zT3feNvdgavZwoULVVlZqTZt2pj7DMOQr6+v/v73vzfIOc+ePStJWrBggfr06eNxzMvLS5J044036ujRo3r33Xf1wQcf6J577lFiYqJWrVrVIH0C8OMEBASoQ4cO5vYrr7yi4OBgLViwQEOGDNHIkSM1ffp0JScnKzg4WCtWrNCzzz7rUaNFixYe2w6Hw2M5ytChQxUbG6sFCxaoTZs2crvduuGGG2p84Or8Og6HQ5LMOs8884yef/55zZs3T926dVNAQIDGjx9v1vDy8tKmTZuUlZWl999/X3/729/0xBNPaPfu3WrXrp0FrxSA+ujYsaMcDoc+//zzS7a92Fhy9uxZDR06VH/5y19qPK/6D3hJtS6Ludj+6tpS8803BHKbVFZWaunSpXr22WeVlJTkcWzYsGF64403zL8ad+3apZiYGEnSd999p3/+85/q0qWLR629e/fqZz/7maRzM+8FBQUebapFRkaqTZs2+vrrrzVy5MgL9s/lcunee+/Vvffeq1/+8pcaNGiQzpw5o9DQ0B997QAalsPhkNPp1P/7f/9PWVlZio2N1RNPPGEer545v1ynT5/WkSNHtGDBAt16662SpB07dtS5Xzt37tRdd92l+++/X9K5oP7Pf/5TXbt29eh737591bdvX02ZMkWxsbF6++23lZGRUefzAbBGaGiokpOTlZmZqUcffbRGMC4oKPBYR34hN954o/7rv/5Lbdu2lbe3tRG0uecbArlN1q1bp++++06jR49WcHCwx7GUlBQtXLhQzzzzjCRpxowZCgsLU2RkpJ544gm1atVKw4YNM9u3aNFC48aN0wsvvCBvb2+lp6crPj7eDOg/NH36dD366KMKDg7WoEGDVFZWpr179+q7775TRkaGnnvuObVu3Vq9evWS0+nUypUrFRUVdVn/sQFofGVlZcrNzZV07o/2v//97+ZMVFFRkY4fP64VK1aod+/eWr9+vd5+++061b/mmmsUFhaml19+Wa1bt9bx48f1+OOP17mfHTt21KpVq5SVlaVrrrlGzz33nPLy8sxAvnv3bm3evFlJSUmKiIjQ7t27lZ+fX+vkAoDGlZmZqb59++pnP/uZZsyYoe7du6uyslKbNm3S/Pnza10m+0NpaWlasGCBRowYoT/+8Y8KDQ3Vl19+qRUrVuiVV14xZ7LrqznnGwK5TRYuXKjExMQaYVw6F8jnzJljfrHH008/rd/97nf64osv1LNnT61du1Y+Pj5me39/fz322GP6j//4D/3rX//SrbfeWmMd+vl+9atfyd/fX88884wmTpyogIAAdevWTePHj5d07o4Mc+bM0RdffCEvLy/17t1bGzZskNPJRw6Apmjjxo3m271BQUHq3LmzVq5cqX79+kmSJkyYoPT0dJWVlWnIkCF68sknNW3atMuu73Q6tWLFCj366KO64YYb1KlTJ73wwgtm/cs1efJkff3110pOTpa/v7/GjBmjYcOGqbCwUNK5mavt27dr3rx5KioqUmxsrJ599lkNHjy4TucBYL327dvrk08+0axZs/T73/9eJ0+eVHh4uOLi4jR//vzLqtGmTRvt3LlTjz32mJKSklRWVqbY2FgNGjTIkozRnPONw6jLSn00qq1bt6p///767rvvLvjX2+LFizV+/HgVFBQ0at8AAABgDfv/JAAAAACuYgRyAAAAwEYsWQEAAABsxAw5AAAAYCMCOQAAAGAjAjkAAABgIwI5AAAAYCMCOQAAAGAjAjkAoF62bt0qh8PBF5MBwI9EIAeAq8RDDz0kh8NR4/Hll1/Wq97NN9+skydPKjg4WNK5bw6+0LcKAwAuzNvuDgAAGs+gQYO0aNEij33h4eEe2+Xl5fLx8blkLR8fH0VFRVnaPwC4GjFDDgBXEV9fX0VFRXk8Bg4cqPT0dI0fP16tWrVScnKyjh07JofDoX379pnPLSgokMPh0NatWyV5LlnZunWrRo0apcLCQnPmfdq0aZKkF198UR07dpSfn58iIyP1y1/+svEvHACaMGbIAQBasmSJxo4dq507d9br+TfffLPmzZunKVOm6MiRI5KkwMBA7d27V48++qhee+013XzzzTpz5ow++ugjK7sOAM0egRwAriLr1q1TYGCguT148GBJUseOHTVnzhxz/7Fjx+pU18fHR8HBwXI4HB7LWI4fP66AgADdeeedCgoKUmxsrHr16vXjLgIArjAEcgC4ivTv31/z5883twMCAjRixAjFxcU1yPl+/vOfKzY2Vu3bt9egQYM0aNAg/eIXv5C/v3+DnA8AmiPWkAPAVSQgIEAdOnQwH61btzb3n8/pPPfrwTAMc19FRUWdzxcUFKRPPvlEb7zxhlq3bq0pU6aoR48e3CoRAM5DIAcA1FB955WTJ0+a+87/gGdtfHx8VFVVVWO/t7e3EhMTNWfOHH322Wc6duyYtmzZYml/AaA5Y8kKAKCGli1bKj4+Xk8//bTatWunU6dOafLkyRd9Ttu2bXX27Flt3rxZPXr0kL+/v7Zs2aKvv/5at912m6655hpt2LBBbrdbnTp1aqQrAYCmjxlyAECtXn31VVVWViouLk7jx4/XU089ddH2N998sx555BHde++9Cg8P15w5cxQSEqLVq1drwIAB6tKli1566SW98cYbuv766xvpKgCg6XMY5y8QBAAAANComCEHAAAAbEQgBwAAAGxEIAcAAABsRCAHAAAAbEQgBwAAAGxEIAcAAABsRCAHAAAAbEQgBwAAAGxEIAcAAABsRCAHAAAAbEQgBwAAAGxEIAcAAABs9P8BWiponQPbrDwAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "bar_width = 0.15\n", + "\n", + "plt.figure(figsize=(7.5, 3))\n", + "x = np.arange(len(categories))\n", + "for i, (label, value) in enumerate(sales.items()):\n", + " plt.bar(x, value, width=bar_width, label=label, alpha=0.4)\n", + "plt.xlabel(\"Fruits\")\n", + "plt.ylabel(\"Sales\")\n", + "plt.xticks(x, fruits) # Set x-ticks to fruit names\n", + "plt.legend()\n", + "plt.grid(alpha=0.3)\n", + "plt.tight_layout()\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "dd5bd7f6-ee9d-42c2-b54a-c128f8c25bd1", + "metadata": {}, + "outputs": [], + "source": [ + "# just change the mode to stacked\n", + "m_bar = MultipleBars(categories=categories, bars=sales, mode=\"stacked\")" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "9f887a77-988c-43a6-b125-205d9b387cd8", + "metadata": {}, + "outputs": [], + "source": [ + "m_bar.add_axis_labels(xlabel=\"Fruits\", ylabel=\"Sales\")" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "d3e5cbc1-3e9c-4ca0-945e-21162a55c249", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\\begin{figure}[ht]\n", + "\\centering\n", + "\\tikzstyle{every node}=[font=\\footnotesize]\n", + "\\begin{tikzpicture}\n", + " \\begin{axis}[\n", + " ylabel=Sales,\n", + " xlabel=Fruits,\n", + " xtick={ 0, 1, 2 },\n", + " xticklabels={ Apples, Bananas, Cherries },\n", + " ybar stacked,\n", + " bar width=0.3cm,\n", + " xtick=data,\n", + " width=7.5cm,\n", + " height=3cm,\n", + " at={(0cm,0cm)},\n", + " scale only axis,\n", + " axis background/.style={fill=white},\n", + " grid=both,\n", + " legend columns = 3,\n", + " legend style={at={(1,1.05)}, legend cell align=left, align=left, draw=white!15!black, mark options={draw=none}, anchor=south east},\n", + " ]\n", + " \\addplot[fill=black!70!black,opacity=0.7]\n", + " coordinates {(1,345) (2,234) (3,512)};\n", + " \\addlegendentry{2022};\n", + "\n", + " \\addplot[fill=blue!70!black,opacity=0.7]\n", + " coordinates {(1,420) (2,304) (3,412)};\n", + " \\addlegendentry{2023};\n", + "\n", + " \\addplot[fill=brown!70!black,opacity=0.7]\n", + " coordinates {(1,501) (2,324) (3,242)};\n", + " \\addlegendentry{2024};\n", + "\n", + "\n", + " \\end{axis}\n", + "\\end{tikzpicture}\n", + " \\caption{Caption of the barchart.}\n", + " \\label{fig:Caption of the barchart.}\n", + "\\end{figure}\n" + ] + } + ], + "source": [ + "m_bar.LaTeXcode()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.2" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/LaTeX_layout.tex b/examples/LaTeX_layout.tex index a9dd027..b6b649c 100644 --- a/examples/LaTeX_layout.tex +++ b/examples/LaTeX_layout.tex @@ -115,8 +115,8 @@ \subsection{Boxplot} median=128.73043708220285, upper quartile=134.05952052012063, lower quartile=123.99094329503548, - upper whisker=103.80254895910255, - lower whisker=148.52278184508938 + upper whisker=148.52278184508938, + lower whisker=110.12431085399108 }, ] coordinates {}; \addplot[ @@ -126,8 +126,8 @@ \subsection{Boxplot} median=81.68214339893669, upper quartile=90.76340895325481, lower quartile=63.886789536848525, - upper whisker=41.62457569401917, - lower whisker=134.40338333179238 + upper whisker=129.26484224970574, + lower whisker=41.62457569401917 }, ] coordinates {}; \addplot[ @@ -137,8 +137,8 @@ \subsection{Boxplot} median=122.93087226956357, upper quartile=141.13312343712607, lower quartile=100.33669378132858, - upper whisker=22.761979797927822, - lower whisker=235.58194471964163 + upper whisker=189.43975700020525, + lower whisker=59.24572240027179 }, ] coordinates {}; \end{axis} @@ -147,4 +147,128 @@ \subsection{Boxplot} \label{fig:Caption of the boxplot.} \end{figure} -\end{document} \ No newline at end of file + +\subsection{Bar chart} + +\subsubsection{Default} + +\begin{figure}[ht] + \centering + \tikzstyle{every node}=[font=\footnotesize] + \begin{tikzpicture} + \begin{axis}[ + ylabel=Sales, + xlabel=Fruits, + xticklabels={Apples,Bananas,Cherries}, + ybar, + bar width=0.5cm, + xtick=data, + width=7.5cm, + height=3cm, + at={(0cm,0cm)}, + scale only axis, + axis background/.style={fill=white}, + grid=both, + legend columns = 1, + legend style={at={(1,1.05)}, legend cell align=left, align=left, draw=white!15!black, mark options={draw=none}, anchor=south east}, + ] + + \addplot[fill=black!70!black,opacity=0.7] + coordinates {(1,345) (2,234) (3,512)}; + + \end{axis} + \end{tikzpicture} + \caption{Caption of the default barchart.} + \label{fig:Caption of the default barchart.} +\end{figure} + + +\newpage +\subsubsection{Multiple} + +\begin{figure}[ht] +\centering +\tikzstyle{every node}=[font=\footnotesize] +\begin{tikzpicture} + \begin{axis}[ + ylabel=Sales, + xlabel=Fruits, + xtick={ 0, 1, 2 }, + xticklabels={ Apples, Bananas, Cherries }, + ybar, + bar width=0.3cm, + xtick=data, + width=7.5cm, + height=3cm, + at={(0cm,0cm)}, + scale only axis, + axis background/.style={fill=white}, + grid=both, + legend columns = 3, + legend style={at={(1,1.05)}, legend cell align=left, align=left, draw=white!15!black, mark options={draw=none}, anchor=south east}, + ] + \addplot[fill=black!70!black,opacity=0.7] + coordinates {(1,345) (2,234) (3,512)}; + \addlegendentry{2022}; + + \addplot[fill=blue!70!black,opacity=0.7] + coordinates {(1,420) (2,304) (3,412)}; + \addlegendentry{2023}; + + \addplot[fill=brown!70!black,opacity=0.7] + coordinates {(1,501) (2,324) (3,242)}; + \addlegendentry{2024}; + + + \end{axis} +\end{tikzpicture} + \caption{Caption of the barchart.} + \label{fig:Caption of the barchart.} +\end{figure} + + +\subsubsection{Stacked} + +\begin{figure}[ht] +\centering +\tikzstyle{every node}=[font=\footnotesize] +\begin{tikzpicture} + \begin{axis}[ + ylabel=Sales, + xlabel=Fruits, + xtick={ 0, 1, 2 }, + xticklabels={ Apples, Bananas, Cherries }, + ybar stacked, + bar width=0.3cm, + xtick=data, + width=7.5cm, + height=3cm, + at={(0cm,0cm)}, + scale only axis, + axis background/.style={fill=white}, + grid=both, + legend columns = 3, + legend style={at={(1,1.05)}, legend cell align=left, align=left, draw=white!15!black, mark options={draw=none}, anchor=south east}, + ] + \addplot[fill=black!70!black,opacity=0.7] + coordinates {(1,345) (2,234) (3,512)}; + \addlegendentry{2022}; + + \addplot[fill=blue!70!black,opacity=0.7] + coordinates {(1,420) (2,304) (3,412)}; + \addlegendentry{2023}; + + \addplot[fill=brown!70!black,opacity=0.7] + coordinates {(1,501) (2,324) (3,242)}; + \addlegendentry{2024}; + + + \end{axis} +\end{tikzpicture} + \caption{Caption of the barchart.} + \label{fig:Caption of the barchart.} +\end{figure} + + + +\end{document} diff --git a/images/example_mbar_plot.png b/images/example_mbar_plot.png new file mode 100644 index 0000000..bc59a80 Binary files /dev/null and b/images/example_mbar_plot.png differ diff --git a/images/example_sbar_plot.png b/images/example_sbar_plot.png new file mode 100644 index 0000000..a4d4a4c Binary files /dev/null and b/images/example_sbar_plot.png differ diff --git a/images/example_stbar_plot.png b/images/example_stbar_plot.png new file mode 100644 index 0000000..c5db857 Binary files /dev/null and b/images/example_stbar_plot.png differ diff --git a/plotLaTeX/LaTeX_colors.py b/plotLaTeX/LaTeX_colors.py new file mode 100644 index 0000000..624c15e --- /dev/null +++ b/plotLaTeX/LaTeX_colors.py @@ -0,0 +1,21 @@ +latex_colors = [ + "black", + "blue", + "brown", + "cyan", + "darkgray", + "gray", + "green", + "lightgray", + "lime", + "magenta", + "olive", + "orange", + "pink", + "purple", + "red", + "teal", + "violet", + "white", + "yellow", +] diff --git a/plotLaTeX/__init__.py b/plotLaTeX/__init__.py index 2e16749..82eb1b5 100644 --- a/plotLaTeX/__init__.py +++ b/plotLaTeX/__init__.py @@ -1,5 +1,6 @@ from .line_plot import LinePlot from .hist_plot import HistPlot from .box_plot import BoxPlot +from .bar_plot import Barplot, MultipleBars -__all__ = ["LaTeXplot", "HistPlot", "BoxPlot"] +__all__ = ["LaTeXplot", "HistPlot", "BoxPlot", "Barplot", "MultipleBars"] diff --git a/plotLaTeX/bar_plot.py b/plotLaTeX/bar_plot.py new file mode 100644 index 0000000..a6df556 --- /dev/null +++ b/plotLaTeX/bar_plot.py @@ -0,0 +1,127 @@ +import numpy as np +from .LaTeX_colors import latex_colors + + +class Barplot: + def __init__(self, dataframe, mode="default"): + self.df = dataframe + self.mode = mode + self.xlabel = "x-label" + self.ylabel = "y-label" + self.x_labels = list(self.df.iloc[:, 0]) + self.data_info() + + def data_info(self): + print(self.df) + + def add_axis_labels(self, xlabel, ylabel): + self.xlabel = xlabel + self.ylabel = ylabel + + def set_mode(self, mode): + """ + mode= + - default + - multiple + - stacked + """ + self.bar_mode = mode + + def LaTeXcode(self, imports=True, caption="Caption of the default barchart."): + if imports: + print("\tDon´t forget to import the packages:\n") + print(r"\usepackage{graphicx}") + print(r"\usepackage{tikz,pgfplots}") + print(r"\usepgfplotslibrary{statistics}") + print("\n*\t*********\n") + + print(r"\begin{figure}[ht]") + print(r" \centering") + print(r" \tikzstyle{every node}=[font=\footnotesize]") + print(r" \begin{tikzpicture}") + print(r" \begin{axis}[") + print(f" ylabel={self.ylabel},") + print(f" xlabel={self.xlabel},") + print(f" xticklabels={{{','.join(self.x_labels)}}},") + print(r" ybar,") + print(r" bar width=0.5cm,") + print(r" xtick=data,") + print(r" width=7.5cm,") + print(r" height=3cm,") + print(r" at={(0cm,0cm)},") + print(r" scale only axis,") + print(r" axis background/.style={fill=white},") + print(r" grid=both,") + print(r" legend columns = 1,") + print( + r" legend style={at={(1,1.05)}, legend cell align=left, align=left, draw=white!15!black, mark options={draw=none}, anchor=south east}," + ) + print(r" ]") + print() + print(r" \addplot[fill=black!70!black,opacity=0.7] ") + coordinates = " ".join( + f"({i+1},{row['sales']})" for i, row in self.df.iterrows() + ) + print(f" coordinates {{{coordinates}}};") + # print(r" \addlegendentry{2015};") + print() + print(r" \end{axis}") + print(r" \end{tikzpicture}") + print(r" \caption{" + caption + "}") + print(r" \label{fig:" + caption + "}") + print(r"\end{figure}") + + +class MultipleBars: + def __init__(self, categories: list, bars: dict, mode="multiple"): + self.categories = categories + self.xlabel = "x-label" + self.ylabel = "y-label" + self.xticks = np.arange(len(categories)) + self.bars = bars + self.mode = mode + + def add_axis_labels(self, xlabel, ylabel): + self.xlabel = xlabel + self.ylabel = ylabel + + def LaTeXcode(self, imports=True, caption=f"Caption of the barchart."): + print(r"\begin{figure}[ht]") + print(r"\centering") + print(r"\tikzstyle{every node}=[font=\footnotesize]") + print(r"\begin{tikzpicture}") + print(r" \begin{axis}[") + print(f" ylabel={self.ylabel},") + print(f" xlabel={self.xlabel},") + print(f" xtick={{ {', '.join(map(str, self.xticks))} }},") + print(f" xticklabels={{ {', '.join(self.categories)} }},") + if self.mode == "multiple": + print(r" ybar,") + elif self.mode == "stacked": + print(r" ybar stacked,") + print(r" bar width=0.3cm,") + print(r" xtick=data,") + print(r" width=7.5cm,") + print(r" height=3cm,") + print(r" at={(0cm,0cm)},") + print(r" scale only axis,") + print(r" axis background/.style={fill=white},") + print(r" grid=both,") + print(f" legend columns = {len(self.bars)},") + print( + r" legend style={at={(1,1.05)}, legend cell align=left, align=left, draw=white!15!black, mark options={draw=none}, anchor=south east}," + ) + print(r" ]") + + for i, (x_idx, values) in enumerate(self.bars.items()): + color = latex_colors[i] + print(f" \\addplot[fill={color}!70!black,opacity=0.7]") + coordinates = " ".join(f"({i+1},{value})" for i, value in enumerate(values)) + print(f" coordinates {{{coordinates}}};") + print(f" \\addlegendentry{{{x_idx}}};\n") + print() + print(r" \end{axis}") + print(r"\end{tikzpicture}") + print(r" \caption{" + caption + "}") + print(r" \label{fig:" + caption + "}") + print(r"\end{figure}")