{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Trees in Paris" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Extract compressed file\n", "import tarfile\n", "\n", "with tarfile.open(\"trees.tar.gz\", \"r:gz\") as tar:\n", " tar.extractall()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from json import load\n", "import pandas as pd\n", "\n", "from ipywidgets import Text, VBox\n", "from bqplot import LinearScale, ColorScale, OrdinalColorScale, OrdinalScale\n", "\n", "from py2vega.functions.color import rgb\n", "\n", "from ipydatagrid import DataGrid, TextRenderer, BarRenderer, Expr\n", "\n", "with open(\"./trees.json\") as fobj:\n", " data = load(fobj)\n", "\n", "df = pd.DataFrame(data[\"data\"]).drop(\"index\", axis=1)\n", "df = df[sorted(df.columns)]\n", "\n", "# Get list of possible tree species and kinds for the ordinal color scales\n", "species = list(\n", " set(\n", " [\n", " tree[\"Species\"]\n", " for tree in data[\"data\"]\n", " if tree[\"Species\"] is not None\n", " ]\n", " )\n", ")\n", "kinds = list(\n", " set([tree[\"Kind\"] for tree in data[\"data\"] if tree[\"Kind\"] is not None])\n", ")\n", "\n", "# Text box for highlighting tree names\n", "highlight_box = Text(description=\"Highlight: \", value=\"Platane\")\n", "name_background_color = Expr(\n", " \"'lightgreen' if '{}' in cell.value else default_value\".format(\n", " highlight_box.value\n", " )\n", ")\n", "\n", "\n", "def on_textbox_changed(*args, **kwargs):\n", " name_background_color.value = (\n", " \"'lightgreen' if '{}' in cell.value else default_value\".format(\n", " highlight_box.value\n", " )\n", " )\n", "\n", "\n", "highlight_box.observe(on_textbox_changed, \"value\")\n", "\n", "\n", "def circumference_color(cell):\n", " color_value = 255 if cell.value > 300 else (cell.value / 300) * 255\n", " return rgb(0, color_value, color_value)\n", "\n", "\n", "renderers = {\n", " \"French_name\": TextRenderer(background_color=name_background_color),\n", " \"Height_m\": BarRenderer(\n", " bar_value=LinearScale(min=0, max=30),\n", " bar_color=ColorScale(min=0, max=30, scheme=\"viridis\"),\n", " horizontal_alignment=\"center\",\n", " ),\n", " \"Species\": TextRenderer(\n", " text_color=\"black\", background_color=OrdinalColorScale(domain=species)\n", " ),\n", " \"Kind\": TextRenderer(\n", " text_color=\"black\", background_color=OrdinalColorScale(domain=kinds)\n", " ),\n", " \"Type\": TextRenderer(missing=\"Unspecified\"),\n", " \"Circumference_cm\": BarRenderer(\n", " bar_value=LinearScale(min=0, max=300),\n", " bar_color=Expr(circumference_color),\n", " horizontal_alignment=\"center\",\n", " ),\n", "}\n", "\n", "datagrid = DataGrid(\n", " df, base_row_size=32, base_column_size=90, renderers=renderers\n", ")\n", "VBox((highlight_box, datagrid))" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def circumference_color(cell):\n", " color_value = 255 if cell.value > 300 else (cell.value / 300) * 255\n", " return rgb(color_value, 0, 0)\n", "\n", "\n", "renderers[\"Circumference_cm\"].bar_color.value = circumference_color" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "datagrid.transform(\n", " [\n", " {\"type\": \"sort\", \"columnIndex\": 5},\n", " {\n", " \"type\": \"filter\",\n", " \"operator\": \"=\",\n", " \"columnIndex\": 4,\n", " \"value\": \"Platane\",\n", " },\n", " ]\n", ")" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "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.6.6" } }, "nbformat": 4, "nbformat_minor": 4 }