{"spec_id":"renko-basic","library":"altair","language":"python","code":"\"\"\" anyplot.ai\nrenko-basic: Basic Renko Chart\nLibrary: altair 6.1.0 | Python 3.13.13\nQuality: 91/100 | Updated: 2026-05-17\n\"\"\"\n\nimport os\nimport sys\n\n\n# Workaround for import conflict: altair.py shadows the altair library\n# Remove the script directory from sys.path before importing\n_script_dir = os.path.dirname(os.path.abspath(__file__))\nsys.path = [p for p in sys.path if os.path.abspath(p) != _script_dir]\n\nimport altair as alt\nimport numpy as np\nimport pandas as pd\n\n\n# Theme tokens (see prompts/default-style-guide.md \"Background\" + \"Theme-adaptive Chrome\")\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# Okabe-Ito colors (positions 1 and 2 for bullish/bearish)\nBULLISH = \"#009E73\"  # Okabe-Ito position 1\nBEARISH = \"#AE3030\"  # imprint red — bearish\n\n# Data - Generate realistic stock price data\nnp.random.seed(42)\nn_days = 250\n\n# Simulate stock price with random walk and trend\nreturns = np.random.normal(0.001, 0.015, n_days)\nprice = 100 * np.cumprod(1 + returns)\n\n# Calculate Renko bricks\nbrick_size = 2.0  # $2 brick size\n\nbricks = []\nlast_brick_price = round(price[0] / brick_size) * brick_size\n\nfor p in price:\n    while True:\n        if p >= last_brick_price + brick_size:\n            # Bullish brick\n            brick_open = last_brick_price\n            brick_close = last_brick_price + brick_size\n            bricks.append({\"brick_idx\": len(bricks), \"open\": brick_open, \"close\": brick_close, \"direction\": \"Bullish\"})\n            last_brick_price = brick_close\n        elif p <= last_brick_price - brick_size:\n            # Bearish brick\n            brick_open = last_brick_price\n            brick_close = last_brick_price - brick_size\n            bricks.append({\"brick_idx\": len(bricks), \"open\": brick_open, \"close\": brick_close, \"direction\": \"Bearish\"})\n            last_brick_price = brick_close\n        else:\n            break\n\ndf_bricks = pd.DataFrame(bricks)\n\n# Calculate brick positions for visualization\ndf_bricks[\"y1\"] = df_bricks[[\"open\", \"close\"]].min(axis=1)\ndf_bricks[\"y2\"] = df_bricks[[\"open\", \"close\"]].max(axis=1)\ndf_bricks[\"x1\"] = df_bricks[\"brick_idx\"]\ndf_bricks[\"x2\"] = df_bricks[\"brick_idx\"] + 0.85  # Gap between bricks\n\n# Create Renko chart\nchart = (\n    alt.Chart(df_bricks)\n    .mark_rect(strokeWidth=1, stroke=INK_SOFT)\n    .encode(\n        x=alt.X(\"x1:Q\", title=\"Brick Index\", scale=alt.Scale(nice=False)),\n        x2=\"x2:Q\",\n        y=alt.Y(\"y1:Q\", title=\"Price ($)\", scale=alt.Scale(zero=False)),\n        y2=\"y2:Q\",\n        color=alt.Color(\n            \"direction:N\",\n            scale=alt.Scale(domain=[\"Bullish\", \"Bearish\"], range=[BULLISH, BEARISH]),\n            legend=alt.Legend(title=\"Direction\", titleFontSize=18, labelFontSize=16, orient=\"top-right\"),\n        ),\n        tooltip=[\n            alt.Tooltip(\"brick_idx:Q\", title=\"Brick #\"),\n            alt.Tooltip(\"open:Q\", title=\"Open\", format=\"$.2f\"),\n            alt.Tooltip(\"close:Q\", title=\"Close\", format=\"$.2f\"),\n            alt.Tooltip(\"direction:N\", title=\"Direction\"),\n        ],\n    )\n    .properties(\n        width=1600,\n        height=900,\n        title=alt.Title(\"renko-basic · altair · anyplot.ai\", fontSize=28, anchor=\"middle\"),\n        background=PAGE_BG,\n    )\n    .interactive()\n    .configure_view(fill=PAGE_BG, stroke=INK_SOFT, strokeWidth=0)\n    .configure_axis(\n        labelFontSize=18,\n        titleFontSize=22,\n        labelColor=INK_SOFT,\n        titleColor=INK,\n        gridColor=INK,\n        gridOpacity=0.10,\n        domainColor=INK_SOFT,\n        tickColor=INK_SOFT,\n    )\n    .configure_title(color=INK)\n    .configure_legend(fillColor=ELEVATED_BG, strokeColor=INK_SOFT, labelColor=INK_SOFT, titleColor=INK)\n)\n\n# Save outputs\nchart.save(f\"plot-{THEME}.png\", scale_factor=3.0)\nchart.save(f\"plot-{THEME}.html\")\n"}