{"spec_id":"subplot-mosaic","library":"seaborn","language":"python","code":"\"\"\" anyplot.ai\nsubplot-mosaic: Mosaic Subplot Layout with Varying Sizes\nLibrary: seaborn 0.13.2 | Python 3.13.13\nQuality: 73/100 | Updated: 2026-05-14\n\"\"\"\n\nimport matplotlib.pyplot as plt\nimport numpy as np\nimport pandas as pd\nimport seaborn as sns\n\n\n# Data\nnp.random.seed(42)\n\n# Time series data for main overview (Panel A - wide)\ndates = pd.date_range(\"2024-01-01\", periods=100, freq=\"D\")\nrevenue = np.cumsum(np.random.randn(100) * 500 + 200) + 50000\ndf_overview = pd.DataFrame({\"Date\": dates, \"Revenue ($)\": revenue})\n\n# Scatter data for panel B (top right)\ndf_scatter = pd.DataFrame(\n    {\n        \"Marketing Spend ($K)\": np.random.uniform(10, 100, 50),\n        \"Conversions\": np.random.uniform(100, 1000, 50) + np.random.randn(50) * 100,\n    }\n)\n\n# Bar data for panel C (middle left detail)\ncategories = [\"Online\", \"Retail\", \"Partner\", \"Direct\"]\ndf_bar = pd.DataFrame({\"Channel\": categories, \"Sales ($K)\": [450, 320, 180, 275]})\n\n# Histogram data for panel D (middle right detail)\nresponse_times = np.concatenate([np.random.normal(45, 10, 300), np.random.normal(120, 25, 100)])\ndf_hist = pd.DataFrame({\"Response Time (ms)\": response_times})\n\n# Line data for panel E (bottom left metric)\nhours = np.arange(24)\ncpu_usage = 30 + 20 * np.sin(hours * np.pi / 12) + np.random.randn(24) * 5\ndf_cpu = pd.DataFrame({\"Hour\": hours, \"CPU Usage (%)\": cpu_usage})\n\n# Line data for panel F (bottom center metric)\nmemory_usage = 55 + 15 * np.sin(hours * np.pi / 10 + 2) + np.random.randn(24) * 3\ndf_memory = pd.DataFrame({\"Hour\": hours, \"Memory Usage (%)\": memory_usage})\n\n# Box data for panel G (bottom right metric)\nregions = [\"North\", \"South\", \"East\", \"West\"]\ndf_box = pd.DataFrame(\n    {\n        \"Region\": np.repeat(regions, 30),\n        \"Latency (ms)\": np.concatenate(\n            [\n                np.random.normal(25, 5, 30),\n                np.random.normal(35, 8, 30),\n                np.random.normal(28, 4, 30),\n                np.random.normal(40, 10, 30),\n            ]\n        ),\n    }\n)\n\n# Create mosaic layout: \"AAB;CCD;EFG\" pattern\n# A spans 2 cols (wide overview), B is 1 col (scatter)\n# C spans 2 cols (bar chart middle), D is 1 col (histogram)\n# E, F, G each 1 col (three small metrics)\nfig, axes = plt.subplot_mosaic(\n    [[\"A\", \"A\", \"B\"], [\"C\", \"C\", \"D\"], [\"E\", \"F\", \"G\"]], figsize=(16, 9), height_ratios=[1.2, 1, 0.8]\n)\n\n# Panel A: Revenue Overview (Line plot - wide)\nsns.lineplot(data=df_overview, x=\"Date\", y=\"Revenue ($)\", ax=axes[\"A\"], color=\"#306998\", linewidth=2.5)\naxes[\"A\"].set_title(\"Revenue Trend Overview\", fontsize=18, fontweight=\"bold\")\naxes[\"A\"].set_xlabel(\"Date\", fontsize=14)\naxes[\"A\"].set_ylabel(\"Revenue ($)\", fontsize=14)\naxes[\"A\"].tick_params(axis=\"both\", labelsize=11)\naxes[\"A\"].xaxis.set_major_locator(plt.MaxNLocator(6))\naxes[\"A\"].grid(True, alpha=0.3, linestyle=\"--\")\n\n# Panel B: Marketing vs Conversions (Scatter)\nsns.scatterplot(\n    data=df_scatter,\n    x=\"Marketing Spend ($K)\",\n    y=\"Conversions\",\n    ax=axes[\"B\"],\n    color=\"#FFD43B\",\n    s=100,\n    alpha=0.7,\n    edgecolor=\"#306998\",\n    linewidth=1,\n)\naxes[\"B\"].set_title(\"Marketing ROI\", fontsize=16, fontweight=\"bold\")\naxes[\"B\"].set_xlabel(\"Marketing Spend ($K)\", fontsize=13)\naxes[\"B\"].set_ylabel(\"Conversions\", fontsize=13)\naxes[\"B\"].tick_params(axis=\"both\", labelsize=10)\naxes[\"B\"].grid(True, alpha=0.3, linestyle=\"--\")\n\n# Panel C: Sales by Channel (Bar - wide)\nsns.barplot(\n    data=df_bar,\n    x=\"Channel\",\n    y=\"Sales ($K)\",\n    ax=axes[\"C\"],\n    hue=\"Channel\",\n    palette=[\"#306998\", \"#FFD43B\", \"#4B8BBE\", \"#FFE873\"],\n    legend=False,\n)\naxes[\"C\"].set_title(\"Sales by Channel\", fontsize=16, fontweight=\"bold\")\naxes[\"C\"].set_xlabel(\"Channel\", fontsize=13)\naxes[\"C\"].set_ylabel(\"Sales ($K)\", fontsize=13)\naxes[\"C\"].tick_params(axis=\"both\", labelsize=10)\naxes[\"C\"].grid(True, axis=\"y\", alpha=0.3, linestyle=\"--\")\n\n# Panel D: Response Time Distribution (Histogram)\nsns.histplot(data=df_hist, x=\"Response Time (ms)\", ax=axes[\"D\"], bins=30, color=\"#306998\", alpha=0.7, edgecolor=\"white\")\naxes[\"D\"].set_title(\"Response Times\", fontsize=16, fontweight=\"bold\")\naxes[\"D\"].set_xlabel(\"Response Time (ms)\", fontsize=13)\naxes[\"D\"].set_ylabel(\"Count\", fontsize=13)\naxes[\"D\"].tick_params(axis=\"both\", labelsize=10)\naxes[\"D\"].grid(True, axis=\"y\", alpha=0.3, linestyle=\"--\")\n\n# Panel E: CPU Usage (Small line)\nsns.lineplot(data=df_cpu, x=\"Hour\", y=\"CPU Usage (%)\", ax=axes[\"E\"], color=\"#306998\", linewidth=2)\naxes[\"E\"].set_title(\"CPU Usage\", fontsize=14, fontweight=\"bold\")\naxes[\"E\"].set_xlabel(\"Hour\", fontsize=11)\naxes[\"E\"].set_ylabel(\"CPU (%)\", fontsize=11)\naxes[\"E\"].tick_params(axis=\"both\", labelsize=9)\naxes[\"E\"].set_xticks([0, 6, 12, 18, 23])\naxes[\"E\"].grid(True, alpha=0.3, linestyle=\"--\")\n\n# Panel F: Memory Usage (Small line)\nsns.lineplot(data=df_memory, x=\"Hour\", y=\"Memory Usage (%)\", ax=axes[\"F\"], color=\"#FFD43B\", linewidth=2)\naxes[\"F\"].set_title(\"Memory Usage\", fontsize=14, fontweight=\"bold\")\naxes[\"F\"].set_xlabel(\"Hour\", fontsize=11)\naxes[\"F\"].set_ylabel(\"Memory (%)\", fontsize=11)\naxes[\"F\"].tick_params(axis=\"both\", labelsize=9)\naxes[\"F\"].set_xticks([0, 6, 12, 18, 23])\naxes[\"F\"].grid(True, alpha=0.3, linestyle=\"--\")\n\n# Panel G: Latency by Region (Small box)\nsns.boxplot(\n    data=df_box,\n    x=\"Region\",\n    y=\"Latency (ms)\",\n    ax=axes[\"G\"],\n    hue=\"Region\",\n    palette=[\"#306998\", \"#FFD43B\", \"#4B8BBE\", \"#FFE873\"],\n    legend=False,\n)\naxes[\"G\"].set_title(\"Latency\", fontsize=14, fontweight=\"bold\")\naxes[\"G\"].set_xlabel(\"Region\", fontsize=11)\naxes[\"G\"].set_ylabel(\"Latency (ms)\", fontsize=11)\naxes[\"G\"].tick_params(axis=\"both\", labelsize=9)\naxes[\"G\"].grid(True, axis=\"y\", alpha=0.3, linestyle=\"--\")\n\n# Main title\nfig.suptitle(\"subplot-mosaic · seaborn · pyplots.ai\", fontsize=22, fontweight=\"bold\", y=0.98)\n\nplt.tight_layout(rect=[0, 0, 1, 0.95])\nplt.savefig(\"plot.png\", dpi=300, bbox_inches=\"tight\")\n"}