{"spec_id":"qrcode-basic","library":"altair","language":"python","code":"\"\"\" anyplot.ai\nqrcode-basic: Basic QR Code Generator\nLibrary: altair 6.2.2 | Python 3.13.14\nQuality: 87/100 | Updated: 2026-06-24\n\"\"\"\n\nimport os\nimport sys\n\n\n# Remove script directory from sys.path to avoid importing local altair.py\n_script_dir = os.path.dirname(os.path.abspath(__file__))\nif _script_dir in sys.path:\n    sys.path.remove(_script_dir)\n\nimport altair as alt\nimport numpy as np\nimport pandas as pd\nimport qrcode\nfrom PIL import Image\n\n\n# Theme tokens (Imprint palette)\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# Imprint categorical palette — structurally distinct region colors\nFINDER_COLOR = \"#009E73\"  # Imprint 1 (green)  — corner orientation markers\nTIMING_COLOR = \"#C475FD\"  # Imprint 2 (purple) — row/column timing strips\nDATA_COLOR = \"#4467A3\"  # Imprint 3 (blue)   — encoded data modules\n\n# Data — real, scannable QR code encoding anyplot.ai\ncontent = \"https://anyplot.ai\"\n\nqr = qrcode.QRCode(version=1, error_correction=qrcode.constants.ERROR_CORRECT_M, box_size=1, border=0)\nqr.add_data(content)\nqr.make(fit=True)\n\nqr_matrix = np.array(qr.get_matrix(), dtype=int)\nquiet_zone = 4\npadded = np.zeros((qr_matrix.shape[0] + 2 * quiet_zone, qr_matrix.shape[1] + 2 * quiet_zone), dtype=int)\npadded[quiet_zone : quiet_zone + qr_matrix.shape[0], quiet_zone : quiet_zone + qr_matrix.shape[1]] = qr_matrix\ntotal_size = padded.shape[0]\n\n# Build DataFrame with structural region classification\nrows, cols = np.where(np.ones_like(padded, dtype=bool))\nrecords = []\nfor r, c in zip(rows, cols, strict=True):\n    qr_r, qr_c = r - quiet_zone, c - quiet_zone\n    if qr_r < 0 or qr_r >= qr_matrix.shape[0] or qr_c < 0 or qr_c >= qr_matrix.shape[1]:\n        region = \"Quiet Zone\"\n    elif (\n        (qr_r < 7 and qr_c < 7)\n        or (qr_r < 7 and qr_c >= qr_matrix.shape[1] - 7)\n        or (qr_r >= qr_matrix.shape[0] - 7 and qr_c < 7)\n    ):\n        region = \"Finder Pattern\"\n    elif qr_r == 6 or qr_c == 6:\n        region = \"Timing Pattern\"\n    else:\n        region = \"Data\"\n    val = padded[r, c]\n    display_region = region if val == 1 else \"Background\"\n    records.append({\"x\": c, \"y\": total_size - 1 - r, \"value\": val, \"region\": region, \"display\": display_region})\n\ndata = pd.DataFrame(records)\n\n# Color mapping: dark modules use Imprint palette; background cells use PAGE_BG\ndisplay_domain = [\"Finder Pattern\", \"Timing Pattern\", \"Data\", \"Background\"]\ndisplay_colors = [FINDER_COLOR, TIMING_COLOR, DATA_COLOR, PAGE_BG]\n\n# Plot — QR code with color-annotated structural regions\nchart = (\n    alt.Chart(data)\n    .mark_rect(stroke=None, strokeWidth=0)\n    .encode(\n        x=alt.X(\"x:O\", axis=None),\n        y=alt.Y(\"y:O\", axis=None),\n        color=alt.Color(\n            \"display:N\",\n            scale=alt.Scale(domain=display_domain, range=display_colors),\n            legend=alt.Legend(\n                title=\"QR Code Regions\",\n                titleFontSize=12,\n                labelFontSize=10,\n                orient=\"bottom\",\n                direction=\"horizontal\",\n                values=[\"Finder Pattern\", \"Timing Pattern\", \"Data\"],\n            ),\n        ),\n        tooltip=[\n            alt.Tooltip(\"region:N\", title=\"Region\"),\n            alt.Tooltip(\"x:O\", title=\"Col\"),\n            alt.Tooltip(\"y:O\", title=\"Row\"),\n        ],\n    )\n    .properties(\n        width=468,\n        height=468,\n        background=PAGE_BG,\n        title=alt.Title(\n            \"qrcode-basic · python · altair · anyplot.ai\",\n            subtitle=\"Finder Patterns (green) for corner orientation · Timing Patterns (purple) for grid alignment · Data modules (blue)\",\n            fontSize=16,\n            subtitleFontSize=11,\n            subtitleColor=INK_SOFT,\n            color=INK,\n            anchor=\"middle\",\n        ),\n    )\n    .configure_view(strokeWidth=0, fill=PAGE_BG)\n    .configure_axis(grid=False)\n    .configure_legend(\n        fillColor=ELEVATED_BG,\n        strokeColor=INK_SOFT,\n        symbolStrokeWidth=0,\n        padding=16,\n        labelColor=INK_SOFT,\n        titleColor=INK,\n    )\n)\n\n# Save — square canvas 2400×2400; pad if vl-convert undershoots\nTW, TH = 2400, 2400\nchart.save(f\"plot-{THEME}.png\", scale_factor=4.0)\n\n_img = Image.open(f\"plot-{THEME}.png\").convert(\"RGB\")\n_w, _h = _img.size\nif _w > TW or _h > TH:\n    raise SystemExit(\n        f\"altair vl-convert produced {_w}×{_h}, exceeds target {TW}×{TH}. \"\n        f\"Shrink chart .properties(width=, height=) values and re-render.\"\n    )\nif _w < TW or _h < TH:\n    _canvas = Image.new(\"RGB\", (TW, TH), PAGE_BG)\n    _canvas.paste(_img, ((TW - _w) // 2, (TH - _h) // 2))\n    _canvas.save(f\"plot-{THEME}.png\")\n\nchart.save(f\"plot-{THEME}.html\")\n"}