From d6eed433209b4573903b10ee1b2bc50477212016 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 30 Apr 2026 10:41:14 +0000 Subject: [PATCH 1/3] chore(seaborn): add metadata for span-basic --- .../implementations/python/seaborn.py | 74 +++++-- plots/span-basic/metadata/python/seaborn.yaml | 208 ++---------------- 2 files changed, 69 insertions(+), 213 deletions(-) diff --git a/plots/span-basic/implementations/python/seaborn.py b/plots/span-basic/implementations/python/seaborn.py index 38ad6296c8..90a64b1ac1 100644 --- a/plots/span-basic/implementations/python/seaborn.py +++ b/plots/span-basic/implementations/python/seaborn.py @@ -1,50 +1,82 @@ -""" pyplots.ai +"""anyplot.ai span-basic: Basic Span Plot (Highlighted Region) -Library: seaborn 0.13.2 | Python 3.13.11 -Quality: 91/100 | Created: 2025-12-23 +Library: seaborn | Python 3.13 +Quality: pending | Created: 2026-04-30 """ +import os + import matplotlib.pyplot as plt import numpy as np import pandas as pd import seaborn as sns -# Data - Monthly sales with recession period and target threshold +# Theme tokens +THEME = os.getenv("ANYPLOT_THEME", "light") +PAGE_BG = "#FAF8F1" if THEME == "light" else "#1A1A17" +ELEVATED_BG = "#FFFDF6" if THEME == "light" else "#242420" +INK = "#1A1A17" if THEME == "light" else "#F0EFE8" +INK_SOFT = "#4A4A44" if THEME == "light" else "#B8B7B0" + +BRAND = "#009E73" # Okabe-Ito position 1 — always first series +SPAN_RECESSION = "#D55E00" # Okabe-Ito position 2 +SPAN_TARGET = "#0072B2" # Okabe-Ito position 3 + +sns.set_theme( + style="ticks", + rc={ + "figure.facecolor": PAGE_BG, + "axes.facecolor": PAGE_BG, + "axes.edgecolor": INK_SOFT, + "axes.labelcolor": INK, + "text.color": INK, + "xtick.color": INK_SOFT, + "ytick.color": INK_SOFT, + "grid.color": INK, + "grid.alpha": 0.10, + "legend.facecolor": ELEVATED_BG, + "legend.edgecolor": INK_SOFT, + }, +) + +# Data - Monthly sales revenue with recession period and target threshold np.random.seed(42) months = pd.date_range(start="2006-01", periods=60, freq="ME") base_trend = np.linspace(100, 150, 60) -# Dip during recession period (2008-2009) recession_effect = np.where((months >= "2008-01") & (months <= "2009-12"), -30 * np.sin(np.linspace(0, np.pi, 60)), 0) sales = base_trend + recession_effect + np.random.randn(60) * 8 - df = pd.DataFrame({"Month": months, "Sales": sales}) # Plot -fig, ax = plt.subplots(figsize=(16, 9)) +fig, ax = plt.subplots(figsize=(16, 9), facecolor=PAGE_BG) -# Vertical span - recession period (2008-2009) +# Vertical span — recession period (2008–2009) ax.axvspan( pd.Timestamp("2008-01-01"), pd.Timestamp("2009-12-31"), alpha=0.25, - color="#306998", - label="Recession Period (2008-2009)", + color=SPAN_RECESSION, + label="Recession (2008–2009)", ) -# Horizontal span - target sales zone (120-140) -ax.axhspan(120, 140, alpha=0.2, color="#FFD43B", label="Target Zone (120-140)") +# Horizontal span — target sales zone (120–140) +ax.axhspan(120, 140, alpha=0.20, color=SPAN_TARGET, label="Target Zone (120–140)") -# Line plot using seaborn -sns.lineplot(data=df, x="Month", y="Sales", ax=ax, linewidth=3, color="#306998") +# Line plot +sns.lineplot(data=df, x="Month", y="Sales", ax=ax, linewidth=3, color=BRAND) -# Styling -ax.set_title("span-basic · seaborn · pyplots.ai", fontsize=24) -ax.set_xlabel("Month", fontsize=20) -ax.set_ylabel("Sales (thousands $)", fontsize=20) -ax.tick_params(axis="both", labelsize=16) +# Style +ax.set_title("span-basic · seaborn · anyplot.ai", fontsize=24, fontweight="medium", color=INK) +ax.set_xlabel("Month", fontsize=20, color=INK) +ax.set_ylabel("Sales (thousands $)", fontsize=20, color=INK) +ax.tick_params(axis="both", labelsize=16, colors=INK_SOFT) +ax.spines["top"].set_visible(False) +ax.spines["right"].set_visible(False) +ax.spines["left"].set_color(INK_SOFT) +ax.spines["bottom"].set_color(INK_SOFT) +ax.yaxis.grid(True, alpha=0.10, linewidth=0.8, color=INK) ax.legend(fontsize=16, loc="upper left") -ax.grid(True, alpha=0.3, linestyle="--") plt.tight_layout() -plt.savefig("plot.png", dpi=300, bbox_inches="tight") +plt.savefig(f"plot-{THEME}.png", dpi=300, bbox_inches="tight", facecolor=PAGE_BG) diff --git a/plots/span-basic/metadata/python/seaborn.yaml b/plots/span-basic/metadata/python/seaborn.yaml index 6cbfc4211f..ec52e0550e 100644 --- a/plots/span-basic/metadata/python/seaborn.yaml +++ b/plots/span-basic/metadata/python/seaborn.yaml @@ -1,197 +1,21 @@ +# Per-library metadata for seaborn implementation of span-basic +# Auto-generated by impl-generate.yml + library: seaborn +language: python specification_id: span-basic created: '2025-12-23T20:45:18Z' -updated: '2025-12-23T20:49:19Z' -generated_by: claude-opus-4-5-20251101 -workflow_run: 20471150706 -issue: 0 -python_version: 3.13.11 +updated: '2026-04-30T10:41:12Z' +generated_by: claude-sonnet +workflow_run: 25160803525 +issue: 980 +python_version: 3.13.13 library_version: 0.13.2 -preview_url: https://storage.googleapis.com/anyplot-images/plots/span-basic/seaborn/plot.png -preview_html: null -quality_score: 91 -impl_tags: - dependencies: [] - techniques: - - layer-composition - patterns: - - data-generation - dataprep: [] - styling: - - alpha-blending +preview_url_light: https://storage.googleapis.com/anyplot-images/plots/span-basic/python/seaborn/plot-light.png +preview_url_dark: https://storage.googleapis.com/anyplot-images/plots/span-basic/python/seaborn/plot-dark.png +preview_html_light: null +preview_html_dark: null +quality_score: null review: - strengths: - - Excellent demonstration of both vertical and horizontal spans with meaningful - context (recession period + target zone) - - Data clearly shows the effect of the recession with visible dip during the highlighted - period - - Clean code structure following KISS principles - - Proper title format and axis labels with units - - Good color choices that are colorblind accessible - - Appropriate alpha values (0.25 and 0.2) keep underlying data visible - weaknesses: - - Relies heavily on matplotlib axvspan/axhspan rather than seaborn-specific features; - could explore seaborn fill_between or other native approaches to demonstrate library - strengths - image_description: 'The plot displays a line chart showing monthly sales data from - 2006 to 2011. There is a blue semi-transparent vertical span (light blue, #306998 - with alpha 0.25) highlighting the recession period from 2008 to 2009. A yellow - horizontal span (#FFD43B with alpha 0.2) marks the target sales zone between 120-140 - thousand dollars. The blue line (matching #306998) shows sales values that clearly - dip during the recession period and recover afterward, demonstrating the relationship - between the highlighted region and the data trend. The title "span-basic · seaborn - · pyplots.ai" is prominently displayed at the top. Axis labels show "Month" and - "Sales (thousands $)" with clear, readable tick labels. A legend in the upper - left identifies both span regions. The grid uses subtle dashed lines with low - opacity.' - criteria_checklist: - visual_quality: - score: 37 - max: 40 - items: - - id: VQ-01 - name: Text Legibility - score: 10 - max: 10 - passed: true - comment: Title 24pt, labels 20pt, ticks 16pt - all perfectly readable - - id: VQ-02 - name: No Overlap - score: 8 - max: 8 - passed: true - comment: No overlapping text elements - - id: VQ-03 - name: Element Visibility - score: 8 - max: 8 - passed: true - comment: Line width 3 is appropriate, spans are clearly visible with good - alpha - - id: VQ-04 - name: Color Accessibility - score: 5 - max: 5 - passed: true - comment: Blue and yellow spans are colorblind-safe and distinguishable - - id: VQ-05 - name: Layout Balance - score: 5 - max: 5 - passed: true - comment: Plot fills canvas appropriately, balanced margins - - id: VQ-06 - name: Axis Labels - score: 2 - max: 2 - passed: true - comment: Y-axis has units "Sales (thousands $)", X-axis has "Month" - spec_compliance: - score: 25 - max: 25 - items: - - id: SC-01 - name: Plot Type - score: 8 - max: 8 - passed: true - comment: Correct span/highlighted region plot type - - id: SC-02 - name: Data Mapping - score: 5 - max: 5 - passed: true - comment: X=time, Y=value correctly assigned - - id: SC-03 - name: Required Features - score: 5 - max: 5 - passed: true - comment: Both vertical span (recession) and horizontal span (threshold) present - - id: SC-04 - name: Data Range - score: 3 - max: 3 - passed: true - comment: All data visible within axes - - id: SC-05 - name: Legend Accuracy - score: 2 - max: 2 - passed: true - comment: Legend correctly describes both spans - - id: SC-06 - name: Title Format - score: 2 - max: 2 - passed: true - comment: Uses "span-basic · seaborn · pyplots.ai" - data_quality: - score: 19 - max: 20 - items: - - id: DQ-01 - name: Feature Coverage - score: 8 - max: 8 - passed: true - comment: Shows both vertical (time period) and horizontal (threshold) spans - - id: DQ-02 - name: Realistic Context - score: 6 - max: 7 - passed: true - comment: Recession period with sales dip is realistic; the recession effect - timing could be more natural - - id: DQ-03 - name: Appropriate Scale - score: 5 - max: 5 - passed: true - comment: Sales values 80-160 thousand are realistic for business data - code_quality: - score: 10 - max: 10 - items: - - id: CQ-01 - name: KISS Structure - score: 3 - max: 3 - passed: true - comment: 'Simple linear flow: imports → data → plot → save' - - id: CQ-02 - name: Reproducibility - score: 3 - max: 3 - passed: true - comment: Uses np.random.seed(42) - - id: CQ-03 - name: Clean Imports - score: 2 - max: 2 - passed: true - comment: All imports are used (plt, np, pd, sns) - - id: CQ-04 - name: No Deprecated API - score: 1 - max: 1 - passed: true - comment: Uses current API - - id: CQ-05 - name: Output Correct - score: 1 - max: 1 - passed: true - comment: Saves as plot.png - library_features: - score: 0 - max: 5 - items: - - id: LF-01 - name: Uses distinctive library features - score: 0 - max: 5 - passed: false - comment: Uses sns.lineplot but the spans are matplotlib's axvspan/axhspan, - not seaborn-specific features - verdict: APPROVED + strengths: [] + weaknesses: [] From 70daade444eff4767c1c5d31264f227fe9cbafa9 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 30 Apr 2026 10:47:37 +0000 Subject: [PATCH 2/3] chore(seaborn): update quality score 86 and review feedback for span-basic --- .../implementations/python/seaborn.py | 6 +- plots/span-basic/metadata/python/seaborn.yaml | 244 +++++++++++++++++- 2 files changed, 240 insertions(+), 10 deletions(-) diff --git a/plots/span-basic/implementations/python/seaborn.py b/plots/span-basic/implementations/python/seaborn.py index 90a64b1ac1..8dd2c1e955 100644 --- a/plots/span-basic/implementations/python/seaborn.py +++ b/plots/span-basic/implementations/python/seaborn.py @@ -1,7 +1,7 @@ -"""anyplot.ai +""" anyplot.ai span-basic: Basic Span Plot (Highlighted Region) -Library: seaborn | Python 3.13 -Quality: pending | Created: 2026-04-30 +Library: seaborn 0.13.2 | Python 3.13.13 +Quality: 86/100 | Updated: 2026-04-30 """ import os diff --git a/plots/span-basic/metadata/python/seaborn.yaml b/plots/span-basic/metadata/python/seaborn.yaml index ec52e0550e..2aec574a77 100644 --- a/plots/span-basic/metadata/python/seaborn.yaml +++ b/plots/span-basic/metadata/python/seaborn.yaml @@ -1,11 +1,8 @@ -# Per-library metadata for seaborn implementation of span-basic -# Auto-generated by impl-generate.yml - library: seaborn language: python specification_id: span-basic created: '2025-12-23T20:45:18Z' -updated: '2026-04-30T10:41:12Z' +updated: '2026-04-30T10:47:36Z' generated_by: claude-sonnet workflow_run: 25160803525 issue: 980 @@ -15,7 +12,240 @@ preview_url_light: https://storage.googleapis.com/anyplot-images/plots/span-basi preview_url_dark: https://storage.googleapis.com/anyplot-images/plots/span-basic/python/seaborn/plot-dark.png preview_html_light: null preview_html_dark: null -quality_score: null +quality_score: 86 review: - strengths: [] - weaknesses: [] + strengths: + - 'Perfect spec compliance: both vertical and horizontal spans demonstrated with + appropriate alpha, correct title format, and meaningful legend labels' + - Flawless theme adaptation in both renders — correct backgrounds, chrome tokens + applied throughout, no dark-on-dark failures + - 'Excellent data quality: the recession-dipping-below-target narrative is immediately + comprehensible and matches spec examples' + - Clean, readable code with explicit font sizes and seed set + weaknesses: + - 'Design excellence is good but not publication-ready (DE-01=4): no distinctive + visual touches like span text labels, subtle edge lines on span boundaries, or + typographic refinements' + - 'Library mastery is limited (LM-01=3, LM-02=1): only sns.lineplot and sns.set_theme + are seaborn-specific; spans are matplotlib primitives — consider adding seaborn-specific + elements like sns.despine(), statistical annotations, or regplot for trend context' + - 'DE-03 at 4/6: the story is good but no span labels inside the shaded regions + that would make the reading clearer without needing the legend' + image_description: |- + Light render (plot-light.png): + Background: Warm off-white #FAF8F1 — correct anyplot surface, not pure white + Chrome: Title "span-basic · seaborn · anyplot.ai" in dark ink clearly readable; axis labels "Month" (x) and "Sales (thousands $)" (y) in dark text fully visible; tick labels (year ticks 2006-2011, value ticks 80-160) in INK_SOFT clearly legible; legend top-left with themed elevated background + Data: Green line #009E73 (Okabe-Ito position 1) is the primary series; orange vertical span #D55E00 at alpha=0.25 marks 2008-2009 recession; blue horizontal span #0072B2 at alpha=0.20 marks target zone 120-140; first series correctly #009E73 + Legibility verdict: PASS + + Dark render (plot-dark.png): + Background: Warm near-black #1A1A17 — correct anyplot dark surface, not pure black + Chrome: Title, axis labels, and tick labels all rendered in light-colored text (INK = #F0EFE8 in dark theme) — clearly readable against dark background; no dark-on-dark failures detected; legend with dark elevated background (#242420) and soft border + Data: Green line #009E73 is identical to light render; orange span appears as dark burnt-orange due to alpha blending on dark surface (expected behavior); blue span appears as deep navy — both data colors are correct and consistent with light render; only chrome flips + Legibility verdict: PASS + criteria_checklist: + visual_quality: + score: 30 + max: 30 + items: + - id: VQ-01 + name: Text Legibility + score: 8 + max: 8 + passed: true + comment: Title 24pt, labels 20pt, ticks 16pt, legend 16pt all explicitly set; + readable in both themes + - id: VQ-02 + name: No Overlap + score: 6 + max: 6 + passed: true + comment: No text collisions; legend placement avoids data area + - id: VQ-03 + name: Element Visibility + score: 6 + max: 6 + passed: true + comment: linewidth=3 green line clearly visible through semi-transparent spans; + spans appropriately sized + - id: VQ-04 + name: Color Accessibility + score: 2 + max: 2 + passed: true + comment: Okabe-Ito palette; CVD-safe; line distinguishable from both span + overlays + - id: VQ-05 + name: Layout & Canvas + score: 4 + max: 4 + passed: true + comment: Data fills canvas 2006-2011, tight_layout applied, nothing cut off, + balanced margins + - id: VQ-06 + name: Axis Labels & Title + score: 2 + max: 2 + passed: true + comment: Sales (thousands $) includes units; Month is descriptive + - id: VQ-07 + name: Palette Compliance + score: 2 + max: 2 + passed: true + comment: 'Line #009E73 position 1; spans #D55E00 position 2 and #0072B2 position + 3 in correct order; backgrounds #FAF8F1/#1A1A17; chrome theme-adaptive in + both renders' + design_excellence: + score: 12 + max: 20 + items: + - id: DE-01 + name: Aesthetic Sophistication + score: 4 + max: 8 + passed: false + comment: Well-configured library default with correct palette and L-shaped + spine frame; clean and professional but not publication-ready; no distinctive + design flourishes + - id: DE-02 + name: Visual Refinement + score: 4 + max: 6 + passed: false + comment: 'Good refinement: top/right spines removed, y-axis-only grid at alpha=0.10, + themed legend background/edge, spine colors set to INK_SOFT; clearly above + library defaults' + - id: DE-03 + name: Data Storytelling + score: 4 + max: 6 + passed: false + comment: 'Good storytelling: recession dipping below target is immediately + readable; visual hierarchy works. No span labels inside regions to guide + viewer explicitly' + spec_compliance: + score: 15 + max: 15 + items: + - id: SC-01 + name: Plot Type + score: 5 + max: 5 + passed: true + comment: 'Correct: span plot with both vertical (time period) and horizontal + (value threshold) highlighted regions overlaid on line data' + - id: SC-02 + name: Required Features + score: 4 + max: 4 + passed: true + comment: Semi-transparent fills alpha 0.20-0.25; 2 span regions (within 1-5); + underlying data visible through spans + - id: SC-03 + name: Data Mapping + score: 3 + max: 3 + passed: true + comment: Vertical span correctly mapped to x-axis datetime range; horizontal + span to y-axis value range; line data correctly positioned + - id: SC-04 + name: Title & Legend + score: 3 + max: 3 + passed: true + comment: 'Title exact format span-basic · seaborn · anyplot.ai; legend labels + descriptive: Recession (2008-2009) and Target Zone (120-140)' + data_quality: + score: 15 + max: 15 + items: + - id: DQ-01 + name: Feature Coverage + score: 6 + max: 6 + passed: true + comment: Shows both vertical spans (time periods) AND horizontal spans (value + thresholds); demonstrates full range of the plot type per spec + - id: DQ-02 + name: Realistic Context + score: 5 + max: 5 + passed: true + comment: 'Monthly sales revenue with recession marking and target threshold: + neutral, real-world business scenario matching spec examples exactly' + - id: DQ-03 + name: Appropriate Scale + score: 4 + max: 4 + passed: true + comment: 'Sales 80-160 thousand $, recession dip ~30 units, target zone 120-140: + plausible and internally consistent; 60-month range appropriate' + code_quality: + score: 10 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Linear flow: imports -> theme tokens -> data -> plot -> save; no + functions or classes' + - id: CQ-02 + name: Reproducibility + score: 2 + max: 2 + passed: true + comment: np.random.seed(42) set + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: All five imports (os, matplotlib.pyplot, numpy, pandas, seaborn) + are used + - id: CQ-04 + name: Code Elegance + score: 2 + max: 2 + passed: true + comment: Clean, Pythonic; appropriate complexity; no over-engineering or fake + UI elements + - id: CQ-05 + name: Output & API + score: 1 + max: 1 + passed: true + comment: Saves as plot-{THEME}.png; no deprecated API calls + library_mastery: + score: 4 + max: 10 + items: + - id: LM-01 + name: Idiomatic Usage + score: 3 + max: 5 + passed: false + comment: Uses sns.lineplot() and sns.set_theme() idiomatically. Core span + features (axvspan, axhspan) are matplotlib primitives — correct tool choice + since seaborn lacks span functions, but seaborn contribution is thin + - id: LM-02 + name: Distinctive Features + score: 1 + max: 5 + passed: false + comment: No distinctively seaborn features beyond sns.lineplot and sns.set_theme; + span rendering is entirely matplotlib; could use sns.despine(), regplot, + or statistical annotations to differentiate + verdict: REJECTED +impl_tags: + dependencies: [] + techniques: [] + patterns: + - data-generation + - explicit-figure + dataprep: + - time-series + styling: + - alpha-blending From 05e18337c3d65f8d2b654d53fc00b10c77e3d9e9 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 30 Apr 2026 11:00:37 +0000 Subject: [PATCH 3/3] chore(seaborn): update quality score 88 and review feedback for span-basic --- .../implementations/python/seaborn.py | 2 +- plots/span-basic/metadata/python/seaborn.yaml | 155 ++++++++---------- 2 files changed, 72 insertions(+), 85 deletions(-) diff --git a/plots/span-basic/implementations/python/seaborn.py b/plots/span-basic/implementations/python/seaborn.py index 8dd2c1e955..d6271b50d6 100644 --- a/plots/span-basic/implementations/python/seaborn.py +++ b/plots/span-basic/implementations/python/seaborn.py @@ -1,7 +1,7 @@ """ anyplot.ai span-basic: Basic Span Plot (Highlighted Region) Library: seaborn 0.13.2 | Python 3.13.13 -Quality: 86/100 | Updated: 2026-04-30 +Quality: 88/100 | Updated: 2026-04-30 """ import os diff --git a/plots/span-basic/metadata/python/seaborn.yaml b/plots/span-basic/metadata/python/seaborn.yaml index 2aec574a77..96c1c5cc68 100644 --- a/plots/span-basic/metadata/python/seaborn.yaml +++ b/plots/span-basic/metadata/python/seaborn.yaml @@ -2,7 +2,7 @@ library: seaborn language: python specification_id: span-basic created: '2025-12-23T20:45:18Z' -updated: '2026-04-30T10:47:36Z' +updated: '2026-04-30T11:00:36Z' generated_by: claude-sonnet workflow_run: 25160803525 issue: 980 @@ -12,36 +12,34 @@ preview_url_light: https://storage.googleapis.com/anyplot-images/plots/span-basi preview_url_dark: https://storage.googleapis.com/anyplot-images/plots/span-basic/python/seaborn/plot-dark.png preview_html_light: null preview_html_dark: null -quality_score: 86 +quality_score: 88 review: strengths: - - 'Perfect spec compliance: both vertical and horizontal spans demonstrated with - appropriate alpha, correct title format, and meaningful legend labels' - - Flawless theme adaptation in both renders — correct backgrounds, chrome tokens - applied throughout, no dark-on-dark failures - - 'Excellent data quality: the recession-dipping-below-target narrative is immediately - comprehensible and matches spec examples' - - Clean, readable code with explicit font sizes and seed set + - Complete theme adaptation with all chrome tokens correctly flipping for both light + and dark renders; no dark-on-dark failures + - 'Strong data narrative: recession dip visually compelling; dual-span approach + demonstrates both vertical and horizontal span directions as required by spec' + - 'Perfect spec and data quality: all required features present, realistic business + context, reproducible with np.random.seed(42)' + - Clean code structure with explicit font sizes, correct Okabe-Ito ordering, and + proper seaborn theme setup via sns.set_theme rc params weaknesses: - - 'Design excellence is good but not publication-ready (DE-01=4): no distinctive - visual touches like span text labels, subtle edge lines on span boundaries, or - typographic refinements' - - 'Library mastery is limited (LM-01=3, LM-02=1): only sns.lineplot and sns.set_theme - are seaborn-specific; spans are matplotlib primitives — consider adding seaborn-specific - elements like sns.despine(), statistical annotations, or regplot for trend context' - - 'DE-03 at 4/6: the story is good but no span labels inside the shaded regions - that would make the reading clearer without needing the legend' + - 'Design excellence modest: standard seaborn output without distinctive typographic + choices or custom tick formatting (e.g., year-only x-axis labels)' + - 'Library mastery constrained by plot type: seaborn has no native span primitives + so axvspan/axhspan handled by matplotlib; seaborn contribution beyond theming + limited to lineplot' image_description: |- Light render (plot-light.png): - Background: Warm off-white #FAF8F1 — correct anyplot surface, not pure white - Chrome: Title "span-basic · seaborn · anyplot.ai" in dark ink clearly readable; axis labels "Month" (x) and "Sales (thousands $)" (y) in dark text fully visible; tick labels (year ticks 2006-2011, value ticks 80-160) in INK_SOFT clearly legible; legend top-left with themed elevated background - Data: Green line #009E73 (Okabe-Ito position 1) is the primary series; orange vertical span #D55E00 at alpha=0.25 marks 2008-2009 recession; blue horizontal span #0072B2 at alpha=0.20 marks target zone 120-140; first series correctly #009E73 + Background: Warm off-white #FAF8F1 — correct platform surface + Chrome: Title "span-basic · seaborn · anyplot.ai" in dark ink (24pt) clearly visible; axis labels "Month" and "Sales (thousands $)" in INK (20pt) readable; tick labels in INK_SOFT (16pt) readable; legend text clear + Data: Brand green (#009E73) line (linewidth=3) runs through full 2006–2011 range; orange vertical span (Okabe-Ito #D55E00, alpha 0.25) covers recession 2008–2009; blue horizontal span (Okabe-Ito #0072B2, alpha 0.20) covers target zone y=120–140; underlying sales data clearly visible through both semi-transparent spans Legibility verdict: PASS Dark render (plot-dark.png): - Background: Warm near-black #1A1A17 — correct anyplot dark surface, not pure black - Chrome: Title, axis labels, and tick labels all rendered in light-colored text (INK = #F0EFE8 in dark theme) — clearly readable against dark background; no dark-on-dark failures detected; legend with dark elevated background (#242420) and soft border - Data: Green line #009E73 is identical to light render; orange span appears as dark burnt-orange due to alpha blending on dark surface (expected behavior); blue span appears as deep navy — both data colors are correct and consistent with light render; only chrome flips + Background: Warm near-black #1A1A17 — correct platform surface + Chrome: Title in light text (INK = #F0EFE8) clearly readable; axis labels in INK light color readable; tick labels in INK_SOFT (#B8B7B0) readable against dark background; legend has elevated-dark background (#242420) with light-colored text; no dark-on-dark failures observed + Data: Brand green line identical to light render (#009E73); orange recession span and blue target zone span retain identical Okabe-Ito data colors; green line clearly distinguishable against dark background Legibility verdict: PASS criteria_checklist: visual_quality: @@ -53,77 +51,72 @@ review: score: 8 max: 8 passed: true - comment: Title 24pt, labels 20pt, ticks 16pt, legend 16pt all explicitly set; - readable in both themes + comment: 'All font sizes explicitly set: title 24pt, axis labels 20pt, tick + labels 16pt, legend 16pt; readable in both themes' - id: VQ-02 name: No Overlap score: 6 max: 6 passed: true - comment: No text collisions; legend placement avoids data area + comment: Legend in upper left clear of data; tick labels well-spaced; no collisions - id: VQ-03 name: Element Visibility score: 6 max: 6 passed: true - comment: linewidth=3 green line clearly visible through semi-transparent spans; - spans appropriately sized + comment: Spans, line, and legend clearly visible; alpha levels appropriate + (0.25, 0.20) - id: VQ-04 name: Color Accessibility score: 2 max: 2 passed: true - comment: Okabe-Ito palette; CVD-safe; line distinguishable from both span - overlays + comment: Okabe-Ito palette; CVD-safe; orange/blue/green distinguishable - id: VQ-05 name: Layout & Canvas score: 4 max: 4 passed: true - comment: Data fills canvas 2006-2011, tight_layout applied, nothing cut off, - balanced margins + comment: 16:9 canvas well-utilized; balanced margins; tight_layout prevents + clipping - id: VQ-06 name: Axis Labels & Title score: 2 max: 2 passed: true - comment: Sales (thousands $) includes units; Month is descriptive + comment: Sales (thousands $) with units; Month for time axis - id: VQ-07 name: Palette Compliance score: 2 max: 2 passed: true - comment: 'Line #009E73 position 1; spans #D55E00 position 2 and #0072B2 position - 3 in correct order; backgrounds #FAF8F1/#1A1A17; chrome theme-adaptive in - both renders' + comment: 'First series (line) = #009E73; spans use Okabe-Ito positions 2 & + 3; backgrounds #FAF8F1 / #1A1A17; both renders theme-correct' design_excellence: score: 12 max: 20 items: - id: DE-01 name: Aesthetic Sophistication - score: 4 + score: 5 max: 8 - passed: false - comment: Well-configured library default with correct palette and L-shaped - spine frame; clean and professional but not publication-ready; no distinctive - design flourishes + passed: true + comment: Above default; Okabe-Ito colors applied thoughtfully; clear visual + intent but still recognizably standard seaborn styling - id: DE-02 name: Visual Refinement - score: 4 + score: 3 max: 6 - passed: false - comment: 'Good refinement: top/right spines removed, y-axis-only grid at alpha=0.10, - themed legend background/edge, spine colors set to INK_SOFT; clearly above - library defaults' + passed: true + comment: Top/right spines removed; subtle grid alpha=0.10; clean legend with + elevated background; above default - id: DE-03 name: Data Storytelling score: 4 max: 6 - passed: false - comment: 'Good storytelling: recession dipping below target is immediately - readable; visual hierarchy works. No span labels inside regions to guide - viewer explicitly' + passed: true + comment: 'Strong narrative: recession dip visually obvious; dual-span demonstrates + both span types; guides viewer attention' spec_compliance: score: 15 max: 15 @@ -133,29 +126,27 @@ review: score: 5 max: 5 passed: true - comment: 'Correct: span plot with both vertical (time period) and horizontal - (value threshold) highlighted regions overlaid on line data' + comment: Correct span plot with both vertical and horizontal span variants - id: SC-02 name: Required Features score: 4 max: 4 passed: true - comment: Semi-transparent fills alpha 0.20-0.25; 2 span regions (within 1-5); - underlying data visible through spans + comment: Vertical span (2008-2009), horizontal span (120-140), semi-transparent + alpha, underlying data visible - id: SC-03 name: Data Mapping score: 3 max: 3 passed: true - comment: Vertical span correctly mapped to x-axis datetime range; horizontal - span to y-axis value range; line data correctly positioned + comment: Time on x-axis, sales values on y-axis; spans cover specified ranges - id: SC-04 name: Title & Legend score: 3 max: 3 passed: true - comment: 'Title exact format span-basic · seaborn · anyplot.ai; legend labels - descriptive: Recession (2008-2009) and Target Zone (120-140)' + comment: Title 'span-basic · seaborn · anyplot.ai'; legend labels match span + definitions data_quality: score: 15 max: 15 @@ -165,22 +156,22 @@ review: score: 6 max: 6 passed: true - comment: Shows both vertical spans (time periods) AND horizontal spans (value - thresholds); demonstrates full range of the plot type per spec + comment: Demonstrates both vertical (time-period) and horizontal (value-threshold) + span types - id: DQ-02 name: Realistic Context score: 5 max: 5 passed: true - comment: 'Monthly sales revenue with recession marking and target threshold: - neutral, real-world business scenario matching spec examples exactly' + comment: Monthly sales revenue with 2008-2009 recession; historically grounded, + neutral business context - id: DQ-03 name: Appropriate Scale score: 4 max: 4 passed: true - comment: 'Sales 80-160 thousand $, recession dip ~30 units, target zone 120-140: - plausible and internally consistent; 60-month range appropriate' + comment: Sales 80-160 (thousands $) over 5 years; realistic recession dip + and recovery code_quality: score: 10 max: 10 @@ -190,55 +181,51 @@ review: score: 3 max: 3 passed: true - comment: 'Linear flow: imports -> theme tokens -> data -> plot -> save; no - functions or classes' + comment: 'Linear flow: imports -> theme tokens -> data -> plot -> style -> + save; no functions or classes' - id: CQ-02 name: Reproducibility score: 2 max: 2 passed: true - comment: np.random.seed(42) set + comment: np.random.seed(42) - id: CQ-03 name: Clean Imports score: 2 max: 2 passed: true - comment: All five imports (os, matplotlib.pyplot, numpy, pandas, seaborn) - are used + comment: os, matplotlib.pyplot, numpy, pandas, seaborn — all used - id: CQ-04 name: Code Elegance score: 2 max: 2 passed: true - comment: Clean, Pythonic; appropriate complexity; no over-engineering or fake - UI elements + comment: Clean, Pythonic; appropriate complexity; no fake UI - id: CQ-05 name: Output & API score: 1 max: 1 passed: true - comment: Saves as plot-{THEME}.png; no deprecated API calls + comment: Saves as plot-{THEME}.png; current API library_mastery: - score: 4 + score: 6 max: 10 items: - id: LM-01 name: Idiomatic Usage - score: 3 + score: 4 max: 5 - passed: false - comment: Uses sns.lineplot() and sns.set_theme() idiomatically. Core span - features (axvspan, axhspan) are matplotlib primitives — correct tool choice - since seaborn lacks span functions, but seaborn contribution is thin + passed: true + comment: Axes-level API used; sns.set_theme with rc params; proper ax= parameter + usage - id: LM-02 name: Distinctive Features - score: 1 + score: 2 max: 5 - passed: false - comment: No distinctively seaborn features beyond sns.lineplot and sns.set_theme; - span rendering is entirely matplotlib; could use sns.despine(), regplot, - or statistical annotations to differentiate - verdict: REJECTED + passed: true + comment: Seaborn theme system and lineplot used well; span overlays require + matplotlib primitives since seaborn has no native axvspan + verdict: APPROVED impl_tags: dependencies: [] techniques: []