{"spec_id":"renko-basic","library":"seaborn","language":"python","code":"\"\"\" anyplot.ai\nrenko-basic: Basic Renko Chart\nLibrary: seaborn 0.13.2 | Python 3.13.13\nQuality: 86/100 | Updated: 2026-05-17\n\"\"\"\n\nimport os\n\nimport matplotlib.pyplot as plt\nimport numpy as np\nimport pandas as pd\nfrom matplotlib.patches import Rectangle\n\n\n# Theme tokens\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# imprint semantic anchors\nBULLISH = \"#009E73\"  # green — up bricks\nBEARISH = \"#AE3030\"  # red — down bricks\n\n# Generate synthetic stock price data\nnp.random.seed(42)\nn_days = 250\ndates = pd.date_range(\"2025-01-01\", periods=n_days, freq=\"D\")\n\n# Simulate price movement with random walk\nreturns = np.random.normal(0.0005, 0.015, n_days)\nprices = 100 * np.cumprod(1 + returns)\n\ndf = pd.DataFrame({\"date\": dates, \"close\": prices})\n\n# Renko brick calculation\nbrick_size = 2.0  # $2 per brick\nbricks = []\n\n# Start from first price\ncurrent_price = df[\"close\"].iloc[0]\nbrick_high = np.floor(current_price / brick_size) * brick_size\nbrick_low = brick_high\n\nfor price in df[\"close\"]:\n    # Check for upward bricks\n    while price >= brick_high + brick_size:\n        brick_high += brick_size\n        brick_low = brick_high - brick_size\n        bricks.append({\"direction\": \"up\", \"open\": brick_low, \"close\": brick_high})\n\n    # Check for downward bricks\n    while price <= brick_low - brick_size:\n        brick_low -= brick_size\n        brick_high = brick_low + brick_size\n        bricks.append({\"direction\": \"down\", \"open\": brick_high, \"close\": brick_low})\n\nrenko_df = pd.DataFrame(bricks)\n\n# Create figure\nfig, ax = plt.subplots(figsize=(16, 9), facecolor=PAGE_BG)\nax.set_facecolor(PAGE_BG)\n\n# Gap ratio for small separation between bricks\ngap_ratio = 0.08\nbrick_width = 1.0 - gap_ratio\n\n# Draw bricks in proper stair-step pattern\nfor idx, row in renko_df.iterrows():\n    bottom = min(row[\"open\"], row[\"close\"])\n    x_pos = idx + gap_ratio / 2\n\n    if row[\"direction\"] == \"up\":\n        rect = Rectangle((x_pos, bottom), brick_width, brick_size, facecolor=BULLISH, edgecolor=INK_SOFT, linewidth=1.5)\n    else:\n        rect = Rectangle((x_pos, bottom), brick_width, brick_size, facecolor=BEARISH, edgecolor=INK_SOFT, linewidth=1.5)\n\n    ax.add_patch(rect)\n\n# Add legend handles\nlegend_handles = [\n    Rectangle((0, 0), 1, 1, facecolor=BULLISH, edgecolor=INK_SOFT, label=\"Bullish (Up)\"),\n    Rectangle((0, 0), 1, 1, facecolor=BEARISH, edgecolor=INK_SOFT, label=\"Bearish (Down)\"),\n]\n\n# Set axis limits with padding\nprice_min = renko_df[[\"open\", \"close\"]].min().min() - brick_size\nprice_max = renko_df[[\"open\", \"close\"]].max().max() + brick_size\nax.set_ylim(price_min, price_max)\nax.set_xlim(-0.5, len(renko_df) + 0.5)\n\n# Labels and styling\nax.set_xlabel(\"Brick Number\", fontsize=20, color=INK)\nax.set_ylabel(\"Stock Price (USD)\", fontsize=20, color=INK)\nax.set_title(\"renko-basic · seaborn · anyplot.ai\", fontsize=24, fontweight=\"medium\", color=INK)\nax.tick_params(axis=\"both\", labelsize=16, colors=INK_SOFT)\n\n# Add legend positioned outside plot area\nax.legend(handles=legend_handles, fontsize=16, loc=\"upper right\", frameon=True, facecolor=PAGE_BG, edgecolor=INK_SOFT)\n\n# Add subtle grid on y-axis only\nax.grid(True, alpha=0.10, linestyle=\"-\", axis=\"y\", linewidth=0.8, color=INK_SOFT)\nax.set_axisbelow(True)\n\n# Simplify x-axis ticks for cleaner look\ntick_step = max(1, len(renko_df) // 10)\nax.set_xticks(range(0, len(renko_df), tick_step))\n\n# Spine styling\nax.spines[\"top\"].set_visible(False)\nax.spines[\"right\"].set_visible(False)\nax.spines[\"left\"].set_color(INK_SOFT)\nax.spines[\"bottom\"].set_color(INK_SOFT)\n\n# Add annotation about brick size\nax.annotate(\n    f\"Brick Size: ${brick_size:.0f}\",\n    xy=(0.98, 0.02),\n    xycoords=\"axes fraction\",\n    fontsize=14,\n    color=INK,\n    ha=\"right\",\n    va=\"bottom\",\n    bbox={\"boxstyle\": \"round,pad=0.5\", \"facecolor\": PAGE_BG, \"edgecolor\": INK_SOFT, \"alpha\": 0.9},\n)\n\nplt.tight_layout()\nplt.savefig(f\"plot-{THEME}.png\", dpi=300, bbox_inches=\"tight\", facecolor=PAGE_BG)\n"}