{"spec_id":"datamatrix-basic","library":"letsplot","language":"python","code":"\"\"\" anyplot.ai\ndatamatrix-basic: Basic Data Matrix 2D Barcode\nLibrary: letsplot 4.9.0 | Python 3.13.13\nQuality: 92/100 | Updated: 2026-05-20\n\"\"\"\n\nimport os\n\nimport numpy as np\nimport pandas as pd\nfrom lets_plot import (\n    LetsPlot,\n    aes,\n    coord_fixed,\n    element_rect,\n    element_text,\n    geom_tile,\n    ggplot,\n    ggsize,\n    labs,\n    layer_tooltips,\n    scale_fill_manual,\n    theme,\n    theme_void,\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\"\nINK = \"#1A1A17\" if THEME == \"light\" else \"#F0EFE8\"\nINK_SOFT = \"#4A4A44\" if THEME == \"light\" else \"#B8B7B0\"\n\n# Data Matrix encoding — 14×14 matrix (ISO/IEC 16022, ECC 200 structure)\nsize = 14\ncontent = \"MED-SN:A7B2C9D1\"\n\nmatrix = np.zeros((size, size), dtype=int)\n\n# L-shaped finder pattern: solid black on left column and bottom row\nmatrix[:, 0] = 1\nmatrix[-1, :] = 1\n\n# Alternating clock pattern on top row and right column\nmatrix[0, :] = [1 if i % 2 == 0 else 0 for i in range(size)]\nmatrix[:, -1] = [1 if i % 2 == 0 else 0 for i in range(size)]\n\n# Data region: pseudo-random fill seeded from content (simulating ECC 200 encoding)\ndata_hash = sum(ord(c) for c in content)\nnp.random.seed(data_hash)\nfor i in range(1, size - 1):\n    for j in range(1, size - 1):\n        matrix[i, j] = np.random.randint(0, 2)\n\n# Quiet zone (1-module border per ISO/IEC 16022 spec)\nquiet_zone = 1\nfull_size = size + 2 * quiet_zone\nfull_matrix = np.zeros((full_size, full_size), dtype=int)\nfull_matrix[quiet_zone : quiet_zone + size, quiet_zone : quiet_zone + size] = matrix\n\n# Convert to long-form DataFrame — classify each cell by structural region for storytelling\nrows = []\nfor i in range(full_size):\n    for j in range(full_size):\n        qi, qj = i - quiet_zone, j - quiet_zone\n        if qi < 0 or qi >= size or qj < 0 or qj >= size:\n            region = \"Quiet Zone\"\n        elif qj == 0 or qi == size - 1:\n            region = \"Finder Pattern (L-shape)\"\n        elif qi == 0 or qj == size - 1:\n            region = \"Timing Pattern (alternating)\"\n        else:\n            region = \"Data Region (ECC 200)\"\n        rows.append({\"x\": j, \"y\": full_size - 1 - i, \"value\": int(full_matrix[i, j]), \"region\": region})\n\ndf = pd.DataFrame(rows)\n\n# lets-plot interactive tooltip — hover reveals structural region; distinctive lets-plot feature\ntooltips = layer_tooltips().line(\"@region\").line(\"Encoded: \" + content)\n\n# Plot\nplot = (\n    ggplot(df, aes(x=\"x\", y=\"y\", fill=\"value\"))\n    + geom_tile(tooltips=tooltips)\n    + scale_fill_manual(values=[\"#FFFFFF\", \"#000000\"])\n    + coord_fixed()\n    + labs(\n        title=\"datamatrix-basic · python · letsplot · anyplot.ai\",\n        subtitle=f\"Encoded: {content}  ·  14×14 ECC 200  ·  ISO/IEC 16022\",\n    )\n    + theme_void()\n    + theme(\n        plot_background=element_rect(fill=PAGE_BG, color=PAGE_BG),\n        panel_background=element_rect(fill=PAGE_BG),\n        plot_title=element_text(size=16, face=\"bold\", hjust=0.5, color=INK),\n        plot_subtitle=element_text(size=11, hjust=0.5, color=INK_SOFT),\n        legend_position=\"none\",\n    )\n    + ggsize(600, 640)\n)\n\n# Save\nggsave(plot, f\"plot-{THEME}.png\", path=\".\", scale=4)\nggsave(plot, f\"plot-{THEME}.html\", path=\".\")\n"}