diff --git a/plots/bar-basic/implementations/plotly.py b/plots/bar-basic/implementations/plotly.py
index fa23798ed0..443e6a8b99 100644
--- a/plots/bar-basic/implementations/plotly.py
+++ b/plots/bar-basic/implementations/plotly.py
@@ -1,16 +1,19 @@
""" pyplots.ai
bar-basic: Basic Bar Chart
-Library: plotly 6.5.0 | Python 3.13.11
-Quality: 100/100 | Created: 2025-12-13
+Library: plotly 6.5.2 | Python 3.14
+Quality: 92/100 | Created: 2026-02-14
"""
import plotly.graph_objects as go
-# Data
+# Data — product sales by department, sorted descending
categories = ["Electronics", "Clothing", "Home & Garden", "Sports", "Books", "Toys", "Automotive", "Health"]
values = [45200, 38700, 31500, 27800, 24300, 21600, 18900, 15400]
+# Highlight the top performer with a distinct shade
+bar_colors = ["#1A4971"] + ["#306998"] * (len(categories) - 1)
+
# Create figure
fig = go.Figure()
@@ -18,26 +21,73 @@
go.Bar(
x=categories,
y=values,
- marker_color="#306998",
+ marker={"color": bar_colors, "line": {"color": "rgba(0,0,0,0.08)", "width": 1}},
text=values,
textposition="outside",
- texttemplate="%{text:,.0f}",
- textfont={"size": 32},
+ texttemplate="$%{text:,.0f}",
+ textfont={"size": 20, "color": "#444444"},
+ hovertemplate="%{x}
Sales: $%{y:,.0f}",
)
)
+# Annotation: highlight the leading category with an insight callout
+fig.add_annotation(
+ x="Electronics",
+ y=45200,
+ text="Top seller
17% ahead of #2",
+ showarrow=True,
+ arrowhead=2,
+ arrowsize=1.2,
+ arrowwidth=2,
+ arrowcolor="#1A4971",
+ ax=100,
+ ay=-75,
+ font={"size": 18, "color": "#1A4971"},
+ align="left",
+ bordercolor="#1A4971",
+ borderwidth=1.5,
+ borderpad=6,
+ bgcolor="rgba(255,255,255,0.85)",
+)
+
+# Subtle average reference line
+avg_value = sum(values) / len(values)
+fig.add_hline(
+ y=avg_value,
+ line={"color": "rgba(0,0,0,0.25)", "width": 1.5, "dash": "dot"},
+ annotation={
+ "text": f"Avg ${avg_value:,.0f}",
+ "font": {"size": 16, "color": "#666666"},
+ "showarrow": False,
+ "xanchor": "left",
+ },
+)
+
# Layout
fig.update_layout(
- title={"text": "bar-basic · plotly · pyplots.ai", "font": {"size": 40}, "x": 0.5, "xanchor": "center"},
- xaxis={"title": {"text": "Product Category", "font": {"size": 40}}, "tickfont": {"size": 32}},
+ title={
+ "text": "bar-basic · plotly · pyplots.ai",
+ "font": {"size": 28, "color": "#222222"},
+ "x": 0.5,
+ "xanchor": "center",
+ },
+ xaxis={
+ "title": {"text": "Product Category", "font": {"size": 22, "color": "#333333"}},
+ "tickfont": {"size": 18, "color": "#444444"},
+ },
yaxis={
- "title": {"text": "Sales ($)", "font": {"size": 40}},
- "tickfont": {"size": 32},
- "gridcolor": "rgba(0,0,0,0.1)",
+ "title": {"text": "Sales ($)", "font": {"size": 22, "color": "#333333"}},
+ "tickfont": {"size": 18, "color": "#444444"},
+ "tickprefix": "$",
+ "tickformat": ",.0f",
+ "gridcolor": "rgba(0,0,0,0.07)",
+ "zeroline": False,
},
template="plotly_white",
bargap=0.3,
- margin={"t": 120, "b": 80, "l": 100, "r": 50},
+ margin={"t": 100, "b": 80, "l": 100, "r": 120},
+ plot_bgcolor="white",
+ showlegend=False,
)
# Save
diff --git a/plots/bar-basic/metadata/plotly.yaml b/plots/bar-basic/metadata/plotly.yaml
index 3860648bbf..eb18e60844 100644
--- a/plots/bar-basic/metadata/plotly.yaml
+++ b/plots/bar-basic/metadata/plotly.yaml
@@ -1,26 +1,235 @@
library: plotly
specification_id: bar-basic
created: 2025-12-13 23:14:18+00:00
-updated: 2025-12-13 23:14:18+00:00
-generated_by: claude-opus-4-5-20251101
+updated: '2026-02-14T14:55:26Z'
+generated_by: claude-opus-4-6
workflow_run: 20199224291
issue: 612
-python_version: 3.13.11
-library_version: 6.5.0
+python_version: '3.14'
+library_version: 6.5.2
preview_url: https://storage.googleapis.com/pyplots-images/plots/bar-basic/plotly/plot.png
preview_thumb: https://storage.googleapis.com/pyplots-images/plots/bar-basic/plotly/plot_thumb.png
preview_html: https://storage.googleapis.com/pyplots-images/plots/bar-basic/plotly/plot.html
-quality_score: 100
+quality_score: 92
impl_tags:
dependencies: []
techniques:
+ - annotations
- html-export
- patterns:
- - explicit-figure
+ patterns: []
dataprep: []
- styling: []
+ styling:
+ - edge-highlighting
+ - grid-styling
review:
- strengths: []
- weaknesses: []
+ strengths:
+ - 'Excellent data storytelling with the Top seller annotation providing contextual
+ insight (17% ahead of #2) and the average reference line giving statistical context'
+ - All font sizes explicitly set and well-calibrated for 4800x2700 output — perfectly
+ readable
+ - Clean, idiomatic Plotly code with good use of library-specific features (hovertemplate,
+ texttemplate, add_hline with annotation)
+ - Thoughtful visual hierarchy with subtle darker shade for top performer and minimal
+ bar outlines
+ - Dual output (PNG + interactive HTML) leverages Plotly interactive strengths
+ weaknesses:
+ - The Top seller annotation box overlaps/crowds the $45,200 value label on the Electronics
+ bar, creating visual clutter at the most important data point
+ - The color contrast between the highlighted top bar (#1A4971) and regular bars
+ (#306998) is quite subtle — could be more visually distinct to reinforce the storytelling
+ - The average line annotation is pushed to the far right margin — could be positioned
+ more prominently
improvements: []
verdict: APPROVED
+ image_description: 'The plot displays a vertical bar chart titled "bar-basic · plotly
+ · pyplots.ai" centered at the top. Eight bars represent product sales by department,
+ sorted in descending order from left to right: Electronics ($45,200), Clothing
+ ($38,700), Home & Garden ($31,500), Sports ($27,800), Books ($24,300), Toys ($21,600),
+ Automotive ($18,900), and Health ($15,400). Dollar-formatted value labels appear
+ above each bar. The top-performing Electronics bar is rendered in a slightly darker
+ navy blue (#1A4971) while the remaining bars use a medium blue (#306998). A "Top
+ seller / 17% ahead of #2" annotation with an arrow points to the Electronics bar.
+ A dotted horizontal reference line marks the average at $27,925 with a label on
+ the far right. The background is white with very subtle horizontal gridlines.
+ The x-axis is labeled "Product Category" and the y-axis "Sales ($)" with dollar-formatted
+ tick marks. Overall layout is clean and well-proportioned.'
+ criteria_checklist:
+ visual_quality:
+ score: 28
+ max: 30
+ items:
+ - id: VQ-01
+ name: Text Legibility
+ score: 8
+ max: 8
+ passed: true
+ comment: 'All font sizes explicitly set: title 28pt, axis labels 22pt, tick
+ labels 18pt, bar text 20pt. All perfectly readable at 4800x2700.'
+ - id: VQ-02
+ name: No Overlap
+ score: 4
+ max: 6
+ passed: false
+ comment: The Top seller annotation box and the $45,200 value label on the
+ Electronics bar create visual clutter; the annotation arrow and value text
+ compete for the same space.
+ - id: VQ-03
+ name: Element Visibility
+ score: 6
+ max: 6
+ passed: true
+ comment: Bars well-sized with appropriate bargap (0.3), all elements clearly
+ visible.
+ - id: VQ-04
+ name: Color Accessibility
+ score: 4
+ max: 4
+ passed: true
+ comment: Single-hue blue palette is inherently colorblind-safe. No red-green
+ differentiation.
+ - id: VQ-05
+ name: Layout Balance
+ score: 4
+ max: 4
+ passed: true
+ comment: Good canvas utilization with balanced margins. Plot fills appropriate
+ portion of canvas.
+ - id: VQ-06
+ name: Axis Labels & Title
+ score: 2
+ max: 2
+ passed: true
+ comment: Product Category and Sales ($) are descriptive with units.
+ design_excellence:
+ score: 16
+ max: 20
+ items:
+ - id: DE-01
+ name: Aesthetic Sophistication
+ score: 6
+ max: 8
+ passed: true
+ comment: Custom color palette with intentional hierarchy, subtle bar outlines,
+ clean plotly_white template. Clearly above defaults, strong design.
+ - id: DE-02
+ name: Visual Refinement
+ score: 5
+ max: 6
+ passed: true
+ comment: Subtle gridlines (rgba 0.07), clean template, generous whitespace,
+ polished margins. Average line label pushed to far right edge.
+ - id: DE-03
+ name: Data Storytelling
+ score: 5
+ max: 6
+ passed: true
+ comment: 'Top seller annotation with contextual insight (17% ahead of #2),
+ average reference line for context. Good narrative elements.'
+ spec_compliance:
+ score: 15
+ max: 15
+ items:
+ - id: SC-01
+ name: Plot Type
+ score: 5
+ max: 5
+ passed: true
+ comment: Correct vertical bar chart.
+ - id: SC-02
+ name: Required Features
+ score: 4
+ max: 4
+ passed: true
+ comment: Consistent bar widths, value labels above bars, single color with
+ highlight, adequate spacing. All spec notes addressed.
+ - id: SC-03
+ name: Data Mapping
+ score: 3
+ max: 3
+ passed: true
+ comment: Categories on x-axis, values on y-axis, correct mapping.
+ - id: SC-04
+ name: Title & Legend
+ score: 3
+ max: 3
+ passed: true
+ comment: Title format bar-basic · plotly · pyplots.ai correct. No legend needed
+ for single series.
+ data_quality:
+ score: 14
+ max: 15
+ items:
+ - id: DQ-01
+ name: Feature Coverage
+ score: 5
+ max: 6
+ passed: true
+ comment: 8 categories with clear variation, sorted descending. Good range
+ ($15K-$45K). Could show more extreme variation.
+ - id: DQ-02
+ name: Realistic Context
+ score: 5
+ max: 5
+ passed: true
+ comment: Product sales by department is a real, neutral business scenario.
+ - id: DQ-03
+ name: Appropriate Scale
+ score: 4
+ max: 4
+ passed: true
+ comment: Sales figures $15K-$45K are realistic for department-level retail
+ sales.
+ code_quality:
+ score: 10
+ max: 10
+ items:
+ - id: CQ-01
+ name: KISS Structure
+ score: 3
+ max: 3
+ passed: true
+ comment: 'Clean flat structure: import, data, figure, annotation, layout,
+ save.'
+ - id: CQ-02
+ name: Reproducibility
+ score: 2
+ max: 2
+ passed: true
+ comment: Deterministic hardcoded data, no randomness needed.
+ - id: CQ-03
+ name: Clean Imports
+ score: 2
+ max: 2
+ passed: true
+ comment: Only plotly.graph_objects imported and used.
+ - id: CQ-04
+ name: Code Elegance
+ score: 2
+ max: 2
+ passed: true
+ comment: Clean, well-organized, appropriate complexity.
+ - id: CQ-05
+ name: Output & API
+ score: 1
+ max: 1
+ passed: true
+ comment: Saves as plot.png (1600x900, scale=3) and plot.html. No deprecated
+ APIs.
+ library_mastery:
+ score: 9
+ max: 10
+ items:
+ - id: LM-01
+ name: Idiomatic Usage
+ score: 5
+ max: 5
+ passed: true
+ comment: 'Expert use of graph_objects API: go.Bar, add_trace, update_layout,
+ add_annotation, add_hline with annotation dict.'
+ - id: LM-02
+ name: Distinctive Features
+ score: 4
+ max: 5
+ passed: true
+ comment: 'Uses Plotly-specific features: hovertemplate, texttemplate, add_hline
+ with embedded annotation, dual output (PNG + HTML).'