{"spec_id":"dashboard-metrics-tiles","library":"letsplot","language":"python","code":"\"\"\" anyplot.ai\ndashboard-metrics-tiles: Real-Time Dashboard Tiles\nLibrary: letsplot 4.10.1 | Python 3.13.13\nQuality: 88/100 | Updated: 2026-05-21\n\"\"\"\n\nimport os\n\nimport numpy as np\nimport pandas as pd\nfrom lets_plot import (\n    LetsPlot,\n    aes,\n    element_blank,\n    element_rect,\n    element_text,\n    facet_wrap,\n    geom_area,\n    geom_line,\n    geom_point,\n    geom_text,\n    ggplot,\n    ggsize,\n    labs,\n    layer_tooltips,\n    scale_color_manual,\n    scale_fill_manual,\n    scale_x_continuous,\n    scale_y_continuous,\n    theme,\n)\nfrom lets_plot.export import ggsave\n\n\nLetsPlot.setup_html()\n\nTHEME = os.getenv(\"ANYPLOT_THEME\", \"light\")\nPAGE_BG = \"#FAF8F1\" if THEME == \"light\" else \"#1A1A17\"\nELEVATED_BG = \"#FFFDF6\" if THEME == \"light\" else \"#242420\"\nINK = \"#1A1A17\" if THEME == \"light\" else \"#F0EFE8\"\nINK_SOFT = \"#4A4A44\" if THEME == \"light\" else \"#B8B7B0\"\n\n# Status colors: good uses brand green (Okabe-Ito #1), warning amber, critical red\nSTATUS_COLORS = {\"good\": \"#009E73\", \"warning\": \"#F59E0B\", \"critical\": \"#EF4444\", \"bad\": \"#EF4444\"}\n\nnp.random.seed(42)\n\n# Data\nmetrics = [\n    {\"name\": \"CPU Usage\", \"value\": 45, \"unit\": \"%\", \"change\": -5.2, \"status\": \"good\"},\n    {\"name\": \"Memory\", \"value\": 72, \"unit\": \"%\", \"change\": 8.3, \"status\": \"warning\"},\n    {\"name\": \"Response Time\", \"value\": 120, \"unit\": \"ms\", \"change\": -15.1, \"status\": \"good\"},\n    {\"name\": \"Active Users\", \"value\": 1284, \"unit\": \"\", \"change\": 12.5, \"status\": \"good\"},\n    {\"name\": \"Error Rate\", \"value\": 0.8, \"unit\": \"%\", \"change\": -22.0, \"status\": \"good\"},\n    {\"name\": \"Throughput\", \"value\": 847, \"unit\": \"req/s\", \"change\": 3.7, \"status\": \"good\"},\n]\n\nall_data = []\nfor m in metrics:\n    base = m[\"value\"]\n    trend = np.cumsum(np.random.randn(20) * (base * 0.08)) + base * 0.85\n    trend = trend - trend[-1] + base\n\n    value_str = f\"{m['value']:,}\" if m[\"value\"] >= 1000 else str(m[\"value\"])\n    value_display = f\"{value_str}{m['unit']}\"\n\n    change = m[\"change\"]\n    if change >= 0:\n        arrow = \"▲\"\n        change_color = \"bad\" if m[\"name\"] in [\"CPU Usage\", \"Memory\", \"Error Rate\", \"Response Time\"] else \"good\"\n    else:\n        arrow = \"▼\"\n        change_color = \"good\" if m[\"name\"] in [\"CPU Usage\", \"Memory\", \"Error Rate\", \"Response Time\"] else \"bad\"\n\n    change_str = f\"{arrow} {abs(change):.1f}%\"\n\n    # Prepend warning badge to facet strip label for prominent visual distinction\n    facet_label = f\"⚠  {m['name']}\" if m[\"status\"] == \"warning\" else m[\"name\"]\n\n    for i, val in enumerate(trend):\n        all_data.append(\n            {\n                \"metric\": facet_label,\n                \"x\": i,\n                \"y\": val,\n                \"status\": m[\"status\"],\n                \"value_label\": value_display if i == 10 else \"\",\n                \"change_label\": change_str if i == 10 else \"\",\n                \"change_color\": change_color,\n                \"is_last\": i == len(trend) - 1,\n            }\n        )\n\ndf = pd.DataFrame(all_data)\nlast_points = df[df[\"is_last\"]].copy()\nlabel_data = df[df[\"value_label\"] != \"\"].copy()\n\ny_stats = df.groupby(\"metric\").agg({\"y\": [\"min\", \"max\"]}).reset_index()\ny_stats.columns = [\"metric\", \"y_min\", \"y_max\"]\n\nlabel_data = label_data.merge(y_stats, on=\"metric\")\nlabel_data[\"y_value\"] = label_data[\"y_max\"] + (label_data[\"y_max\"] - label_data[\"y_min\"]) * 0.55\nlabel_data[\"y_change\"] = label_data[\"y_min\"] - (label_data[\"y_max\"] - label_data[\"y_min\"]) * 0.40\n\n# Plot\nplot = (\n    ggplot(df, aes(\"x\", \"y\"))\n    + geom_area(aes(fill=\"status\"), alpha=0.25, show_legend=False, tooltips=\"none\")\n    + geom_line(\n        aes(color=\"status\"), size=2, show_legend=False, tooltips=layer_tooltips().line(\"@metric\").line(\"value|@y{.1f}\")\n    )\n    + geom_point(\n        data=last_points,\n        mapping=aes(color=\"status\"),\n        size=5,\n        show_legend=False,\n        tooltips=layer_tooltips().line(\"@metric\").line(\"current|@y{.1f}\"),\n    )\n    + geom_text(\n        data=label_data, mapping=aes(x=\"x\", y=\"y_value\", label=\"value_label\"), size=22, fontface=\"bold\", color=INK\n    )\n    + geom_text(\n        data=label_data,\n        mapping=aes(x=\"x\", y=\"y_change\", label=\"change_label\", color=\"change_color\"),\n        size=14,\n        show_legend=False,\n    )\n    + scale_fill_manual(values=STATUS_COLORS)\n    + scale_color_manual(values=STATUS_COLORS)\n    + scale_x_continuous(expand=[0.05, 0.05])\n    + scale_y_continuous(expand=[0.55, 0.55])\n    + facet_wrap(\"metric\", ncol=3, scales=\"free_y\")\n    + labs(title=\"dashboard-metrics-tiles · python · letsplot · anyplot.ai\")\n    + theme(\n        plot_title=element_text(size=16, face=\"bold\", color=INK, hjust=0.5),\n        strip_text=element_text(size=14, face=\"bold\", color=INK_SOFT),\n        strip_background=element_rect(fill=ELEVATED_BG, color=INK_SOFT),\n        axis_text=element_blank(),\n        axis_ticks=element_blank(),\n        axis_title=element_blank(),\n        axis_line=element_blank(),\n        panel_grid=element_blank(),\n        panel_background=element_rect(fill=ELEVATED_BG, color=INK_SOFT, size=1),\n        plot_background=element_rect(fill=PAGE_BG, color=PAGE_BG),\n        legend_background=element_rect(fill=ELEVATED_BG, color=INK_SOFT),\n        panel_spacing_x=30,\n        panel_spacing_y=30,\n    )\n    + ggsize(800, 450)\n)\n\n# Save\nggsave(plot, f\"plot-{THEME}.png\", path=\".\", scale=4)\nggsave(plot, f\"plot-{THEME}.html\", path=\".\")\n"}