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