diff --git a/plots/scatter-basic/implementations/altair.py b/plots/scatter-basic/implementations/altair.py
index baea7702a4..86076073ea 100644
--- a/plots/scatter-basic/implementations/altair.py
+++ b/plots/scatter-basic/implementations/altair.py
@@ -1,7 +1,7 @@
""" pyplots.ai
scatter-basic: Basic Scatter Plot
-Library: altair 6.0.0 | Python 3.13.11
-Quality: 91/100 | Created: 2025-12-22
+Library: altair 6.0.0 | Python 3.14.2
+Quality: /100 | Updated: 2026-02-10
"""
import altair as alt
@@ -9,21 +9,65 @@
import pandas as pd
-# Data
+# Data - Daily temperature vs ice cream sales for a beach town
np.random.seed(42)
-x = np.random.randn(100) * 2 + 10
-y = x * 0.8 + np.random.randn(100) * 2
+n = 120
+temperature = np.random.normal(24, 7, n).clip(5, 42)
+sales = temperature * 12 + np.random.normal(0, 35, n) + 50
+sales = sales.clip(20, None)
-df = pd.DataFrame({"x": x, "y": y})
+df = pd.DataFrame(
+ {"Temperature (Celsius)": np.round(temperature, 1), "Ice Cream Sales (USD)": np.round(sales, 0).astype(int)}
+)
# Plot
chart = (
alt.Chart(df)
- .mark_point(filled=True, size=200, opacity=0.7, color="#306998")
- .encode(x=alt.X("x:Q", title="X Value"), y=alt.Y("y:Q", title="Y Value"), tooltip=["x:Q", "y:Q"])
- .properties(width=1600, height=900, title=alt.Title("scatter-basic · altair · pyplots.ai", fontSize=28))
- .configure_axis(labelFontSize=18, titleFontSize=22, grid=True, gridOpacity=0.3)
+ .mark_circle(size=220, opacity=0.72, stroke="#1a3a5c", strokeWidth=0.8)
+ .encode(
+ x=alt.X(
+ "Temperature (Celsius):Q",
+ scale=alt.Scale(domain=[0, 45], nice=True),
+ axis=alt.Axis(labelFontSize=18, titleFontSize=22, tickCount=10, gridOpacity=0.25, gridDash=[4, 4]),
+ ),
+ y=alt.Y(
+ "Ice Cream Sales (USD):Q",
+ scale=alt.Scale(domain=[0, 600], nice=True),
+ axis=alt.Axis(labelFontSize=18, titleFontSize=22, gridOpacity=0.25, gridDash=[4, 4]),
+ ),
+ color=alt.Color(
+ "Temperature (Celsius):Q",
+ scale=alt.Scale(scheme="turbo", domain=[5, 42]),
+ legend=alt.Legend(
+ title="Temp (C)",
+ titleFontSize=16,
+ labelFontSize=14,
+ gradientLength=260,
+ gradientThickness=18,
+ orient="right",
+ ),
+ ),
+ tooltip=[
+ alt.Tooltip("Temperature (Celsius):Q", format=".1f"),
+ alt.Tooltip("Ice Cream Sales (USD):Q", format=",.0f"),
+ ],
+ )
+ .properties(
+ width=1600,
+ height=900,
+ title=alt.Title(
+ "scatter-basic \u00b7 altair \u00b7 pyplots.ai",
+ fontSize=28,
+ fontWeight="bold",
+ anchor="start",
+ offset=16,
+ subtitle="Daily temperature vs ice cream sales in a coastal town",
+ subtitleFontSize=18,
+ subtitleColor="#555555",
+ ),
+ )
.configure_view(strokeWidth=0)
+ .configure_axis(domainColor="#888888", tickColor="#888888", labelColor="#333333", titleColor="#222222")
)
# Save
diff --git a/plots/scatter-basic/implementations/bokeh.py b/plots/scatter-basic/implementations/bokeh.py
index dd853ab8ca..03484b18c5 100644
--- a/plots/scatter-basic/implementations/bokeh.py
+++ b/plots/scatter-basic/implementations/bokeh.py
@@ -1,52 +1,88 @@
""" pyplots.ai
scatter-basic: Basic Scatter Plot
-Library: bokeh 3.8.1 | Python 3.13.11
-Quality: 85/100 | Created: 2025-12-22
+Library: bokeh 3.8.2 | Python 3.14.2
+Quality: /100 | Updated: 2026-02-10
"""
import numpy as np
from bokeh.io import export_png
from bokeh.models import ColumnDataSource, HoverTool
from bokeh.plotting import figure, output_file, save
+from bokeh.transform import factor_cmap
-# Data - Study hours vs exam scores (realistic scenario)
+# Data - Coffee shop daily metrics: cups sold vs revenue across seasons
np.random.seed(42)
-study_hours = np.random.uniform(1, 10, 100)
-exam_scores = study_hours * 8 + np.random.randn(100) * 5 + 20
-exam_scores = np.clip(exam_scores, 0, 100)
+n = 120
+seasons = np.random.choice(["Winter", "Spring", "Summer", "Autumn"], size=n, p=[0.28, 0.24, 0.24, 0.24])
+base_cups = {"Winter": 180, "Spring": 140, "Summer": 110, "Autumn": 150}
+cups_sold = np.array([base_cups[s] + np.random.normal(0, 30) for s in seasons]).clip(40, 300)
+revenue = cups_sold * np.random.uniform(3.2, 4.8, n) + np.random.normal(0, 40, n)
+revenue = revenue.clip(100, 1600)
-# Create ColumnDataSource
-source = ColumnDataSource(data={"study_hours": study_hours, "exam_scores": exam_scores})
+source = ColumnDataSource(data={"cups": cups_sold, "revenue": revenue, "season": seasons})
-# Create figure (4800 x 2700 px for 16:9 aspect ratio)
-p = figure(width=4800, height=2700, title="scatter-basic · bokeh · pyplots.ai")
+season_list = ["Winter", "Spring", "Summer", "Autumn"]
+palette = ["#306998", "#2CA02C", "#FFD43B", "#E25822"]
-# Set axis labels explicitly (more reliable than figure parameters)
-p.xaxis.axis_label = "Study Hours (hrs)"
-p.yaxis.axis_label = "Exam Score (%)"
+# Create figure
+p = figure(width=4800, height=2700, title="scatter-basic \u00b7 bokeh \u00b7 pyplots.ai")
+p.xaxis.axis_label = "Cups Sold per Day"
+p.yaxis.axis_label = "Daily Revenue ($)"
-# Plot scatter points (size increased for visibility on large canvas)
-p.scatter(x="study_hours", y="exam_scores", source=source, size=50, color="#306998", alpha=0.7)
+# Plot scatter with season-based coloring
+p.scatter(
+ x="cups",
+ y="revenue",
+ source=source,
+ size=30,
+ alpha=0.75,
+ color=factor_cmap("season", palette, season_list),
+ legend_group="season",
+)
-# Add HoverTool for interactivity (key Bokeh distinctive feature)
-hover = HoverTool(tooltips=[("Study Hours", "@study_hours{0.1} hrs"), ("Exam Score", "@exam_scores{0.1}%")])
+# HoverTool for interactivity
+hover = HoverTool(tooltips=[("Season", "@season"), ("Cups Sold", "@cups{0}"), ("Revenue", "$@revenue{0.00}")])
p.add_tools(hover)
-# Styling (scaled for 4800x2700 px canvas - larger sizes for readability)
+# Title styling
p.title.text_font_size = "72pt"
+p.title.text_color = "#2C3E50"
+
+# Axis styling
p.xaxis.axis_label_text_font_size = "48pt"
p.yaxis.axis_label_text_font_size = "48pt"
p.xaxis.major_label_text_font_size = "36pt"
p.yaxis.major_label_text_font_size = "36pt"
+p.xaxis.axis_label_text_color = "#34495E"
+p.yaxis.axis_label_text_color = "#34495E"
+p.xaxis.axis_line_width = 3
+p.yaxis.axis_line_width = 3
+p.xaxis.major_tick_line_width = 3
+p.yaxis.major_tick_line_width = 3
-# Grid styling (subtle, per quality criteria VQ-07: alpha 0.2-0.4)
-p.grid.grid_line_alpha = 0.35
+# Grid
+p.grid.grid_line_alpha = 0.3
p.grid.grid_line_width = 2
+p.grid.grid_line_dash = [6, 4]
-# Save as PNG
-export_png(p, filename="plot.png")
+# Legend
+p.legend.label_text_font_size = "36pt"
+p.legend.glyph_width = 50
+p.legend.glyph_height = 50
+p.legend.spacing = 14
+p.legend.padding = 20
+p.legend.background_fill_alpha = 0.85
+p.legend.border_line_alpha = 0.3
+p.legend.location = "top_left"
-# Save as HTML (interactive)
+# Background
+p.background_fill_color = "#FAFBFC"
+p.border_fill_color = "white"
+p.outline_line_color = "#E0E0E0"
+p.outline_line_width = 2
+
+# Save
+export_png(p, filename="plot.png")
output_file("plot.html")
save(p)
diff --git a/plots/scatter-basic/implementations/highcharts.py b/plots/scatter-basic/implementations/highcharts.py
index 01cdc651e1..41342a3aea 100644
--- a/plots/scatter-basic/implementations/highcharts.py
+++ b/plots/scatter-basic/implementations/highcharts.py
@@ -1,7 +1,7 @@
""" pyplots.ai
scatter-basic: Basic Scatter Plot
-Library: highcharts unknown | Python 3.13.11
-Quality: 92/100 | Created: 2025-12-22
+Library: highcharts 1.10.3 | Python 3.14.2
+Quality: /100 | Updated: 2026-02-10
"""
import tempfile
@@ -17,10 +17,11 @@
from selenium.webdriver.chrome.options import Options
-# Data
+# Data - Daily temperature vs iced coffee sales at a cafe
np.random.seed(42)
-x = np.random.randn(100) * 2 + 10
-y = x * 0.8 + np.random.randn(100) * 2
+temperature = np.random.normal(22, 8, 120).clip(2, 40) # Daily temp in Celsius
+iced_sales = temperature * 2.8 + np.random.normal(0, 8, 120) # Iced drinks sold
+iced_sales = iced_sales.clip(5, None)
# Create chart
chart = Chart(container="container")
@@ -31,44 +32,120 @@
"type": "scatter",
"width": 4800,
"height": 2700,
- "backgroundColor": "#ffffff",
- "marginBottom": 150,
+ "backgroundColor": "#FAFBFC",
+ "marginBottom": 220,
+ "marginLeft": 200,
+ "marginTop": 200,
+ "style": {"fontFamily": "'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif"},
}
-# Title (required format: spec-id · library · pyplots.ai)
+# Title
chart.options.title = {
- "text": "scatter-basic · highcharts · pyplots.ai",
- "style": {"fontSize": "72px", "fontWeight": "bold"},
+ "text": "scatter-basic \u00b7 highcharts \u00b7 pyplots.ai",
+ "style": {"fontSize": "64px", "fontWeight": "600", "color": "#2D3748", "letterSpacing": "1px"},
+ "margin": 60,
}
-# Axes (scaled for 4800x2700 px)
+# Subtitle for context
+chart.options.subtitle = {
+ "text": "Daily Temperature vs Iced Coffee Sales \u2014 120 days observed",
+ "style": {"fontSize": "40px", "color": "#718096", "fontWeight": "400"},
+}
+
+# X-axis
chart.options.x_axis = {
- "title": {"text": "X Value", "style": {"fontSize": "48px"}},
- "labels": {"style": {"fontSize": "36px"}},
+ "title": {
+ "text": "Daily Temperature (\u00b0C)",
+ "style": {"fontSize": "44px", "color": "#4A5568", "fontWeight": "500"},
+ "margin": 30,
+ },
+ "labels": {"style": {"fontSize": "34px", "color": "#718096"}},
"gridLineWidth": 1,
- "gridLineColor": "rgba(0, 0, 0, 0.15)",
- "gridLineDashStyle": "Dash",
+ "gridLineColor": "rgba(203, 213, 224, 0.5)",
+ "gridLineDashStyle": "Dot",
+ "lineColor": "#CBD5E0",
+ "lineWidth": 2,
+ "tickColor": "#CBD5E0",
+ "tickWidth": 2,
+ "tickLength": 10,
}
+
+# Y-axis
chart.options.y_axis = {
- "title": {"text": "Y Value", "style": {"fontSize": "48px"}},
- "labels": {"style": {"fontSize": "36px"}},
+ "title": {
+ "text": "Iced Drinks Sold",
+ "style": {"fontSize": "44px", "color": "#4A5568", "fontWeight": "500"},
+ "margin": 30,
+ },
+ "labels": {"style": {"fontSize": "34px", "color": "#718096"}},
"gridLineWidth": 1,
- "gridLineColor": "rgba(0, 0, 0, 0.15)",
- "gridLineDashStyle": "Dash",
+ "gridLineColor": "rgba(203, 213, 224, 0.5)",
+ "gridLineDashStyle": "Dot",
+ "lineColor": "#CBD5E0",
+ "lineWidth": 2,
+ "tickColor": "#CBD5E0",
+ "tickWidth": 2,
+ "tickLength": 10,
}
# Legend and credits
chart.options.legend = {"enabled": False}
chart.options.credits = {"enabled": False}
-# Create scatter series with Python Blue color and transparency
-series = ScatterSeries()
-series.data = [[float(xi), float(yi)] for xi, yi in zip(x, y, strict=True)]
-series.name = "Data"
-series.color = "rgba(48, 105, 152, 0.7)" # Python Blue with alpha
-series.marker = {"radius": 18, "symbol": "circle"} # Larger markers for 4800x2700
+# Tooltip styling for interactive HTML version
+chart.options.tooltip = {
+ "headerFormat": "",
+ "pointFormat": "{point.x:.1f}\u00b0C \u2192 {point.y:.0f} drinks",
+ "style": {"fontSize": "28px"},
+ "backgroundColor": "rgba(255, 255, 255, 0.95)",
+ "borderColor": "#306998",
+ "borderRadius": 8,
+ "shadow": {"color": "rgba(0,0,0,0.1)", "offsetX": 2, "offsetY": 2, "width": 4},
+}
-chart.add_series(series)
+# Split data into warm and cool groups for visual interest
+cool_mask = temperature < 18
+warm_mask = ~cool_mask
+
+# Cool days series (blue tones)
+series_cool = ScatterSeries()
+series_cool.data = [
+ [float(xi), float(yi)] for xi, yi in zip(temperature[cool_mask], iced_sales[cool_mask], strict=True)
+]
+series_cool.name = "Cool Days (< 18\u00b0C)"
+series_cool.color = "rgba(48, 105, 152, 0.75)"
+series_cool.marker = {"radius": 16, "symbol": "circle", "lineWidth": 2, "lineColor": "rgba(48, 105, 152, 0.9)"}
+
+# Warm days series (amber/gold tones)
+series_warm = ScatterSeries()
+series_warm.data = [
+ [float(xi), float(yi)] for xi, yi in zip(temperature[warm_mask], iced_sales[warm_mask], strict=True)
+]
+series_warm.name = "Warm Days (\u2265 18\u00b0C)"
+series_warm.color = "rgba(255, 179, 25, 0.75)"
+series_warm.marker = {"radius": 16, "symbol": "circle", "lineWidth": 2, "lineColor": "rgba(214, 138, 0, 0.9)"}
+
+chart.add_series(series_cool)
+chart.add_series(series_warm)
+
+# Enable legend for two series - positioned inside top-left
+chart.options.legend = {
+ "enabled": True,
+ "layout": "vertical",
+ "align": "left",
+ "verticalAlign": "top",
+ "x": 180,
+ "y": 120,
+ "floating": True,
+ "backgroundColor": "rgba(255, 255, 255, 0.85)",
+ "borderColor": "#E2E8F0",
+ "borderWidth": 2,
+ "borderRadius": 8,
+ "padding": 20,
+ "itemStyle": {"fontSize": "34px", "fontWeight": "500", "color": "#4A5568"},
+ "symbolRadius": 8,
+ "itemMarginBottom": 10,
+}
# Download Highcharts JS (required for headless Chrome)
highcharts_url = "https://code.highcharts.com/highcharts.js"
diff --git a/plots/scatter-basic/implementations/letsplot.py b/plots/scatter-basic/implementations/letsplot.py
index ecb5029a0d..0b6eb138cb 100644
--- a/plots/scatter-basic/implementations/letsplot.py
+++ b/plots/scatter-basic/implementations/letsplot.py
@@ -1,7 +1,7 @@
""" pyplots.ai
scatter-basic: Basic Scatter Plot
-Library: letsplot 4.8.1 | Python 3.13.11
-Quality: 90/100 | Created: 2025-12-22
+Library: letsplot 4.8.2 | Python 3.14.2
+Quality: /100 | Updated: 2026-02-10
"""
import numpy as np
@@ -12,35 +12,45 @@
LetsPlot.setup_html() # noqa: F405
-# Data - Simulating study hours vs exam scores relationship
+# Data - Daily coffee consumption vs productivity score across office workers
np.random.seed(42)
-n = 120
-study_hours = np.random.uniform(1, 10, n)
-exam_scores = study_hours * 8 + 20 + np.random.randn(n) * 5
+n = 150
+coffee_cups = np.random.gamma(shape=2.5, scale=1.2, size=n)
+coffee_cups = np.clip(coffee_cups, 0.5, 8.0)
+# Productivity peaks around 3-4 cups, then tapers off slightly
+productivity = 55 + 12 * coffee_cups - 1.2 * coffee_cups**2 + np.random.randn(n) * 6
+productivity = np.clip(productivity, 30, 100)
-df = pd.DataFrame({"study_hours": study_hours, "exam_scores": exam_scores})
+df = pd.DataFrame({"coffee_cups": np.round(coffee_cups, 1), "productivity": np.round(productivity, 1)})
-# Plot with interactive tooltips
+# Plot
plot = (
- ggplot(df, aes(x="study_hours", y="exam_scores")) # noqa: F405
+ ggplot(df, aes(x="coffee_cups", y="productivity")) # noqa: F405
+ geom_point( # noqa: F405
- color="#306998",
- size=6,
- alpha=0.7,
+ color="#2A6F97",
+ fill="#61A5C2",
+ size=7,
+ alpha=0.65,
+ shape=21,
+ stroke=1.2,
tooltips=layer_tooltips() # noqa: F405
- .line("Study Hours|@study_hours")
- .line("Exam Score|@exam_scores"),
+ .line("Coffee|@coffee_cups cups/day")
+ .line("Productivity|@productivity"),
)
+ labs( # noqa: F405
- x="Study Hours (hrs)", y="Exam Score (points)", title="scatter-basic · letsplot · pyplots.ai"
+ x="Daily Coffee Intake (cups)", y="Productivity Score", title="scatter-basic \u00b7 letsplot \u00b7 pyplots.ai"
)
+ ggsize(1600, 900) # noqa: F405
- + theme_minimal() # noqa: F405
+ + scale_x_continuous(breaks=[1, 2, 3, 4, 5, 6, 7, 8]) # noqa: F405
+ theme( # noqa: F405
- axis_text=element_text(size=16), # noqa: F405
- axis_title=element_text(size=20), # noqa: F405
- plot_title=element_text(size=24), # noqa: F405
- panel_grid=element_line(color="#CCCCCC", size=0.5, linetype="dashed"), # noqa: F405
+ axis_text=element_text(size=16, color="#4A4A4A"), # noqa: F405
+ axis_title=element_text(size=20, color="#2D2D2D"), # noqa: F405
+ plot_title=element_text(size=26, color="#1B1B1B"), # noqa: F405
+ panel_background=element_rect(fill="#FAFBFC"), # noqa: F405
+ plot_background=element_rect(fill="white"), # noqa: F405
+ panel_grid_major=element_line(color="#E0E4E8", size=0.5), # noqa: F405
+ panel_grid_minor=element_line(color="#EEF0F2", size=0.3), # noqa: F405
+ axis_line=element_line(color="#CCCCCC", size=0.8), # noqa: F405
)
)
diff --git a/plots/scatter-basic/implementations/matplotlib.py b/plots/scatter-basic/implementations/matplotlib.py
index 3136ebf03e..09551a7d15 100644
--- a/plots/scatter-basic/implementations/matplotlib.py
+++ b/plots/scatter-basic/implementations/matplotlib.py
@@ -1,29 +1,46 @@
""" pyplots.ai
scatter-basic: Basic Scatter Plot
-Library: matplotlib 3.10.8 | Python 3.13.11
-Quality: 92/100 | Created: 2025-12-22
+Library: matplotlib 3.10.8 | Python 3.14.2
+Quality: /100 | Updated: 2026-02-10
"""
import matplotlib.pyplot as plt
import numpy as np
-# Data - study hours vs exam scores (realistic educational context)
+# Data - coffee shop daily sales: temperature vs iced drinks sold, colored by humidity
np.random.seed(42)
-study_hours = np.random.uniform(1, 12, 120)
-exam_scores = 45 + study_hours * 4.5 + np.random.randn(120) * 8
-exam_scores = np.clip(exam_scores, 0, 100)
+n_points = 150
+temperature = np.random.uniform(5, 38, n_points)
+base_sales = 10 + temperature * 2.8 + np.random.randn(n_points) * 12
+iced_drinks = np.clip(base_sales, 5, 120).astype(float)
+humidity = 30 + temperature * 0.8 + np.random.randn(n_points) * 15
+humidity = np.clip(humidity, 15, 95)
# Create plot
-fig, ax = plt.subplots(figsize=(16, 9))
-ax.scatter(study_hours, exam_scores, alpha=0.7, s=180, color="#306998", edgecolors="white", linewidths=0.5)
+fig, ax = plt.subplots(figsize=(16, 9), facecolor="#fafafa")
+ax.set_facecolor("#fafafa")
+
+scatter = ax.scatter(
+ temperature, iced_drinks, c=humidity, cmap="YlGnBu", s=90, alpha=0.75, edgecolors="white", linewidths=0.8, zorder=3
+)
+
+# Colorbar as distinctive matplotlib feature
+cbar = fig.colorbar(scatter, ax=ax, pad=0.02, shrink=0.85, aspect=30)
+cbar.set_label("Relative Humidity (%)", fontsize=18)
+cbar.ax.tick_params(labelsize=14)
# Labels and styling
-ax.set_xlabel("Study Hours (per week)", fontsize=20)
-ax.set_ylabel("Exam Score (%)", fontsize=20)
-ax.set_title("scatter-basic · matplotlib · pyplots.ai", fontsize=24)
+ax.set_xlabel("Daily High Temperature (\u00b0C)", fontsize=20)
+ax.set_ylabel("Iced Drinks Sold", fontsize=20)
+ax.set_title("scatter-basic \u00b7 matplotlib \u00b7 pyplots.ai", fontsize=24, pad=15)
ax.tick_params(axis="both", labelsize=16)
-ax.grid(True, alpha=0.3, linestyle="--")
+ax.grid(True, alpha=0.25, linestyle="--", color="#888888", zorder=0)
+
+# Refine spines
+for spine in ax.spines.values():
+ spine.set_color("#cccccc")
+ spine.set_linewidth(0.8)
plt.tight_layout()
-plt.savefig("plot.png", dpi=300, bbox_inches="tight")
+plt.savefig("plot.png", dpi=300, bbox_inches="tight", facecolor=fig.get_facecolor())
diff --git a/plots/scatter-basic/implementations/plotly.py b/plots/scatter-basic/implementations/plotly.py
index c7109d5f8e..f37238c8b2 100644
--- a/plots/scatter-basic/implementations/plotly.py
+++ b/plots/scatter-basic/implementations/plotly.py
@@ -1,52 +1,82 @@
""" pyplots.ai
scatter-basic: Basic Scatter Plot
-Library: plotly 6.5.0 | Python 3.13.11
-Quality: 93/100 | Created: 2025-12-22
+Library: plotly 6.5.2 | Python 3.14.2
+Quality: /100 | Updated: 2026-02-10
"""
import numpy as np
import plotly.graph_objects as go
-# Data: Study hours vs exam scores (realistic educational context)
+# Data: Coffee consumption vs afternoon productivity (office setting)
np.random.seed(42)
-study_hours = np.random.uniform(1, 10, 100)
-exam_scores = 45 + study_hours * 5 + np.random.randn(100) * 8
-exam_scores = np.clip(exam_scores, 0, 100)
+n = 120
+cups_of_coffee = np.random.uniform(0.5, 6, n)
+productivity = 55 + cups_of_coffee * 6 + np.random.randn(n) * 9
+productivity = np.clip(productivity, 20, 100)
+
+# Add a few deliberate outliers for scatter demonstration
+outlier_x = np.array([1.0, 5.5, 3.2, 0.8])
+outlier_y = np.array([92, 48, 95, 78])
+cups_of_coffee = np.concatenate([cups_of_coffee, outlier_x])
+productivity = np.concatenate([productivity, outlier_y])
+
+# Color by productivity score for visual depth
+colors = productivity.copy()
# Create figure
fig = go.Figure()
fig.add_trace(
go.Scatter(
- x=study_hours,
- y=exam_scores,
+ x=cups_of_coffee,
+ y=productivity,
mode="markers",
- marker={"size": 16, "color": "#306998", "opacity": 0.7},
- hovertemplate="Hours: %{x:.1f}
Score: %{y:.1f}",
+ marker={
+ "size": 14,
+ "color": colors,
+ "colorscale": [[0.0, "#4a1486"], [0.25, "#6a51a3"], [0.5, "#807dba"], [0.75, "#54a0c2"], [1.0, "#2db87d"]],
+ "opacity": 0.75,
+ "line": {"width": 1, "color": "rgba(255,255,255,0.6)"},
+ "colorbar": {
+ "title": {"text": "Score", "font": {"size": 18}},
+ "tickfont": {"size": 16},
+ "thickness": 18,
+ "len": 0.6,
+ },
+ },
+ hovertemplate=("%{x:.1f} cups
Productivity: %{y:.0f}%"),
)
)
# Layout
fig.update_layout(
- title={"text": "scatter-basic · plotly · pyplots.ai", "font": {"size": 28}, "x": 0.5, "xanchor": "center"},
+ title={
+ "text": "scatter-basic \u00b7 plotly \u00b7 pyplots.ai",
+ "font": {"size": 28, "color": "#2d2d2d"},
+ "x": 0.5,
+ "xanchor": "center",
+ },
xaxis={
- "title": {"text": "Study Hours (h)", "font": {"size": 22}},
+ "title": {"text": "Daily Coffee Intake (cups)", "font": {"size": 22}},
"tickfont": {"size": 18},
"showgrid": True,
"gridwidth": 1,
- "gridcolor": "rgba(0,0,0,0.1)",
+ "gridcolor": "rgba(0,0,0,0.2)",
+ "zeroline": False,
},
yaxis={
- "title": {"text": "Exam Score (%)", "font": {"size": 22}},
+ "title": {"text": "Afternoon Productivity (%)", "font": {"size": 22}},
"tickfont": {"size": 18},
"showgrid": True,
"gridwidth": 1,
- "gridcolor": "rgba(0,0,0,0.1)",
+ "gridcolor": "rgba(0,0,0,0.2)",
+ "zeroline": False,
},
template="plotly_white",
showlegend=False,
- margin={"l": 80, "r": 40, "t": 80, "b": 80},
+ margin={"l": 80, "r": 100, "t": 80, "b": 80},
+ plot_bgcolor="rgba(248,248,252,1)",
)
# Save as PNG (4800x2700 px)
diff --git a/plots/scatter-basic/implementations/plotnine.py b/plots/scatter-basic/implementations/plotnine.py
index 252155a313..ce04cb2e9c 100644
--- a/plots/scatter-basic/implementations/plotnine.py
+++ b/plots/scatter-basic/implementations/plotnine.py
@@ -1,36 +1,96 @@
""" pyplots.ai
scatter-basic: Basic Scatter Plot
-Library: plotnine 0.15.2 | Python 3.13.11
-Quality: 92/100 | Created: 2025-12-22
+Library: plotnine 0.15.3 | Python 3.14.2
+Quality: /100 | Updated: 2026-02-10
"""
import numpy as np
import pandas as pd
-from plotnine import aes, element_line, element_text, geom_point, ggplot, labs, theme, theme_minimal
+from plotnine import (
+ aes,
+ element_blank,
+ element_line,
+ element_rect,
+ element_text,
+ geom_point,
+ ggplot,
+ guides,
+ labs,
+ scale_color_manual,
+ scale_size_continuous,
+ theme,
+ theme_minimal,
+)
-# Data: Study hours vs exam scores (realistic educational context)
+# Data: Coffee growing regions - altitude vs flavor score by variety
np.random.seed(42)
-n_points = 150
-study_hours = np.random.uniform(1, 10, n_points)
-exam_scores = 40 + study_hours * 5 + np.random.randn(n_points) * 8
+n_points = 180
+
+varieties = np.random.choice(["Arabica", "Robusta", "Liberica"], n_points, p=[0.5, 0.35, 0.15])
+altitude = np.where(
+ varieties == "Arabica",
+ np.random.normal(1600, 300, n_points),
+ np.where(varieties == "Robusta", np.random.normal(900, 250, n_points), np.random.normal(500, 150, n_points)),
+)
+altitude = np.clip(altitude, 200, 2400)
+
+flavor_score = np.where(
+ varieties == "Arabica",
+ 70 + (altitude - 800) * 0.012 + np.random.normal(0, 4, n_points),
+ np.where(
+ varieties == "Robusta",
+ 60 + (altitude - 400) * 0.008 + np.random.normal(0, 5, n_points),
+ 55 + (altitude - 200) * 0.006 + np.random.normal(0, 4.5, n_points),
+ ),
+)
+flavor_score = np.clip(flavor_score, 45, 95)
-df = pd.DataFrame({"study_hours": study_hours, "exam_scores": exam_scores})
+bean_weight = np.where(
+ varieties == "Arabica",
+ np.random.uniform(12, 18, n_points),
+ np.where(varieties == "Robusta", np.random.uniform(10, 16, n_points), np.random.uniform(14, 22, n_points)),
+)
+
+df = pd.DataFrame(
+ {
+ "altitude": altitude,
+ "flavor_score": flavor_score,
+ "variety": pd.Categorical(varieties, categories=["Arabica", "Robusta", "Liberica"]),
+ "bean_weight": bean_weight,
+ }
+)
# Plot
+palette = {"Arabica": "#306998", "Robusta": "#E8873D", "Liberica": "#5BA37E"}
+
plot = (
- ggplot(df, aes(x="study_hours", y="exam_scores"))
- + geom_point(color="#306998", alpha=0.7, size=4)
- + labs(x="Study Hours (per week)", y="Exam Score (points)", title="scatter-basic · plotnine · pyplots.ai")
+ ggplot(df, aes(x="altitude", y="flavor_score", color="variety", size="bean_weight"))
+ + geom_point(alpha=0.65)
+ + scale_color_manual(values=palette)
+ + scale_size_continuous(range=(2, 7))
+ + guides(size=False)
+ + labs(
+ x="Growing Altitude (meters)",
+ y="Flavor Score (0-100)",
+ color="Variety",
+ title="scatter-basic \u00b7 plotnine \u00b7 pyplots.ai",
+ )
+ theme_minimal()
+ theme(
figure_size=(16, 9),
- text=element_text(size=14),
- axis_title=element_text(size=20),
+ text=element_text(size=14, color="#2D2D2D"),
+ axis_title=element_text(size=20, weight="bold"),
axis_text=element_text(size=16),
- plot_title=element_text(size=24),
- panel_grid_major=element_line(color="#cccccc", alpha=0.3),
- panel_grid_minor=element_line(color="#eeeeee", alpha=0.2),
+ plot_title=element_text(size=24, weight="bold", color="#1A1A1A"),
+ legend_title=element_text(size=18, weight="bold"),
+ legend_text=element_text(size=16),
+ legend_position="right",
+ legend_background=element_rect(fill="white", alpha=0.8),
+ panel_grid_major=element_line(color="#E0E0E0", size=0.5),
+ panel_grid_minor=element_blank(),
+ panel_background=element_rect(fill="#FAFAFA"),
+ plot_background=element_rect(fill="white"),
)
)
diff --git a/plots/scatter-basic/implementations/pygal.py b/plots/scatter-basic/implementations/pygal.py
index 4b8a5a5deb..384852d826 100644
--- a/plots/scatter-basic/implementations/pygal.py
+++ b/plots/scatter-basic/implementations/pygal.py
@@ -1,7 +1,7 @@
""" pyplots.ai
scatter-basic: Basic Scatter Plot
-Library: pygal 3.1.0 | Python 3.13.11
-Quality: 91/100 | Created: 2025-12-22
+Library: pygal 3.1.0 | Python 3.14.2
+Quality: /100 | Updated: 2026-02-10
"""
import numpy as np
@@ -9,26 +9,28 @@
from pygal.style import Style
-# Data
+# Data - Coffee shop daily temperature vs iced drinks sold
np.random.seed(42)
-x = np.random.randn(100) * 2 + 10
-y = x * 0.8 + np.random.randn(100) * 2
+temperature = np.random.normal(25, 8, 120).clip(5, 42)
+base_sales = temperature * 3.2 + 15
+noise = np.random.normal(0, 12, 120)
+iced_drinks = (base_sales + noise).clip(10, 180)
# Custom style for 4800x2700 px canvas
custom_style = Style(
- background="white",
- plot_background="white",
- foreground="#333333",
- foreground_strong="#333333",
- foreground_subtle="#666666",
- colors=("#306998",), # Python Blue
+ background="#FAFBFC",
+ plot_background="#FAFBFC",
+ foreground="#2D3748",
+ foreground_strong="#1A202C",
+ foreground_subtle="#718096",
+ colors=("#306998",),
title_font_size=72,
label_font_size=48,
- major_label_font_size=42,
+ major_label_font_size=44,
legend_font_size=42,
tooltip_font_size=36,
- opacity=0.7,
- opacity_hover=0.9,
+ opacity=0.65,
+ opacity_hover=0.95,
)
# Create XY chart for scatter plot
@@ -36,19 +38,21 @@
width=4800,
height=2700,
style=custom_style,
- title="scatter-basic · pygal · pyplots.ai",
- x_title="X Value",
- y_title="Y Value",
+ title="scatter-basic \u00b7 pygal \u00b7 pyplots.ai",
+ x_title="Daily Temperature (\u00b0C)",
+ y_title="Iced Drinks Sold",
show_legend=False,
stroke=False,
- dots_size=12,
+ dots_size=14,
show_x_guides=True,
show_y_guides=True,
+ x_label_rotation=0,
+ truncate_label=-1,
)
# Add data as list of (x, y) tuples
-points = [(float(xi), float(yi)) for xi, yi in zip(x, y, strict=True)]
-chart.add("Data", points)
+points = [(float(t), float(d)) for t, d in zip(temperature, iced_drinks, strict=True)]
+chart.add("Iced Drinks", points)
# Save outputs
chart.render_to_png("plot.png")
diff --git a/plots/scatter-basic/implementations/seaborn.py b/plots/scatter-basic/implementations/seaborn.py
index 9233cfb084..79a65003f2 100644
--- a/plots/scatter-basic/implementations/seaborn.py
+++ b/plots/scatter-basic/implementations/seaborn.py
@@ -1,31 +1,42 @@
""" pyplots.ai
scatter-basic: Basic Scatter Plot
-Library: seaborn 0.13.2 | Python 3.13.11
-Quality: 92/100 | Created: 2025-12-22
+Library: seaborn 0.13.2 | Python 3.14.2
+Quality: /100 | Updated: 2026-02-10
"""
import matplotlib.pyplot as plt
-import numpy as np
import seaborn as sns
-# Data - study hours vs exam scores with realistic correlation
-np.random.seed(42)
-study_hours = np.random.uniform(1, 10, 150)
-exam_scores = study_hours * 8 + np.random.randn(150) * 8 + 25
+# Data - Palmer penguins: bill length vs body mass by species
+penguins = sns.load_dataset("penguins").dropna(subset=["bill_length_mm", "body_mass_g"])
# Create plot
+sns.set_style("whitegrid")
fig, ax = plt.subplots(figsize=(16, 9))
sns.scatterplot(
- x=study_hours, y=exam_scores, ax=ax, alpha=0.7, s=200, color="#306998", edgecolor="white", linewidth=0.5
+ data=penguins,
+ x="bill_length_mm",
+ y="body_mass_g",
+ hue="species",
+ style="species",
+ palette="colorblind",
+ s=80,
+ alpha=0.7,
+ edgecolor="white",
+ linewidth=0.5,
+ ax=ax,
)
# Labels and styling
-ax.set_xlabel("Study Hours (per week)", fontsize=20)
-ax.set_ylabel("Exam Score (points)", fontsize=20)
-ax.set_title("scatter-basic · seaborn · pyplots.ai", fontsize=24)
+ax.set_xlabel("Bill Length (mm)", fontsize=20)
+ax.set_ylabel("Body Mass (g)", fontsize=20)
+ax.set_title("Palmer Penguins · scatter-basic · seaborn · pyplots.ai", fontsize=24)
ax.tick_params(axis="both", labelsize=16)
-ax.grid(True, alpha=0.3, linestyle="--")
+ax.grid(True, alpha=0.25, linestyle="--")
+
+# Legend styling
+ax.legend(title="Species", fontsize=16, title_fontsize=18, markerscale=1.5, framealpha=0.9)
plt.tight_layout()
plt.savefig("plot.png", dpi=300, bbox_inches="tight")
diff --git a/plots/scatter-basic/metadata/altair.yaml b/plots/scatter-basic/metadata/altair.yaml
index 881457624a..28c0ef0ed2 100644
--- a/plots/scatter-basic/metadata/altair.yaml
+++ b/plots/scatter-basic/metadata/altair.yaml
@@ -1,26 +1,26 @@
library: altair
specification_id: scatter-basic
created: '2025-12-22T23:36:19Z'
-updated: '2025-12-22T23:38:35Z'
-generated_by: claude-opus-4-5-20251101
+updated: '2026-02-10T21:10:18+00:00'
+generated_by: claude-opus-4-6
workflow_run: 20446832690
issue: 0
-python_version: 3.13.11
+python_version: 3.14.2
library_version: 6.0.0
-preview_url: https://storage.googleapis.com/pyplots-images/plots/scatter-basic/altair/plot.png
-preview_thumb: https://storage.googleapis.com/pyplots-images/plots/scatter-basic/altair/plot_thumb.png
+preview_url: https://storage.googleapis.com/pyplots-images/staging/scatter-basic/altair/plot.png
+preview_thumb: https://storage.googleapis.com/pyplots-images/staging/scatter-basic/altair/plot_thumb.png
preview_html: https://storage.googleapis.com/pyplots-images/plots/scatter-basic/altair/plot.html
-quality_score: 91
+quality_score: null
impl_tags:
dependencies: []
techniques:
- - hover-tooltips
- - html-export
+ - hover-tooltips
+ - html-export
patterns:
- - data-generation
+ - data-generation
dataprep: []
styling:
- - alpha-blending
+ - alpha-blending
review:
strengths:
- Clean declarative Altair syntax with proper encoding types (:Q for quantitative)
diff --git a/plots/scatter-basic/metadata/bokeh.yaml b/plots/scatter-basic/metadata/bokeh.yaml
index 67406f64c8..e3986fc219 100644
--- a/plots/scatter-basic/metadata/bokeh.yaml
+++ b/plots/scatter-basic/metadata/bokeh.yaml
@@ -1,28 +1,28 @@
library: bokeh
specification_id: scatter-basic
created: '2025-12-22T23:35:35Z'
-updated: '2025-12-23T00:15:21Z'
-generated_by: claude-opus-4-5-20251101
+updated: '2026-02-10T21:10:18+00:00'
+generated_by: claude-opus-4-6
workflow_run: 20446832275
issue: 0
-python_version: 3.13.11
-library_version: 3.8.1
-preview_url: https://storage.googleapis.com/pyplots-images/plots/scatter-basic/bokeh/plot.png
-preview_thumb: https://storage.googleapis.com/pyplots-images/plots/scatter-basic/bokeh/plot_thumb.png
+python_version: 3.14.2
+library_version: 3.8.2
+preview_url: https://storage.googleapis.com/pyplots-images/staging/scatter-basic/bokeh/plot.png
+preview_thumb: https://storage.googleapis.com/pyplots-images/staging/scatter-basic/bokeh/plot_thumb.png
preview_html: https://storage.googleapis.com/pyplots-images/plots/scatter-basic/bokeh/plot.html
-quality_score: 85
+quality_score: null
impl_tags:
dependencies: []
techniques:
- - hover-tooltips
- - html-export
+ - hover-tooltips
+ - html-export
patterns:
- - data-generation
- - columndatasource
+ - data-generation
+ - columndatasource
dataprep: []
styling:
- - alpha-blending
- - grid-styling
+ - alpha-blending
+ - grid-styling
review:
strengths:
- Excellent text legibility with well-scaled font sizes for 4800x2700 canvas
diff --git a/plots/scatter-basic/metadata/highcharts.yaml b/plots/scatter-basic/metadata/highcharts.yaml
index 4ae75bf5d9..8280b84471 100644
--- a/plots/scatter-basic/metadata/highcharts.yaml
+++ b/plots/scatter-basic/metadata/highcharts.yaml
@@ -1,27 +1,27 @@
library: highcharts
specification_id: scatter-basic
created: '2025-12-22T23:43:32Z'
-updated: '2025-12-23T00:06:43Z'
-generated_by: claude-opus-4-5-20251101
+updated: '2026-02-10T21:10:18+00:00'
+generated_by: claude-opus-4-6
workflow_run: 20446960278
issue: 0
-python_version: 3.13.11
-library_version: unknown
-preview_url: https://storage.googleapis.com/pyplots-images/plots/scatter-basic/highcharts/plot.png
-preview_thumb: https://storage.googleapis.com/pyplots-images/plots/scatter-basic/highcharts/plot_thumb.png
+python_version: 3.14.2
+library_version: 1.10.3
+preview_url: https://storage.googleapis.com/pyplots-images/staging/scatter-basic/highcharts/plot.png
+preview_thumb: https://storage.googleapis.com/pyplots-images/staging/scatter-basic/highcharts/plot_thumb.png
preview_html: https://storage.googleapis.com/pyplots-images/plots/scatter-basic/highcharts/plot.html
-quality_score: 92
+quality_score: null
impl_tags:
dependencies:
- - selenium
+ - selenium
techniques:
- - html-export
+ - html-export
patterns:
- - data-generation
+ - data-generation
dataprep: []
styling:
- - alpha-blending
- - grid-styling
+ - alpha-blending
+ - grid-styling
review:
strengths:
- Excellent text sizing scaled appropriately for 4800x2700 resolution (72px title,
diff --git a/plots/scatter-basic/metadata/letsplot.yaml b/plots/scatter-basic/metadata/letsplot.yaml
index 196f571f6d..51c8389b28 100644
--- a/plots/scatter-basic/metadata/letsplot.yaml
+++ b/plots/scatter-basic/metadata/letsplot.yaml
@@ -1,27 +1,27 @@
library: letsplot
specification_id: scatter-basic
created: '2025-12-22T23:43:07Z'
-updated: '2025-12-23T00:06:42Z'
-generated_by: claude-opus-4-5-20251101
+updated: '2026-02-10T21:10:18+00:00'
+generated_by: claude-opus-4-6
workflow_run: 20446960716
issue: 0
-python_version: 3.13.11
-library_version: 4.8.1
-preview_url: https://storage.googleapis.com/pyplots-images/plots/scatter-basic/letsplot/plot.png
-preview_thumb: https://storage.googleapis.com/pyplots-images/plots/scatter-basic/letsplot/plot_thumb.png
+python_version: 3.14.2
+library_version: 4.8.2
+preview_url: https://storage.googleapis.com/pyplots-images/staging/scatter-basic/letsplot/plot.png
+preview_thumb: https://storage.googleapis.com/pyplots-images/staging/scatter-basic/letsplot/plot_thumb.png
preview_html: https://storage.googleapis.com/pyplots-images/plots/scatter-basic/letsplot/plot.html
-quality_score: 90
+quality_score: null
impl_tags:
dependencies: []
techniques:
- - hover-tooltips
- - html-export
+ - hover-tooltips
+ - html-export
patterns:
- - data-generation
+ - data-generation
dataprep: []
styling:
- - alpha-blending
- - grid-styling
+ - alpha-blending
+ - grid-styling
review:
strengths:
- Clean ggplot2-style grammar of graphics implementation
diff --git a/plots/scatter-basic/metadata/matplotlib.yaml b/plots/scatter-basic/metadata/matplotlib.yaml
index bed6dc74ee..1e287ad716 100644
--- a/plots/scatter-basic/metadata/matplotlib.yaml
+++ b/plots/scatter-basic/metadata/matplotlib.yaml
@@ -1,27 +1,27 @@
library: matplotlib
specification_id: scatter-basic
created: '2025-12-22T23:24:09Z'
-updated: 2025-12-22 23:26:24+00:00
-generated_by: claude-opus-4-5-20251101
+updated: '2026-02-10T21:10:18+00:00'
+generated_by: claude-opus-4-6
workflow_run: 20446633390
issue: 0
-python_version: 3.13.11
+python_version: 3.14.2
library_version: 3.10.8
-preview_url: https://storage.googleapis.com/pyplots-images/plots/scatter-basic/matplotlib/plot.png
-preview_thumb: https://storage.googleapis.com/pyplots-images/plots/scatter-basic/matplotlib/plot_thumb.png
+preview_url: https://storage.googleapis.com/pyplots-images/staging/scatter-basic/matplotlib/plot.png
+preview_thumb: https://storage.googleapis.com/pyplots-images/staging/scatter-basic/matplotlib/plot_thumb.png
preview_html: null
-quality_score: 92
+quality_score: null
impl_tags:
dependencies: []
techniques: []
patterns:
- - data-generation
- - explicit-figure
+ - data-generation
+ - explicit-figure
dataprep: []
styling:
- - alpha-blending
- - edge-highlighting
- - grid-styling
+ - alpha-blending
+ - edge-highlighting
+ - grid-styling
review:
strengths:
- Excellent educational context (study hours vs exam scores) that is immediately
diff --git a/plots/scatter-basic/metadata/plotly.yaml b/plots/scatter-basic/metadata/plotly.yaml
index 82321d97ae..41a4da9a53 100644
--- a/plots/scatter-basic/metadata/plotly.yaml
+++ b/plots/scatter-basic/metadata/plotly.yaml
@@ -1,26 +1,26 @@
library: plotly
specification_id: scatter-basic
created: '2025-12-22T23:36:07Z'
-updated: '2025-12-22T23:38:17Z'
-generated_by: claude-opus-4-5-20251101
+updated: '2026-02-10T21:10:18+00:00'
+generated_by: claude-opus-4-6
workflow_run: 20446831781
issue: 0
-python_version: 3.13.11
-library_version: 6.5.0
-preview_url: https://storage.googleapis.com/pyplots-images/plots/scatter-basic/plotly/plot.png
-preview_thumb: https://storage.googleapis.com/pyplots-images/plots/scatter-basic/plotly/plot_thumb.png
+python_version: 3.14.2
+library_version: 6.5.2
+preview_url: https://storage.googleapis.com/pyplots-images/staging/scatter-basic/plotly/plot.png
+preview_thumb: https://storage.googleapis.com/pyplots-images/staging/scatter-basic/plotly/plot_thumb.png
preview_html: https://storage.googleapis.com/pyplots-images/plots/scatter-basic/plotly/plot.html
-quality_score: 93
+quality_score: null
impl_tags:
dependencies: []
techniques:
- - hover-tooltips
- - html-export
+ - hover-tooltips
+ - html-export
patterns:
- - data-generation
+ - data-generation
dataprep: []
styling:
- - alpha-blending
+ - alpha-blending
review:
strengths:
- Excellent text legibility with properly sized fonts for 4800x2700 output
diff --git a/plots/scatter-basic/metadata/plotnine.yaml b/plots/scatter-basic/metadata/plotnine.yaml
index f2e2a73a2c..e78dee207f 100644
--- a/plots/scatter-basic/metadata/plotnine.yaml
+++ b/plots/scatter-basic/metadata/plotnine.yaml
@@ -1,25 +1,25 @@
library: plotnine
specification_id: scatter-basic
created: '2025-12-22T23:36:42Z'
-updated: '2025-12-22T23:38:46Z'
-generated_by: claude-opus-4-5-20251101
+updated: '2026-02-10T21:10:18+00:00'
+generated_by: claude-opus-4-6
workflow_run: 20446833141
issue: 0
-python_version: 3.13.11
-library_version: 0.15.2
-preview_url: https://storage.googleapis.com/pyplots-images/plots/scatter-basic/plotnine/plot.png
-preview_thumb: https://storage.googleapis.com/pyplots-images/plots/scatter-basic/plotnine/plot_thumb.png
+python_version: 3.14.2
+library_version: 0.15.3
+preview_url: https://storage.googleapis.com/pyplots-images/staging/scatter-basic/plotnine/plot.png
+preview_thumb: https://storage.googleapis.com/pyplots-images/staging/scatter-basic/plotnine/plot_thumb.png
preview_html: null
-quality_score: 92
+quality_score: null
impl_tags:
dependencies: []
techniques: []
patterns:
- - data-generation
+ - data-generation
dataprep: []
styling:
- - alpha-blending
- - grid-styling
+ - alpha-blending
+ - grid-styling
review:
strengths:
- Excellent text legibility with proper font sizing following library guidelines
diff --git a/plots/scatter-basic/metadata/pygal.yaml b/plots/scatter-basic/metadata/pygal.yaml
index af064cda04..09e6db8606 100644
--- a/plots/scatter-basic/metadata/pygal.yaml
+++ b/plots/scatter-basic/metadata/pygal.yaml
@@ -1,16 +1,16 @@
library: pygal
specification_id: scatter-basic
created: '2025-12-22T23:36:06Z'
-updated: '2025-12-22T23:38:09Z'
-generated_by: claude-opus-4-5-20251101
+updated: '2026-02-10T21:10:18+00:00'
+generated_by: claude-opus-4-6
workflow_run: 20446833549
issue: 0
-python_version: 3.13.11
+python_version: 3.14.2
library_version: 3.1.0
-preview_url: https://storage.googleapis.com/pyplots-images/plots/scatter-basic/pygal/plot.png
-preview_thumb: https://storage.googleapis.com/pyplots-images/plots/scatter-basic/pygal/plot_thumb.png
+preview_url: https://storage.googleapis.com/pyplots-images/staging/scatter-basic/pygal/plot.png
+preview_thumb: https://storage.googleapis.com/pyplots-images/staging/scatter-basic/pygal/plot_thumb.png
preview_html: https://storage.googleapis.com/pyplots-images/plots/scatter-basic/pygal/plot.html
-quality_score: 91
+quality_score: null
impl_tags:
dependencies: []
techniques:
diff --git a/plots/scatter-basic/metadata/seaborn.yaml b/plots/scatter-basic/metadata/seaborn.yaml
index 435827a59a..0e18cde107 100644
--- a/plots/scatter-basic/metadata/seaborn.yaml
+++ b/plots/scatter-basic/metadata/seaborn.yaml
@@ -1,27 +1,27 @@
library: seaborn
specification_id: scatter-basic
created: '2025-12-22T23:35:25Z'
-updated: '2025-12-22T23:37:37Z'
-generated_by: claude-opus-4-5-20251101
+updated: '2026-02-10T21:10:18+00:00'
+generated_by: claude-opus-4-6
workflow_run: 20446831329
issue: 0
-python_version: 3.13.11
+python_version: 3.14.2
library_version: 0.13.2
-preview_url: https://storage.googleapis.com/pyplots-images/plots/scatter-basic/seaborn/plot.png
-preview_thumb: https://storage.googleapis.com/pyplots-images/plots/scatter-basic/seaborn/plot_thumb.png
+preview_url: https://storage.googleapis.com/pyplots-images/staging/scatter-basic/seaborn/plot.png
+preview_thumb: https://storage.googleapis.com/pyplots-images/staging/scatter-basic/seaborn/plot_thumb.png
preview_html: null
-quality_score: 92
+quality_score: null
impl_tags:
dependencies: []
techniques: []
patterns:
- - data-generation
- - explicit-figure
+ - data-generation
+ - explicit-figure
dataprep: []
styling:
- - alpha-blending
- - edge-highlighting
- - grid-styling
+ - alpha-blending
+ - edge-highlighting
+ - grid-styling
review:
strengths:
- Excellent visual presentation with properly sized text elements following the