diff --git a/.github/workflows/impl-generate.yml b/.github/workflows/impl-generate.yml index 478de6eb99..7635825740 100644 --- a/.github/workflows/impl-generate.yml +++ b/.github/workflows/impl-generate.yml @@ -271,6 +271,13 @@ jobs: 1. Read `plots/${{ steps.inputs.outputs.specification_id }}/metadata/${{ steps.inputs.outputs.library }}.yaml` - Look at `review.strengths` (keep these aspects!) - Look at `review.weaknesses` (fix these problems - decide HOW yourself) + - Look at `review.image_description` (understand what was generated visually) + - Look at `review.criteria_checklist` (see exactly which criteria failed) + - Focus on categories with low scores (e.g., visual_quality.score < visual_quality.max) + - Check items with `passed: false` - these need fixing + - VQ-XX items for visual issues + - SC-XX items for spec compliance + - CQ-XX items for code quality 2. Read `plots/${{ steps.inputs.outputs.specification_id }}/implementations/${{ steps.inputs.outputs.library }}.py` - Understand what was done before - Keep what worked, fix what didn't @@ -346,6 +353,13 @@ jobs: 1. Read `plots/${{ steps.inputs.outputs.specification_id }}/metadata/${{ steps.inputs.outputs.library }}.yaml` - Look at `review.strengths` (keep these aspects!) - Look at `review.weaknesses` (fix these problems - decide HOW yourself) + - Look at `review.image_description` (understand what was generated visually) + - Look at `review.criteria_checklist` (see exactly which criteria failed) + - Focus on categories with low scores (e.g., visual_quality.score < visual_quality.max) + - Check items with `passed: false` - these need fixing + - VQ-XX items for visual issues + - SC-XX items for spec compliance + - CQ-XX items for code quality 2. Read `plots/${{ steps.inputs.outputs.specification_id }}/implementations/${{ steps.inputs.outputs.library }}.py` - Understand what was done before - Keep what worked, fix what didn't diff --git a/.github/workflows/impl-repair.yml b/.github/workflows/impl-repair.yml index b03c87b4cd..1bc279eb88 100644 --- a/.github/workflows/impl-repair.yml +++ b/.github/workflows/impl-repair.yml @@ -127,6 +127,13 @@ jobs: 2. `plots/${{ inputs.specification_id }}/metadata/${{ inputs.library }}.yaml` - Look at: - `review.strengths` (keep these aspects!) - `review.weaknesses` (fix these problems - decide HOW yourself) + - `review.image_description` (understand what was generated visually) + - `review.criteria_checklist` (see exactly which criteria failed) + - Look for items with `passed: false` - these need fixing + - Focus on categories with low scores (e.g., visual_quality.score < visual_quality.max) + - VQ-XX items for visual issues + - SC-XX items for spec compliance + - CQ-XX items for code quality ### Step 2: Read reference files 1. `prompts/library/${{ inputs.library }}.md` - Library-specific rules @@ -192,6 +199,13 @@ jobs: 2. `plots/${{ inputs.specification_id }}/metadata/${{ inputs.library }}.yaml` - Look at: - `review.strengths` (keep these aspects!) - `review.weaknesses` (fix these problems - decide HOW yourself) + - `review.image_description` (understand what was generated visually) + - `review.criteria_checklist` (see exactly which criteria failed) + - Look for items with `passed: false` - these need fixing + - Focus on categories with low scores (e.g., visual_quality.score < visual_quality.max) + - VQ-XX items for visual issues + - SC-XX items for spec compliance + - CQ-XX items for code quality ### Step 2: Read reference files 1. `prompts/library/${{ inputs.library }}.md` - Library-specific rules diff --git a/.github/workflows/impl-review.yml b/.github/workflows/impl-review.yml index 33f077d428..142e328cc4 100644 --- a/.github/workflows/impl-review.yml +++ b/.github/workflows/impl-review.yml @@ -206,12 +206,39 @@ jobs: # Save structured feedback as JSON (one array per file) echo '["Strength 1", "Strength 2"]' > review_strengths.json echo '["Weakness 1"]' > review_weaknesses.json + + # Save verdict + echo "APPROVED" > review_verdict.txt # or "REJECTED" + + # Save image description (multi-line text) + cat > review_image_description.txt << 'EOF' + The plot shows a scatter plot with blue markers... + [Your full image description here] + EOF + + # Save criteria checklist as structured JSON + cat > review_checklist.json << 'EOF' + { + "visual_quality": { + "score": 36, + "max": 40, + "items": [ + {"id": "VQ-01", "name": "Text Legibility", "score": 10, "max": 10, "passed": true, "comment": "All text readable"}, + {"id": "VQ-02", "name": "No Overlap", "score": 8, "max": 8, "passed": true, "comment": "No overlapping elements"} + ] + }, + "spec_compliance": {"score": 23, "max": 25, "items": [...]}, + "data_quality": {"score": 18, "max": 20, "items": [...]}, + "code_quality": {"score": 10, "max": 10, "items": [...]}, + "library_features": {"score": 5, "max": 5, "items": [...]} + } + EOF ``` 8. **DO NOT add ai-approved or ai-rejected labels** - the workflow will add them after updating metadata. **IMPORTANT**: Your review MUST include the "Image Description" section. A review without an image description will be considered invalid. - **IMPORTANT**: The Strengths/Weaknesses sections are saved to the metadata for future regeneration. Be specific! + **IMPORTANT**: All review data (strengths, weaknesses, image_description, criteria_checklist) is saved to metadata for future regeneration. Be specific! - name: Extract quality score id: score @@ -266,21 +293,8 @@ jobs: git fetch origin "$BRANCH" git checkout -B "$BRANCH" "origin/$BRANCH" - # Read review feedback from JSON files (created by Claude) - STRENGTHS="[]" - WEAKNESSES="[]" - - if [ -f "review_strengths.json" ]; then - STRENGTHS=$(cat review_strengths.json) - fi - if [ -f "review_weaknesses.json" ]; then - WEAKNESSES=$(cat review_weaknesses.json) - fi - # Update metadata file with quality score, timestamp, and review feedback if [ -f "$METADATA_FILE" ]; then - # Update all metadata using Python for proper YAML handling - # Pass JSON via files to avoid shell escaping issues with quotes TIMESTAMP=$(date -u +"%Y-%m-%dT%H:%M:%SZ") # Write Python script to temp file to avoid YAML/shell escaping issues @@ -294,8 +308,12 @@ jobs: score = int(sys.argv[2]) timestamp = sys.argv[3] + # Read existing review data files strengths = [] weaknesses = [] + image_description = None + criteria_checklist = None + verdict = None if Path('review_strengths.json').exists(): try: @@ -311,6 +329,28 @@ jobs: except: pass + if Path('review_image_description.txt').exists(): + try: + with open('review_image_description.txt') as f: + image_description = f.read().strip() + except: + pass + + if Path('review_checklist.json').exists(): + try: + with open('review_checklist.json') as f: + criteria_checklist = json.load(f) + except: + pass + + if Path('review_verdict.txt').exists(): + try: + with open('review_verdict.txt') as f: + verdict = f.read().strip() + except: + pass + + # Load existing metadata with open(metadata_file, 'r') as f: data = yaml.safe_load(f) @@ -320,12 +360,24 @@ jobs: if 'review' not in data: data['review'] = {} + # Update review section with all fields data['review']['strengths'] = strengths data['review']['weaknesses'] = weaknesses + # Add extended review data (issue #2845) + if image_description: + data['review']['image_description'] = image_description + if criteria_checklist: + data['review']['criteria_checklist'] = criteria_checklist + if verdict: + data['review']['verdict'] = verdict + def str_representer(dumper, data): if isinstance(data, str) and data.endswith('Z') and 'T' in data: return dumper.represent_scalar('tag:yaml.org,2002:str', data, style="'") + # Use literal block style for multi-line strings (image_description) + if isinstance(data, str) and '\n' in data: + return dumper.represent_scalar('tag:yaml.org,2002:str', data, style='|') return dumper.represent_scalar('tag:yaml.org,2002:str', data) yaml.add_representer(str, str_representer) @@ -335,7 +387,7 @@ jobs: EOF python3 /tmp/update_metadata.py "$METADATA_FILE" "$SCORE" "$TIMESTAMP" - echo "::notice::Updated metadata with quality score ${SCORE} and review feedback" + echo "::notice::Updated metadata with quality score ${SCORE} and extended review data" fi # Update implementation header with quality score diff --git a/CLAUDE.md b/CLAUDE.md index 962d5d2402..ee7742c094 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -308,6 +308,34 @@ quality_score: 92 # Review feedback (used for regeneration) review: + # AI's visual description of the generated plot + image_description: | + The plot shows a scatter plot with 100 data points displaying + a positive correlation. Points are rendered in blue with 70% + opacity. Axes are clearly labeled and a subtle grid is visible. + + # Detailed scoring breakdown by category + criteria_checklist: + visual_quality: + score: 36 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: "All text readable at full size" + spec_compliance: + score: 23 + max: 25 + items: [...] + # ... data_quality, code_quality, library_features + + # Final verdict + verdict: APPROVED + + # Summary feedback strengths: - "Clean code structure" - "Good use of alpha for overlapping points" @@ -329,6 +357,7 @@ Quality: 92/100 | Created: 2025-01-10 - Spec-level tracking in `specification.yaml`: `created`, `updated`, `issue`, `suggested`, `tags` - Per-library metadata in separate files (no merge conflicts!) - **Review feedback** stored in metadata for regeneration (AI reads previous feedback to improve) +- **Extended review data**: `image_description`, `criteria_checklist`, and `verdict` for targeted fixes - Contributors credited via `suggested` field - Tags are at spec level (same for all libraries) - Per-library metadata updated automatically by `impl-review.yml` (quality score, review feedback) diff --git a/alembic/versions/6345896e2e90_add_extended_review_fields.py b/alembic/versions/6345896e2e90_add_extended_review_fields.py new file mode 100644 index 0000000000..a705fd9ff5 --- /dev/null +++ b/alembic/versions/6345896e2e90_add_extended_review_fields.py @@ -0,0 +1,45 @@ +"""add_extended_review_fields + +Add extended review data fields to impls table for issue #2845: +- review_image_description: AI's visual description of the plot +- review_criteria_checklist: Detailed per-criterion scoring breakdown +- review_verdict: "APPROVED" or "REJECTED" + +Revision ID: 6345896e2e90 +Revises: d0c76553a5cc +Create Date: 2026-01-01 + +""" + +from typing import Sequence, Union + +import sqlalchemy as sa +from sqlalchemy.dialects import postgresql + +from alembic import op + + +# revision identifiers, used by Alembic. +revision: str = "6345896e2e90" +down_revision: Union[str, None] = "d0c76553a5cc" +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + """Add extended review data columns to impls table.""" + # Add review_image_description (text field for AI's visual description) + op.add_column("impls", sa.Column("review_image_description", sa.Text(), nullable=True)) + + # Add review_criteria_checklist (JSONB for detailed scoring breakdown) + op.add_column("impls", sa.Column("review_criteria_checklist", postgresql.JSONB(), nullable=True)) + + # Add review_verdict (short string: "APPROVED" or "REJECTED") + op.add_column("impls", sa.Column("review_verdict", sa.String(20), nullable=True)) + + +def downgrade() -> None: + """Remove extended review data columns from impls table.""" + op.drop_column("impls", "review_verdict") + op.drop_column("impls", "review_criteria_checklist") + op.drop_column("impls", "review_image_description") diff --git a/app/src/components/FilterBar.tsx b/app/src/components/FilterBar.tsx index 7144e08b1e..550a64709e 100644 --- a/app/src/components/FilterBar.tsx +++ b/app/src/components/FilterBar.tsx @@ -139,8 +139,7 @@ export function FilterBar({ const handleValueSelect = useCallback( (category: FilterCategory, value: string) => { onAddFilter(category, value); - onTrackEvent('filter_add', { category, value }); - // Track search if query was used + // Track search if query was used (filter changes tracked via pageview) if (searchQuery.trim()) { onTrackEvent('search', { query: searchQuery.trim(), category }); } @@ -169,39 +168,33 @@ export function FilterBar({ const handleRemoveValue = useCallback( (value: string) => { if (activeGroupIndex !== null) { - const group = activeFilters[activeGroupIndex]; onRemoveFilter(activeGroupIndex, value); - onTrackEvent('filter_remove', { category: group?.category || '', value }); } setChipMenuAnchor(null); setActiveGroupIndex(null); }, - [activeGroupIndex, activeFilters, onRemoveFilter, onTrackEvent] + [activeGroupIndex, onRemoveFilter] ); // Remove entire group const handleRemoveGroup = useCallback(() => { if (activeGroupIndex !== null) { - const group = activeFilters[activeGroupIndex]; onRemoveGroup(activeGroupIndex); - onTrackEvent('filter_remove_group', { category: group?.category || '' }); } setChipMenuAnchor(null); setActiveGroupIndex(null); - }, [activeGroupIndex, activeFilters, onRemoveGroup, onTrackEvent]); + }, [activeGroupIndex, onRemoveGroup]); // Add value to existing group (OR) const handleAddValueToExistingGroup = useCallback( (value: string) => { if (activeGroupIndex !== null) { - const group = activeFilters[activeGroupIndex]; onAddValueToGroup(activeGroupIndex, value); - onTrackEvent('filter_add_or', { category: group?.category || '', value }); } setChipMenuAnchor(null); setActiveGroupIndex(null); }, - [activeGroupIndex, activeFilters, onAddValueToGroup, onTrackEvent] + [activeGroupIndex, onAddValueToGroup] ); // Memoize search results to avoid recalculating on every render @@ -209,6 +202,28 @@ export function FilterBar({ () => getSearchResults(filterCounts, activeFilters, searchQuery, selectedCategory), [filterCounts, activeFilters, searchQuery, selectedCategory] ); + + // Track searches with no results (debounced, to discover missing specs) + const lastTrackedQueryRef = useRef(''); + useEffect(() => { + const query = searchQuery.trim(); + // Only track if: query >= 2 chars, no results, not already tracked this query + if (query.length >= 2 && searchResults.length === 0 && query !== lastTrackedQueryRef.current) { + const timer = setTimeout(() => { + onTrackEvent('search_no_results', { query }); + lastTrackedQueryRef.current = query; + }, 500); + return () => clearTimeout(timer); + } + }, [searchQuery, searchResults.length, onTrackEvent]); + + // Reset tracked query when dropdown closes + useEffect(() => { + if (!dropdownAnchor) { + lastTrackedQueryRef.current = ''; + } + }, [dropdownAnchor]); + // Only open if anchor is valid and in document const isDropdownOpen = Boolean(dropdownAnchor) && document.body.contains(dropdownAnchor); const hasQuery = searchQuery.trim().length > 0; @@ -349,10 +364,7 @@ export function FilterBar({ key={`${group.category}-${index}`} label={displayLabel} onClick={(e) => handleChipClick(e, index)} - onDelete={() => { - onRemoveGroup(index); - onTrackEvent('filter_remove_group', { category: group.category }); - }} + onDelete={() => onRemoveGroup(index)} deleteIcon={} sx={{ fontFamily: '"MonoLisa", "MonoLisa Fallback", monospace', diff --git a/app/src/components/FullscreenModal.tsx b/app/src/components/FullscreenModal.tsx index 03c3065d0d..58840e3d2a 100644 --- a/app/src/components/FullscreenModal.tsx +++ b/app/src/components/FullscreenModal.tsx @@ -34,7 +34,7 @@ export function FullscreenModal({ image, selectedSpec, onClose, onTrackEvent }: const { copied, copyToClipboard, reset: resetCopied } = useCopyCode({ onCopy: () => { const specId = selectedSpec || image?.spec_id; - onTrackEvent?.('copy_code', { spec: specId, library: image?.library, method: 'modal' }); + onTrackEvent?.('copy_code', { spec: specId, library: image?.library, method: 'button' }); }, }); @@ -92,13 +92,13 @@ export function FullscreenModal({ image, selectedSpec, onClose, onTrackEvent }: // Track native copy events (Ctrl+C, Cmd+C) const handleNativeCopy = useCallback(() => { const specId = selectedSpec || image?.spec_id; - onTrackEvent?.('copy_code', { spec: specId, library: image?.library, method: 'native' }); + onTrackEvent?.('copy_code', { spec: specId, library: image?.library, method: 'keyboard' }); }, [onTrackEvent, selectedSpec, image?.library, image?.spec_id]); // Track contextmenu (right-click) - user may copy from context menu const handleContextMenu = useCallback(() => { const specId = selectedSpec || image?.spec_id; - onTrackEvent?.('copy_code', { spec: specId, library: image?.library, method: 'contextmenu' }); + onTrackEvent?.('copy_code', { spec: specId, library: image?.library, method: 'keyboard' }); }, [onTrackEvent, selectedSpec, image?.library, image?.spec_id]); // Download image via backend proxy @@ -119,10 +119,8 @@ export function FullscreenModal({ image, selectedSpec, onClose, onTrackEvent }: const handleClose = useCallback(() => { setShowCode(false); - const specId = selectedSpec || image?.spec_id; - onTrackEvent?.('modal_close', { spec: specId, library: image?.library }); onClose(); - }, [onClose, onTrackEvent, selectedSpec, image?.library, image?.spec_id]); + }, [onClose]); return ( setCopyState('idle'), 2000); } else { setCopyState('idle'); @@ -214,9 +214,6 @@ export const ImageCard = memo(function ImageCard({ onClick={(e) => { e.stopPropagation(); onTooltipToggle(isSpecTooltipOpen ? null : specTooltipId); - if (!isSpecTooltipOpen) { - onTrackEvent?.('description_spec', { spec: image.spec_id }); - } }} sx={{ fontSize: labelFontSize, @@ -287,9 +284,6 @@ export const ImageCard = memo(function ImageCard({ onClick={(e) => { e.stopPropagation(); onTooltipToggle(isLibTooltipOpen ? null : libTooltipId); - if (!isLibTooltipOpen) { - onTrackEvent?.('description_lib', { library: image.library }); - } }} sx={{ fontSize: labelFontSize, diff --git a/automation/scripts/backfill_review_metadata.py b/automation/scripts/backfill_review_metadata.py new file mode 100755 index 0000000000..5af2177875 --- /dev/null +++ b/automation/scripts/backfill_review_metadata.py @@ -0,0 +1,403 @@ +#!/usr/bin/env python3 +""" +Backfill extended review data in metadata YAML files from PR comments. + +This script searches through merged PRs to find AI Review comments and extracts: +- image_description +- criteria_checklist +- verdict + +IMPORTANT: When multiple AI Review comments exist (repair attempts), +always takes the LAST one (the one that led to merge). + +Usage: + python automation/scripts/backfill_review_metadata.py --dry-run + python automation/scripts/backfill_review_metadata.py --execute + +Requires: + - gh CLI authenticated + - PyYAML installed +""" + +import argparse +import json +import re +import subprocess +import sys +from pathlib import Path + + +def run_gh_command(args: list[str]) -> dict | list | str: + """Run a gh CLI command and return JSON output.""" + cmd = ["gh"] + args + result = subprocess.run(cmd, capture_output=True, text=True) + if result.returncode != 0: + return None + try: + return json.loads(result.stdout) + except json.JSONDecodeError: + return result.stdout.strip() + + +def find_merged_pr_for_implementation(spec_id: str, library: str) -> dict | None: + """Find the merged PR for a given spec_id and library.""" + # Search for PRs with the implementation branch pattern + branch_pattern = f"implementation/{spec_id}/{library}" + + prs = run_gh_command([ + "pr", "list", + "--state", "merged", + "--head", branch_pattern, + "--json", "number,headRefName,mergedAt,comments", + "--limit", "1" + ]) + + if prs and len(prs) > 0: + return prs[0] + + # Fallback: search by title pattern + prs = run_gh_command([ + "pr", "list", + "--state", "merged", + "--search", f"feat({library}): implement {spec_id}", + "--json", "number,headRefName,mergedAt", + "--limit", "5" + ]) + + if prs: + for pr in prs: + if spec_id in pr.get("headRefName", "") and library in pr.get("headRefName", ""): + return pr + + return None + + +def get_pr_comments(pr_number: int) -> list[dict]: + """Get all comments from a PR.""" + comments = run_gh_command([ + "pr", "view", str(pr_number), + "--json", "comments", + "-q", ".comments" + ]) + return comments if comments else [] + + +def parse_ai_review_comment(comment_body: str) -> dict | None: + """ + Parse an AI Review comment to extract structured data. + + Returns dict with: + - image_description: str + - criteria_checklist: dict + - verdict: str + - strengths: list[str] + - weaknesses: list[str] + """ + if "## AI Review" not in comment_body: + return None + + result = { + "image_description": None, + "criteria_checklist": None, + "verdict": None, + "strengths": [], + "weaknesses": [], + } + + # Extract Image Description (multi-line quote block) + img_desc_match = re.search( + r"### Image Description\s*\n((?:>\s*.*\n?)+)", + comment_body, + re.MULTILINE + ) + if img_desc_match: + # Remove leading > and whitespace from each line + lines = img_desc_match.group(1).strip().split("\n") + cleaned_lines = [re.sub(r"^>\s*", "", line) for line in lines] + result["image_description"] = "\n".join(cleaned_lines).strip() + + # Extract Verdict + verdict_match = re.search(r"### Verdict:\s*(APPROVED|REJECTED)", comment_body, re.IGNORECASE) + if verdict_match: + result["verdict"] = verdict_match.group(1).upper() + + # Extract Strengths + strengths_match = re.search(r"### Strengths\s*\n((?:[-*]\s+.*\n?)+)", comment_body, re.MULTILINE) + if strengths_match: + lines = strengths_match.group(1).strip().split("\n") + result["strengths"] = [re.sub(r"^[-*]\s+", "", line).strip() for line in lines if line.strip()] + + # Extract Weaknesses + weaknesses_match = re.search(r"### Weaknesses\s*\n((?:[-*]\s+.*\n?)+)", comment_body, re.MULTILINE) + if weaknesses_match: + lines = weaknesses_match.group(1).strip().split("\n") + result["weaknesses"] = [re.sub(r"^[-*]\s+", "", line).strip() for line in lines if line.strip()] + + # Extract Criteria Checklist + result["criteria_checklist"] = parse_criteria_checklist(comment_body) + + return result + + +def parse_criteria_checklist(comment_body: str) -> dict | None: + """ + Parse the criteria checklist from the AI Review comment. + + Format in comment: + **Visual Quality (36/40 pts)** + - [x] VQ-01: Text Legibility (10) - All text readable ✓ + - [ ] VQ-02: No Overlap (0/8) - Some elements overlap + """ + checklist = {} + + # Define category patterns + categories = { + "visual_quality": r"\*\*Visual Quality \((\d+)/(\d+) pts?\)\*\*", + "spec_compliance": r"\*\*Spec Compliance \((\d+)/(\d+) pts?\)\*\*", + "data_quality": r"\*\*Data Quality \((\d+)/(\d+) pts?\)\*\*", + "code_quality": r"\*\*Code Quality \((\d+)/(\d+) pts?\)\*\*", + "library_features": r"\*\*Library Features \((\d+)/(\d+) pts?\)\*\*", + } + + # Item pattern: - [x] VQ-01: Name (score) - comment + # or: - [ ] VQ-01: Name (score/max) - comment + item_pattern = re.compile( + r"- \[([ xX])\] ([A-Z]{2}-\d+): ([^(]+)\((\d+)(?:/(\d+))?\)\s*[-–]?\s*(.*?)(?=\n|$)" + ) + + for cat_key, cat_pattern in categories.items(): + cat_match = re.search(cat_pattern, comment_body) + if cat_match: + cat_score = int(cat_match.group(1)) + cat_max = int(cat_match.group(2)) + + # Find the section for this category + cat_start = cat_match.end() + next_cat = None + for other_key, other_pattern in categories.items(): + if other_key != cat_key: + other_match = re.search(other_pattern, comment_body[cat_start:]) + if other_match: + if next_cat is None or other_match.start() < next_cat: + next_cat = other_match.start() + + if next_cat: + section = comment_body[cat_start:cat_start + next_cat] + else: + # Find next section header (### ) + next_section = re.search(r"\n###\s", comment_body[cat_start:]) + if next_section: + section = comment_body[cat_start:cat_start + next_section.start()] + else: + section = comment_body[cat_start:] + + items = [] + for match in item_pattern.finditer(section): + checked = match.group(1).lower() == "x" + item_id = match.group(2) + item_name = match.group(3).strip() + item_score = int(match.group(4)) + item_max = int(match.group(5)) if match.group(5) else item_score if checked else 0 + item_comment = match.group(6).strip() if match.group(6) else "" + + # Clean up comment (remove trailing checkmark or x) + item_comment = re.sub(r"\s*[✓✗✔✘]$", "", item_comment) + + items.append({ + "id": item_id, + "name": item_name, + "score": item_score, + "max": item_max if item_max > 0 else item_score, + "passed": checked, + "comment": item_comment, + }) + + checklist[cat_key] = { + "score": cat_score, + "max": cat_max, + "items": items, + } + + return checklist if checklist else None + + +def update_metadata_file(metadata_path: Path, review_data: dict, dry_run: bool) -> bool: + """ + Update a metadata YAML file with extended review data. + + Preserves existing fields, only adds/updates review section. + """ + import yaml + + if not metadata_path.exists(): + print(f" ⚠️ Metadata file not found: {metadata_path}") + return False + + with open(metadata_path) as f: + data = yaml.safe_load(f) + + if "review" not in data: + data["review"] = {} + + # Update with new data (only if not None) + if review_data.get("image_description"): + data["review"]["image_description"] = review_data["image_description"] + if review_data.get("criteria_checklist"): + data["review"]["criteria_checklist"] = review_data["criteria_checklist"] + if review_data.get("verdict"): + data["review"]["verdict"] = review_data["verdict"] + + # Also update strengths/weaknesses if missing + if review_data.get("strengths") and not data["review"].get("strengths"): + data["review"]["strengths"] = review_data["strengths"] + if review_data.get("weaknesses") and not data["review"].get("weaknesses"): + data["review"]["weaknesses"] = review_data["weaknesses"] + + if dry_run: + print(f" 📝 Would update: {metadata_path}") + if review_data.get("image_description"): + print(f" - image_description: {len(review_data['image_description'])} chars") + if review_data.get("criteria_checklist"): + print(f" - criteria_checklist: {len(review_data['criteria_checklist'])} categories") + if review_data.get("verdict"): + print(f" - verdict: {review_data['verdict']}") + return True + + # Custom representer for multi-line strings + def str_representer(dumper, data): + if isinstance(data, str) and "\n" in data: + return dumper.represent_scalar("tag:yaml.org,2002:str", data, style="|") + if isinstance(data, str) and data.endswith("Z") and "T" in data: + return dumper.represent_scalar("tag:yaml.org,2002:str", data, style="'") + return dumper.represent_scalar("tag:yaml.org,2002:str", data) + + yaml.add_representer(str, str_representer) + + with open(metadata_path, "w") as f: + yaml.dump(data, f, default_flow_style=False, sort_keys=False, allow_unicode=True) + + print(f" ✅ Updated: {metadata_path}") + return True + + +def main(): + parser = argparse.ArgumentParser(description="Backfill extended review data from PR comments") + parser.add_argument("--dry-run", action="store_true", help="Preview changes without modifying files") + parser.add_argument("--execute", action="store_true", help="Actually modify files") + parser.add_argument("--spec-id", help="Process only this spec ID") + parser.add_argument("--library", help="Process only this library") + args = parser.parse_args() + + if not args.dry_run and not args.execute: + print("Error: Must specify --dry-run or --execute") + sys.exit(1) + + dry_run = args.dry_run + + # Find all metadata files + plots_dir = Path("plots") + if not plots_dir.exists(): + print("Error: plots/ directory not found. Run from repository root.") + sys.exit(1) + + metadata_files = list(plots_dir.glob("*/metadata/*.yaml")) + print(f"Found {len(metadata_files)} metadata files") + + # Filter if spec-id or library specified + if args.spec_id: + metadata_files = [f for f in metadata_files if args.spec_id in str(f)] + if args.library: + metadata_files = [f for f in metadata_files if f.stem == args.library] + + print(f"Processing {len(metadata_files)} files...") + + updated = 0 + skipped = 0 + errors = 0 + + for metadata_file in sorted(metadata_files): + # Extract spec_id and library from path + # Path: plots/{spec-id}/metadata/{library}.yaml + spec_id = metadata_file.parent.parent.name + library = metadata_file.stem + + print(f"\n📦 {spec_id}/{library}") + + # Check if already has extended review data + try: + with open(metadata_file) as f: + existing_data = yaml.safe_load(f) + existing_review = existing_data.get("review", {}) if existing_data else {} + if existing_review.get("image_description") and existing_review.get("criteria_checklist"): + print(f" ✓ Already has extended review data, skipping") + skipped += 1 + continue + except Exception: + pass # Continue with backfill if we can't read + + # Find the merged PR + pr = find_merged_pr_for_implementation(spec_id, library) + if not pr: + print(f" ⏭️ No merged PR found") + skipped += 1 + continue + + pr_number = pr["number"] + print(f" 🔗 Found PR #{pr_number}") + + # Get all comments + comments = get_pr_comments(pr_number) + if not comments: + print(f" ⏭️ No comments found") + skipped += 1 + continue + + # Filter for AI Review comments + review_comments = [c for c in comments if "## AI Review" in c.get("body", "")] + if not review_comments: + print(f" ⏭️ No AI Review comments found") + skipped += 1 + continue + + print(f" 📝 Found {len(review_comments)} AI Review comment(s)") + + # Take the LAST AI Review comment (the one that led to merge) + # Sort by createdAt and take the last one + review_comments.sort(key=lambda c: c.get("createdAt", "")) + final_review = review_comments[-1] + + # Parse the review + review_data = parse_ai_review_comment(final_review["body"]) + if not review_data: + print(f" ⚠️ Failed to parse review comment") + errors += 1 + continue + + # Check if there's anything new to add + has_new_data = ( + review_data.get("image_description") or + review_data.get("criteria_checklist") or + review_data.get("verdict") + ) + + if not has_new_data: + print(f" ⏭️ No extended data found in review") + skipped += 1 + continue + + # Update the metadata file + if update_metadata_file(metadata_file, review_data, dry_run): + updated += 1 + else: + errors += 1 + + print(f"\n{'=' * 50}") + print(f"Summary: {updated} updated, {skipped} skipped, {errors} errors") + + if dry_run: + print("\n⚠️ DRY RUN - no files were modified") + print("Run with --execute to apply changes") + + +if __name__ == "__main__": + main() diff --git a/automation/scripts/sync_to_postgres.py b/automation/scripts/sync_to_postgres.py index 95192ab777..c8da3a6bb6 100644 --- a/automation/scripts/sync_to_postgres.py +++ b/automation/scripts/sync_to_postgres.py @@ -284,6 +284,10 @@ def scan_plot_directory(plot_dir: Path) -> dict | None: # Review feedback "review_strengths": review.get("strengths") or [], "review_weaknesses": review.get("weaknesses") or [], + # Extended review data (issue #2845) + "review_image_description": review.get("image_description"), + "review_criteria_checklist": review.get("criteria_checklist"), + "review_verdict": review.get("verdict"), } ) diff --git a/core/database/models.py b/core/database/models.py index 61b40533db..475d5aeb57 100644 --- a/core/database/models.py +++ b/core/database/models.py @@ -100,6 +100,11 @@ class Impl(Base): review_strengths: Mapped[list[str]] = mapped_column(StringArray, default=list) # What's good review_weaknesses: Mapped[list[str]] = mapped_column(StringArray, default=list) # What needs work + # Extended review data (from issue #2845) + review_image_description: Mapped[Optional[str]] = mapped_column(Text, nullable=True) # AI's visual description + review_criteria_checklist: Mapped[Optional[dict]] = mapped_column(UniversalJSON, nullable=True) # Detailed scoring + review_verdict: Mapped[Optional[str]] = mapped_column(String(20), nullable=True) # "APPROVED" or "REJECTED" + # System updated_at: Mapped[datetime] = mapped_column(DateTime, server_default=func.now(), onupdate=func.now()) diff --git a/docs/architecture/repository.md b/docs/architecture/repository.md index c63a9ba4b5..87e737ef3f 100644 --- a/docs/architecture/repository.md +++ b/docs/architecture/repository.md @@ -240,14 +240,63 @@ quality_score: 92 # Review feedback (used by AI for regeneration) review: - strengths: ["Clean code structure"] - weaknesses: ["Grid could be more subtle"] + # AI's visual description of the generated plot + image_description: | + The plot shows a scatter plot with 100 data points displaying + a positive correlation. Points are rendered in blue with 70% + opacity. Axes are clearly labeled and a subtle grid is visible. + + # Detailed scoring breakdown by category + criteria_checklist: + visual_quality: + score: 36 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: "All text readable at full size" + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: "No element overlap detected" + spec_compliance: + score: 23 + max: 25 + items: [...] + data_quality: + score: 18 + max: 20 + items: [...] + code_quality: + score: 10 + max: 10 + items: [...] + library_features: + score: 5 + max: 5 + items: [...] + + # Final verdict + verdict: APPROVED + + # Summary feedback + strengths: + - "Clean code structure" + - "Good use of alpha for overlapping points" + weaknesses: + - "Grid could be more subtle" ``` **Key Points**: - Each library has its own file (no merge conflicts!) - Created by `impl-generate.yml`, updated by `impl-review.yml` - Review feedback persisted for AI to improve on regeneration +- Extended review data includes `image_description`, `criteria_checklist`, and `verdict` for targeted fixes ### GCS Storage diff --git a/plots/alluvial-basic/metadata/altair.yaml b/plots/alluvial-basic/metadata/altair.yaml index d18a641d0f..990266e50e 100644 --- a/plots/alluvial-basic/metadata/altair.yaml +++ b/plots/alluvial-basic/metadata/altair.yaml @@ -30,3 +30,185 @@ review: weaknesses: - Node labels are abbreviated (Con, Lib, Prog, Ind) which slightly reduces immediate comprehension; full names would be preferable if space permits + image_description: 'The plot displays an alluvial diagram visualizing voter migration + between political parties across 4 U.S. election cycles (2012, 2016, 2020, 2024). + Four vertical columns represent time points with year labels positioned below. + Each column contains four stacked rectangular nodes representing parties: Conservative + (steel blue), Liberal (golden yellow), Progressive (green), and Independent (purple). + Curved semi-transparent flow bands connect nodes between consecutive time points, + showing voter transitions with width proportional to flow magnitude. Node labels + are abbreviated (Con, Lib, Prog, Ind) in white bold text centered on each node. + A legend on the right side identifies the party colors. The title "alluvial-basic + · altair · pyplots.ai" appears centered at the top.' + criteria_checklist: + visual_quality: + score: 36 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 9 + max: 10 + passed: true + comment: Title, year labels, and legend are clearly readable. Node labels + are readable but slightly small due to abbreviation. + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements; flows use transparency to handle visual + overlap well + - id: VQ-03 + name: Element Visibility + score: 7 + max: 8 + passed: true + comment: Nodes and flows are well-sized; flow transparency at 0.5 works well + for showing crossings + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Blue, yellow, green, purple palette is colorblind-safe with good + differentiation + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Plot fills canvas well with balanced margins; legend positioned appropriately + on right + - id: VQ-06 + name: Axis Labels + score: 0 + max: 2 + passed: true + comment: No axis labels (expected for alluvial diagrams, but year labels serve + as column headers) + - id: VQ-07 + name: Grid & Legend + score: 2 + max: 2 + passed: true + comment: Clean background, legend well-styled with border and appropriate + sizing + spec_compliance: + score: 23 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct alluvial diagram with vertical time ordering and flow bands + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Time points as columns, categories as nodes, flows showing transitions + correctly + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Has time point headers, category labels, proportional band widths, + transparency for overlaps + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: All data visible within the canvas + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend correctly identifies all four parties + - id: SC-06 + name: Title Format + score: 0 + max: 2 + passed: false + comment: Title format is correct "alluvial-basic · altair · pyplots.ai" ✓ + (restoring 2 points) + data_quality: + score: 20 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 8 + max: 8 + passed: true + comment: 'Shows multiple flow types: party retention (large flows staying + within category), party switching (cross-flows), and varying proportions + over time' + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Election voter migration is a highly realistic scenario mentioned + in the spec applications + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: Values in hundreds/thousands of voters are plausible; transitions + show realistic patterns (most voters stay, some switch) + code_quality: + score: 8 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 2 + max: 3 + passed: true + comment: Generally flat structure but uses multiple loops for data transformation + which is acceptable for this complex chart type + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Data is deterministic (hardcoded flow values), no random elements + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: Only altair and pandas imported, both used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current Altair API + - id: CQ-05 + name: Output Correct + score: 0 + max: 1 + passed: true + comment: Saves as both plot.png and plot.html correctly ✓ (restoring 1 point) + library_features: + score: 5 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 5 + max: 5 + passed: true + comment: 'Excellent use of Altair features: layered chart composition, mark_line + with filled polygons, mark_rect for nodes, mark_text for labels, declarative + encoding with detail and order for proper polygon rendering, tooltips on + nodes, interactive() for zoom/pan, proper scale configuration' + verdict: APPROVED diff --git a/plots/alluvial-basic/metadata/bokeh.yaml b/plots/alluvial-basic/metadata/bokeh.yaml index dfc408b2d7..76f2add140 100644 --- a/plots/alluvial-basic/metadata/bokeh.yaml +++ b/plots/alluvial-basic/metadata/bokeh.yaml @@ -25,3 +25,184 @@ review: - Legend is positioned far right creating slight visual imbalance - Node labels only shown for first and last time points; middle time points could benefit from value annotations + image_description: |- + The plot displays a basic alluvial diagram showing voter migration between four political parties (Democratic, Republican, Independent, Other) across four election years (2012, 2016, 2020, 2024). The visualization uses: + - **Colors**: Blue (#306998) for Democratic, Red (#D62728) for Republican, Yellow (#FFD43B) for Independent, Gray (#7F7F7F) for Other + - **Title**: "alluvial-basic · bokeh · pyplots.ai" centered at top + - **Subtitle**: "Voter Migration Between Parties (values in millions)" in gray below the title + - **Layout**: Four vertical time columns with rectangular nodes representing party sizes, connected by smooth Bezier curve bands showing flow transitions + - **Labels**: Left side shows starting values (Democratic 42M, Republican 37M, Independent 15M, Other 6M), right side shows ending values (Democratic 48M, Republican 40M, Independent 13M, Other 2M) + - **Time labels**: Bold year labels (2012, 2016, 2020, 2024) at the bottom + - **Legend**: Located on the right side showing all four party colors + - **Flow bands**: Semi-transparent (alpha 0.5) with color matching the source category, clearly showing transitions between parties + criteria_checklist: + visual_quality: + score: 37 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 9 + max: 10 + passed: true + comment: All text is readable; title is 32pt, labels are 20-24pt. Slightly + smaller than ideal for some elements but all clearly legible. + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements; labels are well-positioned on left + and right sides. + - id: VQ-03 + name: Element Visibility + score: 7 + max: 8 + passed: true + comment: Nodes and flow bands are clearly visible with good sizing. Transparency + (0.5) works well for overlapping flows. + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Blue/Red/Yellow/Gray palette is colorblind-friendly; good contrast + between categories. + - id: VQ-05 + name: Layout Balance + score: 4 + max: 5 + passed: true + comment: Good use of canvas space; plot is well-centered with appropriate + margins. Legend placement is functional but creates some asymmetry. + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: Time points clearly labeled; category labels include values with + units (M for millions). + - id: VQ-07 + name: Grid & Legend + score: 2 + max: 2 + passed: true + comment: No grid (appropriate for alluvial), legend is well-styled with good + font size and background. + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct alluvial/Sankey-style diagram with vertical ordering by time. + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Time points on X-axis, categories vertically stacked, flow widths + proportional to values. + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: 'All spec features present: time points, categories, values, flows + with proper proportions.' + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: All data visible; y-range properly calculated to show all nodes. + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend correctly identifies all four party categories with matching + colors. + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: Uses exact format "alluvial-basic · bokeh · pyplots.ai". + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 7 + max: 8 + passed: true + comment: Shows bidirectional flows, party retention, and cross-party migration. + Could show more dramatic shifts to highlight the visualization's capabilities. + - id: DQ-02 + name: Realistic Context + score: 6 + max: 7 + passed: true + comment: Election voter migration is a plausible scenario; values are in reasonable + range but slightly simplified. + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: Values in millions of voters are realistic for national elections; + proportions are sensible. + code_quality: + score: 9 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: Follows imports → data → plot → save structure; no functions or classes. + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Uses np.random.seed(42) for deterministic data. + - id: CQ-03 + name: Clean Imports + score: 1 + max: 2 + passed: true + comment: 'Has one unused import: Label is used but some imports like ColumnDataSource + mentioned in library rules aren''t used (though not imported). Minor: could + be slightly cleaner.' + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current Bokeh API. + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png and plot.html. + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Distinctive Features + score: 3 + max: 5 + passed: true + comment: Uses Bokeh's patch() for flow bands and quad() for nodes effectively. + Creates custom Bezier curves manually. Could leverage more Bokeh-specific + features like HoverTool for interactivity. + verdict: APPROVED diff --git a/plots/alluvial-basic/metadata/highcharts.yaml b/plots/alluvial-basic/metadata/highcharts.yaml index 7957547f21..850e243d4f 100644 --- a/plots/alluvial-basic/metadata/highcharts.yaml +++ b/plots/alluvial-basic/metadata/highcharts.yaml @@ -24,3 +24,175 @@ review: - Title includes extra text before required format; should be just spec-id · library · pyplots.ai - Subtitle font size could be slightly larger for better readability at 4800x2700 + image_description: 'The plot displays an alluvial diagram visualizing voter migration + between three political parties (Conservative, Moderate, Progressive) across three + election cycles (2016, 2020, 2024). The diagram uses a colorblind-safe palette: + blue (#306998) for Conservative, purple (#9467BD) for Moderate, and yellow (#FFD43B) + for Progressive. Nodes are arranged in three vertical columns representing each + year, with curved bands connecting nodes to show voter flow transitions. The title + "Voter Migration · alluvial-basic · highcharts · pyplots.ai" appears at the top + with a descriptive subtitle. Year labels (2016, 2020, 2024) appear at the bottom + of each column, and party names label each node. A horizontal legend at the bottom + identifies the three party colors.' + criteria_checklist: + visual_quality: + score: 36 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 9 + max: 10 + passed: true + comment: Title, labels, and legend are clearly readable; subtitle slightly + small but acceptable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text; all node labels are clearly separated + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Nodes and flows are appropriately sized; transparency (0.4) helps + with overlapping flows + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Colorblind-safe palette using blue, purple, yellow (no red-green) + - id: VQ-05 + name: Layout Balance + score: 4 + max: 5 + passed: true + comment: Good use of canvas space; slight imbalance with 2024 labels close + to edge + - id: VQ-06 + name: Axis Labels + score: 0 + max: 2 + passed: true + comment: N/A for alluvial; year labels serve as axis labels (acceptable) + - id: VQ-07 + name: Grid & Legend + score: 2 + max: 2 + passed: true + comment: Legend well-placed at bottom; no distracting grid elements + spec_compliance: + score: 24 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct alluvial/sankey diagram with strict vertical ordering + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Time points as columns, parties as categories, flows as band widths + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: 'All spec features present: time ordering, consistent colors, proportional + bands' + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: All data visible; flows proportional to values + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend correctly identifies all three parties + - id: SC-06 + name: Title Format + score: 1 + max: 2 + passed: true + comment: Contains spec-id, library, pyplots.ai but includes extra "Voter Migration" + prefix + data_quality: + score: 19 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 8 + max: 8 + passed: true + comment: 'Shows transitions in all directions: retention, gain, and loss between + parties' + - id: DQ-02 + name: Realistic Context + score: 6 + max: 7 + passed: true + comment: Voter migration is a perfect application; data patterns are plausible + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: Thousands of voters is appropriate scale; values are realistic + code_quality: + score: 8 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Linear flow: imports → data → chart config → render' + - id: CQ-02 + name: Reproducibility + score: 1 + max: 3 + passed: false + comment: Data is deterministic but no explicit seed comment; flows data is + hardcoded + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: All imports are used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current highcharts-core API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png and plot.html + library_features: + score: 4 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 4 + max: 5 + passed: true + comment: Good use of Highcharts sankey module with column positioning, annotations, + custom legend HTML, and interactive tooltips + verdict: APPROVED diff --git a/plots/alluvial-basic/metadata/letsplot.yaml b/plots/alluvial-basic/metadata/letsplot.yaml index 2ab649857b..e1a36f941b 100644 --- a/plots/alluvial-basic/metadata/letsplot.yaml +++ b/plots/alluvial-basic/metadata/letsplot.yaml @@ -27,3 +27,183 @@ review: KISS flat script style - Yellow (Independents) could be more distinguishable from gray (Non-Voters) in certain viewing conditions + image_description: The plot displays an alluvial diagram showing voter migration + between four political affiliations (Democrats, Republicans, Independents, Non-Voters) + across three US election cycles (2016, 2020, 2024). Three vertical columns represent + each election year, with colored rectangular nodes indicating party/voter status. + Blue represents Democrats (bottom), red for Republicans, yellow for Independents, + and gray for Non-Voters (top). Curved bands flow between nodes showing voter transitions + - flows are colored by destination party with ~55% transparency. The left side + shows party labels, while the right side shows party names with final 2024 totals + in millions (Democrats 85M, Republicans 78M, Independents 10M, Non-Voters 58M). + Title follows the required format at top-left. + criteria_checklist: + visual_quality: + score: 36 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 9 + max: 10 + passed: true + comment: Title, year headers, and party labels are clearly readable. Font + sizes are appropriate for the canvas size. + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements. Labels are well-positioned outside + the plot area. + - id: VQ-03 + name: Element Visibility + score: 7 + max: 8 + passed: true + comment: Nodes and flows are clearly visible. Flow bands have good alpha (0.55) + for overlap handling. Some minor flow crossings are hard to trace. + - id: VQ-04 + name: Color Accessibility + score: 4 + max: 5 + passed: true + comment: Blue, red, yellow, gray palette is distinguishable. Red-blue distinction + works for most colorblind types, though red-green sensitive users may have + some difficulty with yellow-gray distinction. + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Plot fills canvas well, good margins, balanced whitespace. + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: N/A for alluvial diagrams; party labels and year headers serve this + purpose and are descriptive with context (values in millions). + - id: VQ-07 + name: Grid & Legend + score: 1 + max: 2 + passed: true + comment: No legend shown (legend_position="none"), but colors are identifiable + via labels. Grid appropriately hidden for this plot type. + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct alluvial diagram with vertical time ordering and flow bands + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Time points as columns, categories as nodes, flow magnitudes as band + widths + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Shows transitions across 3 time points, 4 categories, proportional + band widths + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: All data visible, flows span full range between nodes + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Direct labeling replaces legend effectively + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: Uses "alluvial-basic · letsplot · pyplots.ai" format correctly + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 7 + max: 8 + passed: true + comment: Shows multiple flow directions (retention, migration between parties, + mobilization from non-voters). Could show more dramatic shifts for variety. + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: US election voter migration is a perfect, comprehensible real-world + scenario + - id: DQ-03 + name: Appropriate Scale + score: 4 + max: 5 + passed: true + comment: Values in millions are plausible for US electorate. Some totals seem + reasonable though exact numbers are illustrative. + code_quality: + score: 9 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 2 + max: 3 + passed: true + comment: Uses helper functions (calculate_node_positions, add_flows) which + slightly deviates from pure KISS style, but keeps code organized + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Deterministic data, no random seed needed (all values hardcoded) + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: All imports are used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current lets-plot API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png with correct scaling + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: true + comment: Uses ggplot grammar with geom_polygon for custom shapes, scale_fill_manual, + theme customization. However, lets-plot does not have a native alluvial + geom, so manual polygon construction was necessary. Good use of ggsize and + ggsave with scale parameter. + verdict: APPROVED diff --git a/plots/alluvial-basic/metadata/matplotlib.yaml b/plots/alluvial-basic/metadata/matplotlib.yaml index 854ca8c135..2b762bafc1 100644 --- a/plots/alluvial-basic/metadata/matplotlib.yaml +++ b/plots/alluvial-basic/metadata/matplotlib.yaml @@ -24,3 +24,175 @@ review: weaknesses: - Legend uses Independent but nodes use Indep abbreviation - should be consistent - Node labels could be slightly larger for the smallest nodes + image_description: 'The plot shows a well-designed alluvial diagram visualizing + voter migration across 4 election cycles (2012, 2016, 2020, 2024). Four political + categories are displayed as stacked rectangular nodes at each time point: Party + A (dark blue, #306998), Party B (yellow, #FFD43B), Party C (teal, #4ECDC4), and + Independent (gray, #95A5A6). Semi-transparent curved flow bands connect the nodes + between consecutive time points, showing how voters migrate between parties. Each + node is labeled with the party name and voter count in thousands. The title follows + the required format with spec-id, library, and pyplots.ai. A legend in the lower + left identifies the four categories. The layout is clean with good use of whitespace + and the flows are visually clear.' + criteria_checklist: + visual_quality: + score: 36 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 9 + max: 10 + passed: true + comment: Title, year labels, node labels all readable; node labels slightly + small for smallest nodes + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements + - id: VQ-03 + name: Element Visibility + score: 7 + max: 8 + passed: true + comment: Flow bands well-sized with appropriate alpha (0.4); nodes clearly + visible + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Colors are colorblind-friendly (blue, yellow, teal, gray) + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Plot fills canvas well, balanced margins + - id: VQ-06 + name: Axis Labels + score: 0 + max: 2 + passed: true + comment: N/A for alluvial diagrams (no traditional axes), but time points + labeled clearly + - id: VQ-07 + name: Grid & Legend + score: 2 + max: 2 + passed: true + comment: Legend well placed in lower left, no grid needed + spec_compliance: + score: 23 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct alluvial diagram with vertical ordering and flow bands + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Time points as columns, categories as stacked nodes, flows proportional + to magnitude + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: 'All spec features present: multiple time points, consistent colors, + proportional band widths, transparency for flows' + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: All data visible within the chart bounds + - id: SC-05 + name: Legend Accuracy + score: 0 + max: 2 + passed: true + comment: Legend labels match categories but "Indep." abbreviation in nodes + differs from "Independent" in legend + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: Correctly uses "{context} · alluvial-basic · matplotlib · pyplots.ai" + data_quality: + score: 19 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 7 + max: 8 + passed: true + comment: Shows multiple transitions, persistence within parties, and cross-party + migrations; could show more dramatic shifts + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Voter migration is a perfect real-world scenario for alluvial diagrams + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: Values in thousands of voters are realistic and sensible + code_quality: + score: 10 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Linear script: imports → data → plot → save' + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Uses np.random.seed(42) + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: Only necessary imports used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: No deprecated functions + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: true + comment: Good use of matplotlib.patches (PathPatch, Rectangle) and Path for + custom bezier curves; demonstrates matplotlib's flexibility for custom visualizations + verdict: APPROVED diff --git a/plots/alluvial-basic/metadata/plotly.yaml b/plots/alluvial-basic/metadata/plotly.yaml index 4ad5567b83..fa368280c5 100644 --- a/plots/alluvial-basic/metadata/plotly.yaml +++ b/plots/alluvial-basic/metadata/plotly.yaml @@ -27,3 +27,177 @@ review: could be increased for better readability - The y-position ordering places Conservative at top but the visual shows it with largest bar - consider if ordering by size would improve readability + image_description: 'The plot displays a Sankey/alluvial diagram showing voter migration + between four political parties (Conservative, Liberal, Progressive, Independent) + across four US election cycles (2012, 2016, 2020, 2024). The diagram has a white + background with year labels at the top of each column in bold. Each party is represented + by a distinct color: Conservative (blue #306998), Liberal (yellow #FFD43B), Progressive + (green #2CA02C), and Independent (purple #9467BD). Vertical bars at each time + point show the relative size of each party''s voter base, with semi-transparent + flow bands connecting them to show voter migration patterns. The Conservative + party (blue) has the largest node at each time point, positioned at the top. The + flows show mostly stable voter retention with some cross-party movement. A horizontal + legend at the bottom identifies each party color. The title "Voter Migration · + alluvial-basic · plotly · pyplots.ai" is centered at the top.' + criteria_checklist: + visual_quality: + score: 36 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 8 + max: 10 + passed: true + comment: Title and year labels are very readable; node labels on bars are + slightly small but legible + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Nodes and flow bands are appropriately sized and visible + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Four distinct colors that are colorblind-friendly (blue, yellow, + green, purple) + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Good use of canvas space, plot fills most of the area with balanced + margins + - id: VQ-06 + name: Axis Labels + score: 0 + max: 2 + passed: true + comment: N/A for Sankey/alluvial diagrams (no axes), but year labels serve + similar purpose + - id: VQ-07 + name: Grid & Legend + score: 2 + max: 2 + passed: true + comment: Clean horizontal legend, no grid needed for this chart type + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct alluvial/Sankey diagram implementation + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Time points as columns, categories as nodes, flows as connections + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: 'All spec features present: time ordering, consistent colors, proportional + band widths, transparency for flows' + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: All 4 time points and 4 categories fully visible + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend correctly identifies all four parties + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: Follows "{spec-id} · {library} · pyplots.ai" format correctly + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 7 + max: 8 + passed: true + comment: Shows voter retention AND migration between parties, demonstrates + the alluvial concept well + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: US voter migration is a perfect real-world use case for alluvial + diagrams + - id: DQ-03 + name: Appropriate Scale + score: 4 + max: 5 + passed: true + comment: Voter counts in hundreds are reasonable for a simplified model + code_quality: + score: 8 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Linear flow: imports → data → plot → save' + - id: CQ-02 + name: Reproducibility + score: 2 + max: 3 + passed: true + comment: Deterministic data (no random), but no explicit seed statement + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: Only plotly.graph_objects imported and used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current Plotly API + - id: CQ-05 + name: Output Correct + score: 0 + max: 1 + passed: true + comment: Saves as plot.png AND plot.html (correct) + library_features: + score: 5 + max: 5 + items: + - id: LF-01 + name: Distinctive Features + score: 5 + max: 5 + passed: true + comment: Excellent use of Plotly's go.Sankey with custom hover templates, + node positioning, and interactive HTML export + verdict: APPROVED diff --git a/plots/alluvial-basic/metadata/plotnine.yaml b/plots/alluvial-basic/metadata/plotnine.yaml index 63f1d296b4..9752273069 100644 --- a/plots/alluvial-basic/metadata/plotnine.yaml +++ b/plots/alluvial-basic/metadata/plotnine.yaml @@ -26,3 +26,165 @@ review: - Data is deterministic so no seed needed, but explicit data definition could use a comment explaining the voter transition matrix - Small flows between 2016-2018 are less visible compared to later periods + image_description: The plot displays an alluvial diagram showing voter migration + between three political parties (Democrats in blue, Republicans in red/coral, + Independent in yellow) across four election cycles (2016, 2018, 2020, 2022). Vertical + rectangular nodes represent party affiliations at each time point, with smooth + curved flow bands connecting them to visualize voter transitions. White voter + count labels (45, 43, 41, 14, etc.) appear inside nodes. Party names are displayed + on both left and right edges. Year labels are positioned at the bottom. A legend + on the right side identifies the three party colors. + criteria_checklist: + visual_quality: + score: 36 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 9 + max: 10 + passed: true + comment: Title is large and bold, year labels are clear, node counts visible, + party labels readable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements, all labels clearly separated + - id: VQ-03 + name: Element Visibility + score: 7 + max: 8 + passed: true + comment: Flow bands visible with good alpha transparency, nodes clearly defined + with white borders + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Blue, red, and yellow are colorblind-distinguishable + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Good canvas utilization, plot fills ~60% of canvas, balanced margins + - id: VQ-06 + name: Axis Labels + score: 0 + max: 2 + passed: true + comment: No axis labels (but appropriate for this plot type with custom annotations) + - id: VQ-07 + name: Grid & Legend + score: 2 + max: 2 + passed: true + comment: Clean minimal theme with no grid (appropriate), well-placed legend + spec_compliance: + score: 23 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct alluvial diagram with vertical time ordering + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Time points as columns, parties as categories, voter counts as values + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Flows show transitions, band width proportional to flow magnitude, + transparency for overlapping flows + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: All data points visible within the visualization + - id: SC-05 + name: Legend Accuracy + score: 0 + max: 2 + passed: true + comment: Legend shows "Party" but the title context is voter migration + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: Uses "{topic} · alluvial-basic · plotnine · pyplots.ai" format + data_quality: + score: 19 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 7 + max: 8 + passed: true + comment: Shows party retention (large same-party flows) and migration (smaller + cross-party flows), but some small flows filtered out + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Election data with years as time points, parties as categories - + real-world scenario + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: Voter counts in reasonable ranges (~14-45 per party per year), realistic + proportions + code_quality: + score: 8 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Linear flow: imports → data → calculations → plot → save' + - id: CQ-02 + name: Reproducibility + score: 0 + max: 3 + passed: false + comment: No random seed set (data is deterministic, so this is minor) + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: All imports are used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current plotnine API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png with dpi=300 + library_features: + score: 5 + max: 5 + items: [] + verdict: APPROVED diff --git a/plots/alluvial-basic/metadata/pygal.yaml b/plots/alluvial-basic/metadata/pygal.yaml index 51f1637f17..f61a7deb72 100644 --- a/plots/alluvial-basic/metadata/pygal.yaml +++ b/plots/alluvial-basic/metadata/pygal.yaml @@ -23,3 +23,172 @@ review: - Subtitle font could be slightly larger for better readability - Title uses spaces around middot which is acceptable but slightly different from spec + image_description: The plot shows an alluvial diagram titled "alluvial-basic · pygal + · pyplots.ai" displaying voter migration between political parties across four + election cycles (2012, 2016, 2020, 2024). Four vertical bars represent each time + point, with stacked segments for Democratic (blue), Republican (red), Independent + (yellow), and Other (gray) parties. Semi-transparent curved bands connect the + bars showing voter flow between parties. Party labels appear on both left and + right sides in matching colors. Year labels appear below each column. A subtitle + at the bottom reads "Voter Migration Between Political Parties (Millions of Voters)". + The color scheme is colorblind-safe with good contrast. + criteria_checklist: + visual_quality: + score: 36 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 9 + max: 10 + passed: true + comment: Title and labels are readable, subtitle could be slightly larger + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text, all labels well positioned + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bar segments and flow bands are well sized and visible + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Colorblind-safe palette with blue, red, yellow, gray + - id: VQ-05 + name: Layout Balance + score: 4 + max: 5 + passed: true + comment: Good use of canvas but slight extra whitespace at top + - id: VQ-06 + name: Axis Labels + score: 0 + max: 2 + passed: false + comment: No traditional axes (appropriate for alluvial), subtitle serves as + description + - id: VQ-07 + name: Grid & Legend + score: 2 + max: 2 + passed: true + comment: Party labels on sides serve as legend, no distracting grid + spec_compliance: + score: 24 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct alluvial diagram with time-ordered columns and flow bands + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Time points as columns, categories as stacked segments, flows as + bands + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: 'All spec features present: time ordering, consistent colors, proportional + bands, transparency' + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: All four time points and all categories visible + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Party labels correctly colored and positioned + - id: SC-06 + name: Title Format + score: 1 + max: 2 + passed: true + comment: Correct format "alluvial-basic · pygal · pyplots.ai" but uses spaces + around middot + data_quality: + score: 20 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 8 + max: 8 + passed: true + comment: Shows multiple flows including party retention and crossover migration + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: US election data with plausible voter migration scenario + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: Realistic voter counts in millions matching actual election magnitudes + code_quality: + score: 8 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 2 + max: 3 + passed: true + comment: Generally flat structure but has some complexity due to manual SVG + generation + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Uses np.random.seed(42) + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: All imports are used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Modern API usage + - id: CQ-05 + name: Output Correct + score: 0 + max: 1 + passed: false + comment: Saves as plot.png correctly + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses pygal as base + score: 3 + max: 5 + passed: true + comment: Uses pygal XY chart as canvas and custom SVG injection for alluvial + elements; creative workaround since pygal lacks native alluvial support + verdict: APPROVED diff --git a/plots/alluvial-basic/metadata/seaborn.yaml b/plots/alluvial-basic/metadata/seaborn.yaml index 891733586f..a8c8f2f307 100644 --- a/plots/alluvial-basic/metadata/seaborn.yaml +++ b/plots/alluvial-basic/metadata/seaborn.yaml @@ -24,3 +24,176 @@ review: - No formal legend box (inline labels work but a legend would be cleaner) - Limited use of seaborn core plotting functions since alluvial diagrams require custom matplotlib patches + image_description: 'The plot displays an alluvial diagram showing US voter migration + across 4 election cycles (2012, 2016, 2020, 2024). Four vertical stacked bars + represent each year, with segments colored by party: Democratic (blue), Republican + (orange), Independent (green), and Other (gray). The colorblind-safe palette from + seaborn is used. Curved flow bands connect the bars showing voter transitions + between parties, with band widths proportional to flow magnitude. The title follows + the required format "alluvial-basic · seaborn · pyplots.ai" at the top. Labels + on the left (2012) and right (2024) edges show party names with voter counts in + millions. Each year column header shows the year and total voters. An italicized + subtitle at the bottom explains the data context.' + criteria_checklist: + visual_quality: + score: 36 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 9 + max: 10 + passed: true + comment: All text readable, good font sizes, labels clear + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text, labels positioned outside bars + - id: VQ-03 + name: Element Visibility + score: 7 + max: 8 + passed: true + comment: Flow bands visible with appropriate alpha, smaller flows use higher + alpha for visibility + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Uses seaborn's colorblind-safe palette + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Good use of canvas space, balanced margins + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: N/A for alluvial (no traditional axes), but year headers and party + labels are descriptive with units (M for millions) + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: false + comment: No formal legend, though colors are labeled directly on bars + spec_compliance: + score: 23 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct alluvial diagram with vertical columns and curved flows + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Time points as columns, categories as stacked segments, flows between + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: 'All spec features present: time points left-to-right, consistent + colors, proportional band widths, transparency for flows' + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: All data visible, years 2012-2024 shown + - id: SC-05 + name: Legend Accuracy + score: 0 + max: 2 + passed: true + comment: No separate legend provided; labels are inline but a legend would + improve clarity + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: Uses correct format "alluvial-basic · seaborn · pyplots.ai" + data_quality: + score: 20 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 8 + max: 8 + passed: true + comment: Shows party retention (large same-party flows), cross-party migration + (visible transitions), varying flow sizes, multiple time transitions + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: US voter data across election years is a comprehensible, real-world + scenario + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: Voter counts in realistic millions range (60-80M for major parties) + code_quality: + score: 9 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 2 + max: 3 + passed: true + comment: Generally linear flow, though code is longer due to alluvial complexity; + no classes but uses nested loops + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: np.random.seed(42) set + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: All imports used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: No deprecated functions + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: true + comment: Uses sns.set_style, sns.set_context, sns.color_palette; however, + the core plotting uses matplotlib patches rather than seaborn plot functions + (alluvial is not a native seaborn plot type) + verdict: APPROVED diff --git a/plots/andrews-curves/metadata/altair.yaml b/plots/andrews-curves/metadata/altair.yaml index 556507a9c1..001c91af26 100644 --- a/plots/andrews-curves/metadata/altair.yaml +++ b/plots/andrews-curves/metadata/altair.yaml @@ -26,3 +26,180 @@ review: - Yellow color (#FFD43B) could be slightly less bright for better visibility on white background - Could add tooltips to enable interactive exploration of individual observations + image_description: 'The plot displays Andrews curves for the Iris dataset with 150 + observations transformed into Fourier series curves. Three iris species are color-coded: + Setosa in yellow/gold (#FFD43B), Versicolor in blue (#306998), and Virginica in + olive green (#6B8E23). The x-axis shows "t (radians)" ranging from approximately + -π to π (-3.4 to 3.2), and the y-axis displays "Andrews Curve Value" ranging from + about -4 to 6. The title follows the required format: "Iris Classification · andrews-curves + · altair · pyplots.ai" with a descriptive subtitle. The legend is positioned in + the upper right corner. The curves demonstrate clear visual separation between + species, with Setosa (yellow) forming a distinct cluster near y=0, while Versicolor + and Virginica show overlapping wave patterns at higher amplitudes.' + criteria_checklist: + visual_quality: + score: 36 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 9 + max: 10 + passed: true + comment: 'Title, axis labels, and legend are clearly readable. Font sizes + are appropriate for the canvas size. Minor: tick labels could be slightly + larger.' + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements. All labels and legend are well-positioned. + - id: VQ-03 + name: Element Visibility + score: 7 + max: 8 + passed: true + comment: Curves are visible with appropriate opacity (0.4). strokeWidth=2 + works well for the data density. Very slight difficulty distinguishing individual + curves in dense regions. + - id: VQ-04 + name: Color Accessibility + score: 4 + max: 5 + passed: true + comment: Blue, yellow, and olive green provide reasonable distinction. Yellow + on white background could be slightly challenging in some contexts. + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Plot fills canvas well, balanced margins, legend is appropriately + positioned near the data. + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: '"t (radians)" includes units, "Andrews Curve Value" is descriptive.' + - id: VQ-07 + name: Grid & Legend + score: 1 + max: 2 + passed: true + comment: No visible grid (which is acceptable for this plot type), legend + is well-placed but could benefit from a background for better contrast. + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct Andrews curves implementation using Fourier series transformation. + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: X=t parameter, Y=Andrews curve value, correctly implemented. + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: 'All spec features present: normalized variables, transparency (alpha=0.4), + color by category, t range from -π to π.' + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: Axes show all data appropriately. + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend correctly labels all three species. + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: Title includes spec-id "andrews-curves", library "altair", and "pyplots.ai". + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 7 + max: 8 + passed: true + comment: Shows cluster separation between species, demonstrates the Fourier + transformation well. Could potentially show outlier detection more explicitly. + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Iris dataset is a classic, appropriate example for Andrews curves + as mentioned in the spec. + - id: DQ-03 + name: Appropriate Scale + score: 4 + max: 5 + passed: true + comment: Standardized data produces sensible curve ranges. 150 observations + is within the recommended 30-150 range. + code_quality: + score: 9 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Clean structure: imports → data → transformation → plot → save.' + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: np.random.seed(42) is set. + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: All imports are used (altair, numpy, pandas, sklearn). + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current Altair API. + - id: CQ-05 + name: Output Correct + score: 0 + max: 1 + passed: true + comment: Saves as plot.png and plot.html (correct for Altair). + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: true + comment: Uses Altair's declarative encoding with detail for grouping curves, + proper mark_line with opacity. Could leverage more Altair-specific features + like tooltips or interactive selection. + verdict: APPROVED diff --git a/plots/andrews-curves/metadata/bokeh.yaml b/plots/andrews-curves/metadata/bokeh.yaml index 8f295cca1b..03df36868e 100644 --- a/plots/andrews-curves/metadata/bokeh.yaml +++ b/plots/andrews-curves/metadata/bokeh.yaml @@ -28,3 +28,174 @@ review: - Legend background could have slightly higher opacity for better readability - Does not leverage Bokeh interactive features like hover tooltips which would enhance the visualization + image_description: The plot displays Andrews curves for the Iris dataset with 150 + observations across three species. Blue curves (#306998) represent one group, + yellow curves (#FFD43B) another, and teal curves (#2AA198) the third. The x-axis + shows "t (radians)" ranging from -π to π, and the y-axis shows "f(t)" ranging + approximately from -4 to 6. The title "andrews-curves · bokeh · pyplots.ai" appears + at the top left. A legend on the right identifies Setosa, Versicolor, and Virginica + species. All curves show smooth Fourier transformations with appropriate transparency + (alpha=0.4) to reveal density patterns. Dashed grid lines provide subtle reference + without being distracting. + criteria_checklist: + visual_quality: + score: 36 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 9 + max: 10 + passed: true + comment: Title, axis labels, and tick marks are readable, font sizes appropriately + scaled for 4800x2700 + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements + - id: VQ-03 + name: Element Visibility + score: 7 + max: 8 + passed: true + comment: Curves are visible with good line_width=2 and alpha=0.4; slight density + in overlapping regions + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Blue, yellow, and teal are colorblind-safe with good contrast + - id: VQ-05 + name: Layout Balance + score: 4 + max: 5 + passed: true + comment: Good layout, plot fills canvas well, legend positioned on right + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: 'Descriptive labels with units: "t (radians)" and "f(t)"' + - id: VQ-07 + name: Grid & Legend + score: 1 + max: 2 + passed: true + comment: Grid is subtle with dashed style and alpha=0.3; legend well placed + but could have better background contrast + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct Andrews curves using Fourier series transformation + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Variables correctly transformed to Fourier coefficients + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: 'All spec features present: normalization, transparency, color by + category, t from -π to π' + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: Axes show all curves without clipping + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend correctly identifies all three species + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: 'Correct format: "andrews-curves · bokeh · pyplots.ai"' + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 7 + max: 8 + passed: true + comment: Shows cluster separation well; Setosa clearly distinct, Versicolor/Virginica + show expected overlap + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Uses canonical Iris dataset, perfect real-world botanical example + - id: DQ-03 + name: Appropriate Scale + score: 4 + max: 5 + passed: true + comment: StandardScaler applied correctly; values are realistic for normalized + data + code_quality: + score: 9 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 2 + max: 3 + passed: true + comment: Has one helper function (andrews_curve) which breaks strict KISS; + could be inline + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Uses sklearn.datasets.load_iris() which is deterministic + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: All imports are used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: No deprecated functions + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: true + comment: Uses ColumnDataSource, figure, Legend properly; could leverage hover + tools for interactivity + verdict: APPROVED diff --git a/plots/andrews-curves/metadata/highcharts.yaml b/plots/andrews-curves/metadata/highcharts.yaml index 26912d0293..9c53f5b25b 100644 --- a/plots/andrews-curves/metadata/highcharts.yaml +++ b/plots/andrews-curves/metadata/highcharts.yaml @@ -23,3 +23,16 @@ review: weaknesses: - Helper function andrews_curve() deviates from pure KISS structure (minor) - Y-axis label f(t) could be more descriptive for general audience + image_description: The plot displays Andrews curves for the Iris dataset with three + species (Setosa, Versicolor, Virginica) shown in different colors. The x-axis + represents t (radians) ranging from -3 to 3, and the y-axis represents f(t) ranging + from approximately -5 to 6. Blue curves represent Setosa, yellow/gold curves represent + Versicolor, and purple curves represent Virginica. The curves show distinctive + wave patterns that help distinguish species - Setosa curves (blue) tend to have + lower amplitude and cluster together, while Versicolor (yellow) and Virginica + (purple) show more overlap but with distinguishable patterns. A vertical legend + is positioned in the upper right corner with a white background. The title reads + "Iris Species · andrews-curves · highcharts · pyplots.ai". Grid lines are subtle + and visible. Transparency is applied to the curves allowing overlapping patterns + to be visible. + verdict: APPROVED diff --git a/plots/andrews-curves/metadata/letsplot.yaml b/plots/andrews-curves/metadata/letsplot.yaml index bcc6421e27..0d1c8cb80e 100644 --- a/plots/andrews-curves/metadata/letsplot.yaml +++ b/plots/andrews-curves/metadata/letsplot.yaml @@ -27,3 +27,174 @@ review: them, but subtle grid would help) - Missing explicit random seed (though data is deterministic from sklearn, good practice to include) + image_description: The plot displays Andrews curves for the Iris dataset, showing + 150 Fourier series curves colored by species. Blue curves represent setosa (tightly + clustered in lower range), yellow curves represent versicolor (middle range), + and red/orange curves represent virginica (spreading into higher values). The + X-axis shows parameter t from -π to π with proper Greek letter labels at key intervals + (-π, -π/2, 0, π/2, π). The Y-axis displays Fourier Function Value ranging approximately + from -5 to 5.5. The title correctly follows the format "andrews-curves · letsplot + · pyplots.ai". A legend on the right identifies the three species. Transparency + (alpha=0.4) effectively reveals density patterns where curves overlap. + criteria_checklist: + visual_quality: + score: 36 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title, axis labels, tick labels, and legend text are all clearly + readable at appropriate sizes + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements; all labels are clearly separated + - id: VQ-03 + name: Element Visibility + score: 7 + max: 8 + passed: true + comment: Lines are visible with good transparency; could be slightly thicker + for better visibility at high density + - id: VQ-04 + name: Color Accessibility + score: 4 + max: 5 + passed: true + comment: Blue, yellow, and red are distinguishable but yellow-red may be challenging + for some colorblind users + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Plot fills canvas well with balanced margins + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: 'Descriptive labels with units: "Parameter t (radians)" and "Fourier + Function Value"' + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: true + comment: Grid is not visible (missing grid lines reduce visual reference) + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct Andrews curves visualization with Fourier transformation + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Variables correctly mapped to Fourier coefficients, category to color + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Normalization, transparency, color by category, t range from -π to + π all implemented + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: All data visible within axes range + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend correctly identifies species + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: Correctly formatted as "andrews-curves · letsplot · pyplots.ai" + data_quality: + score: 20 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 8 + max: 8 + passed: true + comment: Shows all 150 observations, clear cluster separation visible between + species + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Uses classic Iris dataset, a neutral scientific dataset + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: Normalized data with appropriate Fourier transform values + code_quality: + score: 7 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Linear script structure: imports → data → transform → plot → save' + - id: CQ-02 + name: Reproducibility + score: 0 + max: 3 + passed: false + comment: Missing np.random.seed(42); uses sklearn dataset but transformation + should still be deterministic + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: All imports are used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Current API usage + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: true + comment: Uses ggplot grammar, scale_x_continuous with custom labels, theme + customization, but no interactive-specific features + verdict: APPROVED diff --git a/plots/andrews-curves/metadata/matplotlib.yaml b/plots/andrews-curves/metadata/matplotlib.yaml index 02e775ea9f..70712f9d14 100644 --- a/plots/andrews-curves/metadata/matplotlib.yaml +++ b/plots/andrews-curves/metadata/matplotlib.yaml @@ -26,3 +26,170 @@ review: library guidelines - Legend sample lines use alpha=0.8 while actual curves use alpha=0.4, creating visual inconsistency + image_description: 'The plot shows Andrews curves visualization using the Iris dataset + with 150 observations (50 per species). Three distinct colors are used: blue (#306998) + for Setosa, yellow (#FFD43B) for Versicolor, and coral/pink (#E06C75) for Virginica. + The x-axis displays t values from -π to π in radians with clear labels at -π, + -π/2, 0, π/2, π. The y-axis shows f(t) values ranging approximately from -4 to + 5. The title "andrews-curves · matplotlib · pyplots.ai" is displayed at the top. + A legend in the upper right identifies the three species. The curves clearly show + Setosa (blue) clustering distinctly from the other two species, demonstrating + good separation, while Versicolor (yellow) and Virginica (coral) overlap significantly + but have some separation in certain regions. A subtle dashed grid (alpha=0.3) + aids readability.' + criteria_checklist: + visual_quality: + score: 36 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title at 24pt, axis labels at 20pt, tick labels at 16pt - all perfectly + readable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements + - id: VQ-03 + name: Element Visibility + score: 7 + max: 8 + passed: true + comment: Lines at linewidth=1.5 with alpha=0.4 work well for 150 curves, though + slightly thin per library guidelines (recommends linewidth=2-4) + - id: VQ-04 + name: Color Accessibility + score: 4 + max: 5 + passed: true + comment: Blue/yellow/coral palette is mostly colorblind-safe, though yellow + can be hard to distinguish from coral for some types of colorblindness + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Plot fills canvas well with balanced margins + - id: VQ-06 + name: Axis Labels + score: 1 + max: 2 + passed: true + comment: '"t (radians)" and "f(t)" are descriptive but f(t) could be more + explanatory (e.g., "Andrews Function Value")' + - id: VQ-07 + name: Grid & Legend + score: 1 + max: 2 + passed: true + comment: Grid is subtle at alpha=0.3, but legend alpha=0.8 sample lines differ + from plotted alpha=0.4 curves + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct Andrews curves visualization + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Variables correctly transformed using Fourier expansion + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Normalized data, appropriate alpha for overlapping curves, colored + by category, t from -π to π + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: All curves visible within axes range + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend correctly identifies species + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: Uses correct format "andrews-curves · matplotlib · pyplots.ai" + data_quality: + score: 20 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 8 + max: 8 + passed: true + comment: Shows cluster separation (Setosa distinct) and overlap patterns (Versicolor/Virginica), + demonstrating Andrews curves' utility for multivariate comparison + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Uses classic Iris dataset, a standard benchmark in data visualization + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: StandardScaler normalization produces appropriate f(t) range + code_quality: + score: 7 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: Clean imports → data → plot → save structure + - id: CQ-02 + name: Reproducibility + score: 0 + max: 3 + passed: false + comment: No np.random.seed(42), though sklearn's Iris is deterministic so + output is reproducible + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: All imports used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: No deprecated functions + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png + library_features: + score: 3 + max: 5 + items: [] + verdict: APPROVED diff --git a/plots/andrews-curves/metadata/plotly.yaml b/plots/andrews-curves/metadata/plotly.yaml index c71d20c682..8cfdff2261 100644 --- a/plots/andrews-curves/metadata/plotly.yaml +++ b/plots/andrews-curves/metadata/plotly.yaml @@ -26,3 +26,177 @@ review: rule; should inline the transformation logic - Yellow color for Versicolor may be less distinguishable for colorblind users; consider using a more accessible palette + image_description: 'The plot displays Andrews curves for the Iris dataset with 150 + samples transformed into Fourier series curves. Three species are shown: Setosa + (blue), Versicolor (yellow/gold), and Virginica (red/coral). The x-axis shows + parameter t in radians from -π to π with proper π notation tick labels. The y-axis + shows f(t) in normalized units ranging from approximately -4 to 4. The title correctly + reads "Iris Dataset · andrews-curves · plotly · pyplots.ai". The legend is well-positioned + in the upper right corner with a subtle border. Curves show clear visual separation + between species - Setosa curves (blue) cluster distinctly from Versicolor and + Virginica, which show some natural overlap. Transparency (alpha=0.4) effectively + reveals density patterns where curves converge and diverge.' + criteria_checklist: + visual_quality: + score: 36 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title at 32pt, axis labels at 24pt, tick labels at 18pt - all clearly + readable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements, legend positioned away from data + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Line width=2 with 0.4 opacity perfectly suited for 150 overlapping + curves + - id: VQ-04 + name: Color Accessibility + score: 4 + max: 5 + passed: true + comment: Blue/yellow/red distinguishable, though yellow could be harder for + some colorblind users + - id: VQ-05 + name: Layout Balance + score: 4 + max: 5 + passed: true + comment: Good canvas utilization, minor extra whitespace on right side + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: 'Descriptive with units: "Parameter t (radians)", "f(t) (normalized + units)"' + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: false + comment: Grid alpha 0.3 is appropriate, but the legend shows "Setosa", "Versicolor", + "Virginica" labels which appear small relative to the overall plot + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct Andrews curves visualization with Fourier transformation + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Variables correctly mapped as Fourier coefficients, t parameter correctly + on x-axis + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Normalization applied, transparency used, color by category implemented + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: Full t range [-π, π] shown, y-axis auto-scaled to data + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Species names correctly labeled + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: 'Uses correct format: "Iris Dataset · andrews-curves · plotly · pyplots.ai"' + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 8 + max: 8 + passed: true + comment: Shows all 150 samples, demonstrates cluster separation and overlap + patterns + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Classic Iris dataset, perfect for demonstrating multivariate visualization + - id: DQ-03 + name: Appropriate Scale + score: 3 + max: 5 + passed: true + comment: Normalized values are correct but deterministic data from sklearn + has no seed needed + code_quality: + score: 7 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 0 + max: 3 + passed: false + comment: Contains a helper function `andrews_curve()` which violates the no-functions + rule + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Uses deterministic Iris dataset from sklearn + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: All imports used (numpy, plotly, sklearn) + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current Plotly API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png with correct dimensions + library_features: + score: 5 + max: 5 + items: + - id: LF-01 + name: Uses Plotly features + score: 5 + max: 5 + passed: true + comment: Custom hover templates, interactive HTML export, proper legend grouping, + go.Scatter with graph_objects + verdict: APPROVED diff --git a/plots/andrews-curves/metadata/plotnine.yaml b/plots/andrews-curves/metadata/plotnine.yaml index 8b8cda8c4e..73c3eb6364 100644 --- a/plots/andrews-curves/metadata/plotnine.yaml +++ b/plots/andrews-curves/metadata/plotnine.yaml @@ -23,3 +23,182 @@ review: weaknesses: - Color palette could be more distinct - the green and blue can appear similar in dense curve regions; consider using a more divergent palette + image_description: The plot displays Andrews curves for the iris dataset with three + species (setosa, versicolor, virginica). The visualization shows smooth sinusoidal + curves spanning from approximately -π to π on the x-axis (labeled "t (radians)") + and Andrews Curve Values ranging from about -5 to 5 on the y-axis. Setosa curves + (blue) cluster distinctly in the upper region around t=0, while versicolor (yellow/orange) + and virginica (darker blue/green) curves show more overlap in the middle and lower + regions. The plot uses a minimal theme with a light gray background, has a legend + positioned on the right side showing the three species, and the title follows + the correct format "andrews-curves · plotnine · pyplots.ai". + criteria_checklist: + visual_quality: + score: 36 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title at 24pt bold, axis labels at 20pt, tick labels at 16pt, legend + text at 16pt - all clearly readable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements + - id: VQ-03 + name: Element Visibility + score: 7 + max: 8 + passed: true + comment: Curves are visible with appropriate alpha=0.4 and size=0.8 for 150 + observations; slight overlap in versicolor/virginica region but this is + expected behavior showing cluster overlap + - id: VQ-04 + name: Color Accessibility + score: 4 + max: 5 + passed: true + comment: Blue (#1f77b4), orange (#ff7f0e), green (#2ca02c) are reasonable + but the green appears quite similar to the blue in some regions + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Good proportions, plot fills canvas appropriately with balanced margins + - id: VQ-06 + name: Axis Labels + score: 1 + max: 2 + passed: true + comment: '"t (radians)" has units, but "Andrews Curve Value" is generic (no + unit, which is acceptable as it''s dimensionless)' + - id: VQ-07 + name: Grid & Legend + score: 1 + max: 2 + passed: true + comment: Legend well positioned on right; grid is present but very subtle + (could be slightly more visible) + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct Andrews curves visualization with Fourier transformation + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: t parameter on x-axis, curve values on y-axis, color by species + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: 'All spec features present: normalization, transparency, color by + category, t from -π to π' + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: Axes show all data appropriately + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend correctly shows three species names + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: Correct format "andrews-curves · plotnine · pyplots.ai" + data_quality: + score: 20 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 8 + max: 8 + passed: true + comment: 'Shows all aspects: cluster separation (setosa distinct), cluster + overlap (versicolor/virginica), wave patterns characteristic of Andrews + curves' + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Uses real iris dataset, a classic example for multivariate visualization + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: StandardScaler normalization produces appropriate scale, 150 observations + with 4 dimensions as recommended + code_quality: + score: 7 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Linear script structure: imports → data loading → transformation + → plot → save' + - id: CQ-02 + name: Reproducibility + score: 0 + max: 3 + passed: false + comment: '**No random seed set**. While iris dataset is deterministic, sklearn''s + load_iris() behavior should be considered reproducible, but best practice + would include a seed. However, since the data is fully deterministic (no + randomization used), this is acceptable. *Revised: 3/3 - data is fully deterministic*' + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: All imports are used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Modern plotnine API used + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as "plot.png" + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: true + comment: Uses ggplot2 grammar correctly with geom_line, aes mapping, scale_color_manual, + and theme_minimal. Could potentially leverage faceting or other plotnine + features, but implementation is solid. + verdict: APPROVED diff --git a/plots/andrews-curves/metadata/seaborn.yaml b/plots/andrews-curves/metadata/seaborn.yaml index 162c6dcb34..c125da8fc5 100644 --- a/plots/andrews-curves/metadata/seaborn.yaml +++ b/plots/andrews-curves/metadata/seaborn.yaml @@ -24,3 +24,179 @@ review: - Axis labels use mathematical notation only (t, f(t)) without descriptive context for newcomers - Legend could be positioned to avoid any potential overlap with curve endpoints + image_description: The plot displays Andrews curves for the Iris dataset with three + species (setosa, versicolor, virginica) represented by different colors. The x-axis + shows t values from -π to π with appropriate π notation labels. The y-axis shows + f(t) values ranging from approximately -4 to 5. Blue curves represent setosa, + yellow/gold curves represent versicolor, and red/coral curves represent virginica. + The curves show clear separation between species groups - setosa curves tend toward + negative f(t) values in the middle region while virginica curves trend higher. + The legend is positioned in the upper right corner with "Species" as the title. + The plot has a white grid background with subtle gridlines, and the title follows + the required format. All 150 observations from the Iris dataset are visualized + as individual curves with appropriate transparency to show density patterns. + criteria_checklist: + visual_quality: + score: 37 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title at 24pt, axis labels at 20pt, tick labels at 16pt - all perfectly + readable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements + - id: VQ-03 + name: Element Visibility + score: 7 + max: 8 + passed: true + comment: Lines visible with good alpha=0.4 transparency for 150 curves, linewidth=1.5 + is appropriate + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Blue (#306998), Yellow (#FFD43B), Red (#E74C3C) palette is colorblind-safe + (distinguishable by luminance) + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Good 16:9 aspect ratio, plot fills canvas well, balanced margins + - id: VQ-06 + name: Axis Labels + score: 1 + max: 2 + passed: true + comment: '"t" and "f(t)" are mathematical notation appropriate for Andrews + curves but lack descriptive context' + - id: VQ-07 + name: Grid & Legend + score: 1 + max: 2 + passed: true + comment: Grid is subtle (alpha=0.3), legend well placed but overlaps slightly + with some curve endpoints + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct Andrews curves Fourier transformation visualization + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Variables correctly transformed using Fourier series coefficients + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Normalization, transparency, color by category, t from -π to π all + implemented + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: Axes show all data appropriately + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend correctly identifies species + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: Uses exact format "andrews-curves · seaborn · pyplots.ai" + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 7 + max: 8 + passed: true + comment: Shows cluster separation and overlap patterns well, could show outliers + more prominently + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Iris dataset is classic multivariate data, perfect for demonstrating + Andrews curves + - id: DQ-03 + name: Appropriate Scale + score: 4 + max: 5 + passed: true + comment: Normalized values are appropriate; scale is sensible + code_quality: + score: 9 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Linear flow: imports → data → transform → plot → save' + - id: CQ-02 + name: Reproducibility + score: 2 + max: 3 + passed: true + comment: Uses fixed dataset (iris) but no random seed explicitly set (not + strictly needed here since data is deterministic) + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: All imports used appropriately + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current seaborn API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png with dpi=300 + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: true + comment: Good use of sns.lineplot with units parameter for individual curves + and sns.load_dataset for data loading, but Andrews curves transformation + is manual (not a seaborn built-in) + verdict: APPROVED diff --git a/plots/arc-basic/metadata/altair.yaml b/plots/arc-basic/metadata/altair.yaml index 6370811d79..f9bd659ccc 100644 --- a/plots/arc-basic/metadata/altair.yaml +++ b/plots/arc-basic/metadata/altair.yaml @@ -26,3 +26,170 @@ review: - Layout has excessive whitespace below the baseline; nodes are positioned at y=10 in a 900px height canvas - Missing legend for edge weight interpretation (strokeWidth encoding has legend=None) + image_description: The plot displays an arc diagram showing character interactions. + Ten nodes (Alice, Bob, Carol, David, Eve, Frank, Grace, Henry, Iris, Jack) are + arranged horizontally along the bottom of the chart, represented as yellow circles + with blue outlines. The character names appear below each node in bold blue text. + Curved blue arcs connect pairs of nodes above the horizontal line, with arc height + proportional to the distance between connected nodes. The longest arcs span from + Alice to Jack and Alice to Henry, reaching nearly to the top of the plot. Shorter + arcs connect adjacent or nearby characters. The arcs use semi-transparent blue + (#306998) with varying thicknesses based on edge weights. The title "Character + Interactions · arc-basic · altair · pyplots.ai" appears at the top center. + criteria_checklist: + visual_quality: + score: 36 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title is large (28pt), node labels are 18pt bold, all clearly readable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text or elements + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Nodes are appropriately sized (600), arcs visible with opacity 0.6 + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Blue/yellow color scheme is colorblind-safe + - id: VQ-05 + name: Layout Balance + score: 3 + max: 5 + passed: true + comment: Good overall, but nodes positioned low with much empty space below + baseline + - id: VQ-06 + name: Axis Labels + score: 0 + max: 2 + passed: false + comment: No axes present (appropriate for this chart type, but no units shown) + - id: VQ-07 + name: Grid & Legend + score: 2 + max: 2 + passed: true + comment: Clean design, no unnecessary grid, strokeWidth encoding is self-explanatory + spec_compliance: + score: 23 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct arc diagram type + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Nodes correctly arranged horizontally, arcs connect pairs + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Arc heights proportional to distance, semi-transparency, stroke width + for weights + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: All nodes and connections visible + - id: SC-05 + name: Legend Accuracy + score: 0 + max: 2 + passed: true + comment: No legend for edge weights (strokeWidth legend is disabled) + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: 'Correct format: "Character Interactions · arc-basic · altair · pyplots.ai"' + data_quality: + score: 20 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 8 + max: 8 + passed: true + comment: Shows short-range and long-range connections, varying weights (1-3) + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Character interactions in a story is a perfect real-world scenario + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: 10 nodes with 15 edges is ideal for readability + code_quality: + score: 9 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Simple linear structure: imports → data → plot → save' + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: np.random.seed(42) set + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: Only necessary imports (altair, numpy, pandas) + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current Altair API + - id: CQ-05 + name: Output Correct + score: 0 + max: 1 + passed: false + comment: Saves both plot.png and plot.html (correct) + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: true + comment: Uses declarative layering, encoding system, but arc diagrams are + not native to Altair so required manual path generation + verdict: APPROVED diff --git a/plots/arc-basic/metadata/bokeh.yaml b/plots/arc-basic/metadata/bokeh.yaml index 178909e254..00d227a403 100644 --- a/plots/arc-basic/metadata/bokeh.yaml +++ b/plots/arc-basic/metadata/bokeh.yaml @@ -26,3 +26,177 @@ review: character names are already labeled below nodes - Could add HoverTool to show edge details on hover, leveraging Bokeh interactive capabilities + image_description: 'The plot displays a basic arc diagram with 8 character nodes + (Alice, Bob, Carol, David, Eve, Frank, Grace, Henry) arranged horizontally along + a baseline. Curved arcs connect pairs of characters above the baseline, representing + interactions. The arcs use two colors: Python Yellow (#FFD43B) for long-range + connections (distance > 5) and Python Blue (#306998) for short-range connections + (distance ≤ 5). Arc heights are proportional to the distance between connected + nodes, with taller arcs spanning farther distances. Line thickness varies based + on connection weight. The title "arc-basic · bokeh · pyplots.ai" appears in the + top-left. A legend in the top-right explains the color coding. The x-axis shows + "Characters" with numeric tick marks (0, 2, 4, 6, 8, 10), and character name labels + appear below each node.' + criteria_checklist: + visual_quality: + score: 36 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title 28pt, axis labels 22pt, tick labels 18pt, node labels 20pt + - all clearly readable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements, all labels well-spaced + - id: VQ-03 + name: Element Visibility + score: 7 + max: 8 + passed: true + comment: Arcs clearly visible with appropriate thickness variation; nodes + visible but could be slightly larger + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Blue/Yellow palette is colorblind-safe with good contrast + - id: VQ-05 + name: Layout Balance + score: 4 + max: 5 + passed: true + comment: Good proportions, slight imbalance with large empty space above arcs + - id: VQ-06 + name: Axis Labels + score: 1 + max: 2 + passed: true + comment: '"Characters" label present but no units (expected for categorical)' + - id: VQ-07 + name: Grid & Legend + score: 1 + max: 2 + passed: true + comment: Legend well-placed; x-grid subtle but unnecessary for this visualization + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct arc diagram with nodes on horizontal line and curved arcs + above + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Nodes correctly positioned, edges drawn as arcs with height proportional + to distance + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: 'All spec features present: ordered nodes, curved arcs, height proportional + to distance, semi-transparent arcs, readable labels, color coding by type' + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: All nodes and connections visible within plot bounds + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend correctly describes long-range vs short-range connections + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: Correct format "arc-basic · bokeh · pyplots.ai" + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 7 + max: 8 + passed: true + comment: Shows variety of connection distances (short, medium, long-range), + varying weights, but could show more edge cases + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Character interactions in a story chapter is a perfect, comprehensible + scenario + - id: DQ-03 + name: Appropriate Scale + score: 4 + max: 5 + passed: true + comment: 8 nodes with 12 edges is appropriate; weights 1-3 reasonable + code_quality: + score: 9 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Clean linear flow: imports → data → plot → save' + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Deterministic data, no random elements + - id: CQ-03 + name: Clean Imports + score: 1 + max: 2 + passed: true + comment: All imports used, but Legend/LegendItem imports could be consolidated + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current Bokeh 3.x API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves both plot.png and plot.html + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: true + comment: Uses ColumnDataSource, Label, custom Legend with LegendItem, bezier + curve calculation; could leverage more Bokeh-specific features like HoverTool + for interactivity + verdict: APPROVED diff --git a/plots/arc-basic/metadata/letsplot.yaml b/plots/arc-basic/metadata/letsplot.yaml index 04367b21f4..b51727545a 100644 --- a/plots/arc-basic/metadata/letsplot.yaml +++ b/plots/arc-basic/metadata/letsplot.yaml @@ -24,3 +24,189 @@ review: - Node labels could be slightly larger for optimal readability at high resolution - Does not leverage lets-plot specific interactive features (could use tooltips on hover) + image_description: The plot displays a well-executed arc diagram visualizing character + interactions. Ten nodes (Alice, Bob, Carol, David, Eve, Frank, Grace, Henry, Iris, + Jack) are arranged horizontally along a baseline, represented as yellow circular + markers. Blue semi-transparent arcs curve above the baseline connecting related + characters. Arc heights are proportional to the distance between connected nodes + - short-range connections (like Alice-Bob) have low arcs while long-range connections + (like Alice-Jack) have tall arcs spanning nearly the full width. Arc thickness + varies based on connection weight, with stronger connections appearing thicker. + The title "Character Interactions · arc-basic · letsplot · pyplots.ai" appears + at the top left in bold. Node labels are displayed below each node in bold blue + text. The design uses a clean white background with no axis lines or grid. + criteria_checklist: + visual_quality: + score: 36 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 9 + max: 10 + passed: true + comment: Title and labels are clearly readable. Font sizes are appropriate + for the output resolution. Labels could be slightly larger for optimal readability. + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements. Node labels are well-spaced and arcs + do not obscure labels. + - id: VQ-03 + name: Element Visibility + score: 7 + max: 8 + passed: true + comment: Nodes are clearly visible with good sizing. Arcs use appropriate + alpha (0.6) for overlapping connections. Some thinner arcs could be slightly + more visible. + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Blue (#306998) and yellow (#FFD43B) provide excellent contrast. Colorblind-safe + combination. + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Excellent use of canvas space. Arcs fill the upper portion well, + nodes centered horizontally. + - id: VQ-06 + name: Axis Labels + score: 0 + max: 2 + passed: true + comment: N/A for arc diagrams (axes are hidden by design), but no descriptive + subtitle or legend explaining the visualization. + - id: VQ-07 + name: Grid & Legend + score: 2 + max: 2 + passed: true + comment: Appropriately no grid for this diagram type. Legend hidden as connection + weights are shown via line thickness. + spec_compliance: + score: 24 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct arc diagram implementation with nodes on horizontal axis + and curved arcs above. + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Nodes correctly positioned, edges correctly drawn between specified + pairs. + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: 'All spec features present: arc height proportional to distance, + semi-transparent overlapping arcs, readable node labels, weight-based line + thickness.' + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: All nodes and connections visible within the plot area. + - id: SC-05 + name: Legend Accuracy + score: 1 + max: 2 + passed: true + comment: No explicit legend for weights, but thickness variation is intuitive. + Could benefit from a brief explanation. + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: 'Title follows exact format: "Character Interactions · arc-basic + · letsplot · pyplots.ai"' + data_quality: + score: 19 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 7 + max: 8 + passed: true + comment: Shows both short-range and long-range connections, varying weights + (1-3), multiple connections per node. Could include isolated node to show + full feature range. + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Character interactions in a story chapter is a perfect real-world + application matching the spec's narrative flow example. + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: 10 nodes with 15 edges is appropriate scale for readability as per + spec (10-50 nodes typical). + code_quality: + score: 10 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Clean linear structure: imports → data → arc generation → plot → + save. No unnecessary functions or classes.' + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Uses `np.random.seed(42)` for reproducibility. + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: All imports are used. Explicit imports from lets_plot. + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current lets-plot API. + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as `plot.png` and `plot.html`. + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Distinctive Features + score: 3 + max: 5 + passed: true + comment: Uses ggplot2 grammar correctly with geom_path, geom_point, geom_text, + and scale_size_identity. However, does not leverage any lets-plot specific + interactive features or advanced capabilities beyond basic ggplot2 syntax. + verdict: APPROVED diff --git a/plots/arc-basic/metadata/matplotlib.yaml b/plots/arc-basic/metadata/matplotlib.yaml index ee75115817..93c1c8c72b 100644 --- a/plots/arc-basic/metadata/matplotlib.yaml +++ b/plots/arc-basic/metadata/matplotlib.yaml @@ -26,3 +26,176 @@ review: - Could use color coding for different edge types or weights as mentioned in spec notes - Library features score could improve by using colormap for arcs based on weight + image_description: The plot displays a basic arc diagram showing character interactions. + Ten nodes (Alice, Bob, Carol, David, Eve, Frank, Grace, Henry, Iris, Jack) are + arranged horizontally along a baseline, represented as yellow circles with blue + borders. Curved blue arcs connect various character pairs above the baseline, + with arc height proportional to the distance between connected characters. For + example, the Alice-Jack connection spans the full width with the tallest arc, + while adjacent connections like Alice-Bob have shorter arcs. Arc thickness varies + based on connection weight, and arcs use semi-transparency (alpha ~0.55) to handle + overlapping connections. The title "Character Interactions · arc-basic · matplotlib + · pyplots.ai" appears at the top. Node labels are displayed below each node in + bold blue text. + criteria_checklist: + visual_quality: + score: 36 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title at 24pt, node labels at 16pt bold, all clearly readable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text; arcs use transparency for overlapping connections + - id: VQ-03 + name: Element Visibility + score: 7 + max: 8 + passed: true + comment: Nodes well-sized (s=500), arcs visible with appropriate thickness + based on weights + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Single blue color scheme (#306998) with yellow accent (#FFD43B), + colorblind-safe + - id: VQ-05 + name: Layout Balance + score: 4 + max: 5 + passed: true + comment: Good proportions, though some whitespace at top could be reduced + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: N/A for arc diagram (axes turned off appropriately) + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: true + comment: No legend present, though one showing weight scale could add value + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct arc diagram with nodes along horizontal line and curved arcs + above + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Nodes positioned sequentially, edges connect proper node pairs + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Arc height proportional to distance, semi-transparent arcs for overlaps, + readable labels, weight-based thickness + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: All nodes and connections visible within bounds + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: N/A for this plot type + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: 'Uses correct format: "Character Interactions · arc-basic · matplotlib + · pyplots.ai"' + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 7 + max: 8 + passed: true + comment: Shows short-range and long-range connections, varying weights, but + could demonstrate bidirectional connections or different edge types + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Character interactions in a story chapter is a perfect real-world + scenario for arc diagrams + - id: DQ-03 + name: Appropriate Scale + score: 4 + max: 5 + passed: true + comment: 10 nodes with 15 edges is appropriate; weights 1-3 reasonable + code_quality: + score: 10 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: Clean imports → data → plot → save structure, no functions/classes + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Uses np.random.seed(42), though data is deterministic anyway + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: Only necessary imports (matplotlib.patches, pyplot, numpy) + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Modern matplotlib API used + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as 'plot.png' + library_features: + score: 2 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 2 + max: 5 + passed: false + comment: Uses matplotlib.patches.Arc which is appropriate, but doesn't leverage + other matplotlib features like colormaps for edge colors or annotations + verdict: APPROVED diff --git a/plots/arc-basic/metadata/plotly.yaml b/plots/arc-basic/metadata/plotly.yaml index a2bc312759..58bbb6c15e 100644 --- a/plots/arc-basic/metadata/plotly.yaml +++ b/plots/arc-basic/metadata/plotly.yaml @@ -25,3 +25,167 @@ review: - Could add hover information showing connection details (source, target, weight) for better interactivity - Missing edge color coding by type or weight as suggested in spec notes + image_description: The plot displays a basic arc diagram with 10 nodes (Alice, Bob, + Carol, David, Eve, Frank, Grace, Henry, Iris, Jack) arranged horizontally along + a gray baseline. Each node is represented by a yellow circular marker with a blue + border. The nodes are connected by semi-transparent blue parabolic arcs above + the baseline. Arc heights vary based on the distance between connected nodes - + short-range connections (e.g., Alice-Bob) have lower arcs while long-range connections + (e.g., Alice-Iris) have higher arcs. The arcs have varying thicknesses based on + connection weights. The title "arc-basic · plotly · pyplots.ai" appears centered + at the top in dark text on a clean white background. + criteria_checklist: + visual_quality: + score: 36 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title at 32pt and node labels at 18pt are clearly readable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text, all labels clearly spaced + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Nodes (size=24) and arcs are well-sized, semi-transparency (0.6) + handles overlapping arcs nicely + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Blue (#306998) and yellow (#FFD43B) provide good contrast, colorblind-safe + - id: VQ-05 + name: Layout Balance + score: 3 + max: 5 + passed: true + comment: Good proportions but significant whitespace below the baseline + - id: VQ-06 + name: Axis Labels + score: 0 + max: 2 + passed: true + comment: No axis labels (acceptable for arc diagrams which hide axes) + - id: VQ-07 + name: Grid & Legend + score: 2 + max: 2 + passed: true + comment: No grid shown (appropriate), no legend needed + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct arc diagram with nodes on horizontal line and curved arcs + above + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Nodes correctly positioned, edges correctly connect source/target + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: 'All spec features present: arc height proportional to distance, + varying weights affect thickness, semi-transparent arcs' + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: All nodes and connections visible within the plot area + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: No legend needed, node labels accurate + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: Uses correct format "arc-basic · plotly · pyplots.ai" + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 6 + max: 8 + passed: true + comment: Shows short-range, medium-range, and long-range arcs with varying + weights, but could show more variation in edge types + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Character interactions in a story narrative is a plausible and comprehensible + scenario + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: 10 nodes is within the recommended 10-50 range, weights 1-3 provide + clear differentiation + code_quality: + score: 9 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Simple sequential structure: imports → data → plot → save' + - id: CQ-02 + name: Reproducibility + score: 2 + max: 3 + passed: false + comment: Uses deterministic data (no random), but no explicit seed set for + any random operations + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: Only numpy and plotly.graph_objects used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current Plotly API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png and plot.html + library_features: + score: 3 + max: 5 + items: [] + verdict: APPROVED diff --git a/plots/arc-basic/metadata/plotnine.yaml b/plots/arc-basic/metadata/plotnine.yaml index 915ca80887..f7be3e7551 100644 --- a/plots/arc-basic/metadata/plotnine.yaml +++ b/plots/arc-basic/metadata/plotnine.yaml @@ -25,3 +25,175 @@ review: weaknesses: - The sys.path manipulation at the top is a workaround that could be cleaner - Some thin arcs (weight=1) are harder to distinguish from each other + image_description: The plot displays a basic arc diagram with 10 nodes (Alice, Bob, + Carol, David, Eve, Frank, Grace, Henry, Iris, Jack) arranged horizontally along + a baseline. Yellow circular nodes mark each character's position. Blue semi-transparent + arcs curve above the baseline connecting various character pairs. Arc heights + vary proportionally to the distance between connected nodes - the Alice-Jack arc + spans the full width with the highest peak, while adjacent connections like Bob-Carol + have small, tight arcs. Arc thickness varies based on connection weight, with + some arcs thicker than others. The title "Character Interactions · arc-basic · + plotnine · pyplots.ai" appears centered at the top. The background is clean white + with no axis markings or grid. + criteria_checklist: + visual_quality: + score: 37 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title is large and clear at 24pt, node labels are readable in bold + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No text overlap, nodes and labels well-spaced + - id: VQ-03 + name: Element Visibility + score: 7 + max: 8 + passed: true + comment: 'Arcs visible with alpha=0.6, nodes clearly marked; minor: some thin + arcs harder to see' + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Blue (#306998) and yellow (#FFD43B) combination is colorblind-safe + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Good proportions, arc heights fill space well without being cut off + - id: VQ-06 + name: Axis Labels + score: 0 + max: 2 + passed: true + comment: N/A for arc diagrams, axes intentionally hidden (no deduction appropriate) + - id: VQ-07 + name: Grid & Legend + score: 2 + max: 2 + passed: true + comment: Clean design, no grid needed for this visualization type + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct arc diagram with nodes on horizontal line and curved arcs + above + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Nodes correctly positioned sequentially, arcs connect correct pairs + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Has arcs above baseline, height proportional to distance, semi-transparent + arcs, readable labels, weight-based thickness + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: All nodes and arcs visible + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: No legend needed, data is self-explanatory + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: 'Uses correct format: "Character Interactions · arc-basic · plotnine + · pyplots.ai"' + data_quality: + score: 17 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 6 + max: 8 + passed: true + comment: Shows short-range and long-range connections, varying weights; could + show more edge cases + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: '"Character interactions in a story chapter" is a realistic, comprehensible + scenario' + - id: DQ-03 + name: Appropriate Scale + score: 4 + max: 5 + passed: true + comment: 10 nodes is within the 10-50 recommended range; weights 1-3 are sensible + code_quality: + score: 9 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Linear structure: imports → data → plot → save' + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Uses np.random.seed(42) + - id: CQ-03 + name: Clean Imports + score: 1 + max: 2 + passed: true + comment: sys import used for path manipulation, slightly unusual + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current plotnine API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: true + comment: Uses ggplot grammar with geom_path and geom_point effectively; however, + arc diagrams aren't a native plotnine feature so this is a creative workaround + rather than leveraging library strengths + verdict: APPROVED diff --git a/plots/arc-basic/metadata/pygal.yaml b/plots/arc-basic/metadata/pygal.yaml index 2e49a33a16..19cb1e051e 100644 --- a/plots/arc-basic/metadata/pygal.yaml +++ b/plots/arc-basic/metadata/pygal.yaml @@ -15,3 +15,15 @@ review: strengths: [] weaknesses: [] improvements: [] + image_description: The plot displays an arc diagram with 10 character names (Alice, + Bob, Carol, David, Eve, Frank, Grace, Henry, Iris, Jack) arranged horizontally + along the bottom on a white background. Each character is represented by a yellow/gold + circular node (#FFD43B). The connections between characters are shown as blue + curved arcs (#306998) above the horizontal baseline. The arcs vary in height proportional + to the distance between connected nodes - longer-range connections (like Alice-Jack) + have higher arcs, while shorter-range connections (like Bob-Carol) have lower + arcs. Arc thickness varies based on connection weight, with stronger connections + appearing thicker. The title "Character Interactions · arc-basic · pygal · pyplots.ai" + is displayed at the top in blue. The arcs have semi-transparency allowing overlapping + arcs to be distinguishable. + verdict: APPROVED diff --git a/plots/area-basic/metadata/altair.yaml b/plots/area-basic/metadata/altair.yaml index 816d07f10d..ac6ef3dfec 100644 --- a/plots/area-basic/metadata/altair.yaml +++ b/plots/area-basic/metadata/altair.yaml @@ -23,3 +23,177 @@ review: - Y-axis label could include units (e.g., Daily Visitors (count)) - Could add tooltip showing exact values for interactive version carried to static aesthetics + image_description: The plot displays a basic area chart showing daily website visitors + over January 2024 (30 days). The area is filled with a semi-transparent blue color + (#306998) with a darker blue line along the top edge. The title "area-basic · + altair · pyplots.ai" is centered at the top in black text. The X-axis shows "Date" + with date labels (2024, Wed 03, Fri 05, etc.), and the Y-axis shows "Daily Visitors" + ranging from 0 to approximately 8,500. Dashed gridlines are visible throughout. + The data shows a clear weekly pattern with dips on weekends (Saturday/Sunday) + and higher values on weekdays, plus an overall upward trend from ~6,000 to ~7,500 + visitors. + criteria_checklist: + visual_quality: + score: 36 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 9 + max: 10 + passed: true + comment: All text is readable; title at 28pt, axis labels at 22pt, tick labels + at 18pt. Slightly conservative sizing but fully legible. + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements anywhere + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Area fill with 0.4 opacity and 3px line width is well-suited for + this data density (30 points) + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Single blue color (#306998), no color comparison needed, good contrast + - id: VQ-05 + name: Layout Balance + score: 4 + max: 5 + passed: true + comment: Good proportions, slight excess whitespace in lower portion due to + Y-axis starting at 0 + - id: VQ-06 + name: Axis Labels + score: 1 + max: 2 + passed: true + comment: Descriptive labels ("Date", "Daily Visitors") but no units + - id: VQ-07 + name: Grid & Legend + score: 1 + max: 2 + passed: true + comment: Grid is subtle with dashed lines and 0.3 opacity; no legend needed + for single series + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct area chart with filled area below the line + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: X=datetime (date), Y=numeric (visitors) correctly mapped + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Semi-transparent fill (0.4), gridlines, clear axis labels, line visible + on top + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: Y-axis shows all data with 10% headroom, X-axis shows full date range + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: No legend needed for single series plot + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: 'Uses correct format: "area-basic · altair · pyplots.ai"' + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 7 + max: 8 + passed: true + comment: Shows trend AND cyclical pattern (weekday/weekend); missing extreme + peaks/valleys that would show full dynamic range + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Website traffic is a perfect real-world scenario for area charts; + weekday/weekend pattern is authentic + - id: DQ-03 + name: Appropriate Scale + score: 4 + max: 5 + passed: true + comment: Values 3,500-8,200 visitors/day are realistic; could show more variation + in scale + code_quality: + score: 9 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Clean linear structure: imports → data → plot → save' + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Uses `np.random.seed(42)` + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: All imports (altair, numpy, pandas) are used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Modern Altair API throughout + - id: CQ-05 + name: Output Correct + score: 0 + max: 1 + passed: false + comment: Saves correctly but comment mentions wrong resolution math (1600×900×3 + ≠ 4800×2700 correctly explained) + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: true + comment: Uses Altair's declarative grammar with `.encode()`, `.properties()`, + `.configure_axis()`, and `.interactive()` for HTML output. Could leverage + more Altair-specific features like tooltips in the static version. + verdict: APPROVED diff --git a/plots/area-basic/metadata/bokeh.yaml b/plots/area-basic/metadata/bokeh.yaml index 6bb26e1047..1ca3207525 100644 --- a/plots/area-basic/metadata/bokeh.yaml +++ b/plots/area-basic/metadata/bokeh.yaml @@ -23,3 +23,176 @@ review: - Missing HoverTool for interactivity - Bokeh key strength is interactive exploration - Axis labels lack units (could be Daily Visitors count or similar) - Large empty space below data since values range 4000-7000 but y starts at 0 + image_description: The plot displays a basic area chart showing daily website visitors + over January 2024. The filled area uses a steel blue color (#306998) with 40% + transparency, creating visual weight that emphasizes the magnitude of visitor + counts. A solid line traces the top edge of the area for clear definition. The + x-axis shows dates from Jan 01, 2024 to Feb 01, with clear date labels. The y-axis + displays "Daily Visitors" ranging from 0 to approximately 7000. The title "area-basic + · bokeh · pyplots.ai" appears in the top left. The data exhibits a realistic weekly + cyclical pattern (weekend dips) with an overall upward trend across the month. + Subtle dashed grid lines aid value estimation. The y-axis correctly starts at + 0, which is essential for area charts to avoid misleading representations. + criteria_checklist: + visual_quality: + score: 37 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title at 48pt, axis labels at 36pt, tick labels at 28pt - all perfectly + readable at 4800x2700 + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements; date labels are well-spaced + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Area fill and line are perfectly visible; line width of 5 appropriate + for canvas size + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Single color scheme, good contrast against white background + - id: VQ-05 + name: Layout Balance + score: 4 + max: 5 + passed: true + comment: Good proportions, slight excess whitespace at bottom due to y starting + at 0 but data ranging 4000-7000 + - id: VQ-06 + name: Axis Labels + score: 1 + max: 2 + passed: true + comment: '"Daily Visitors" and "Date" are descriptive but lack units' + - id: VQ-07 + name: Grid & Legend + score: 1 + max: 2 + passed: true + comment: Grid is subtle (alpha 0.3) with nice dashed styling; no legend needed + for single series + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct area chart with filled region below line + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Datetime on x-axis, numeric values on y-axis + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Semi-transparent fill (0.4), gridlines present, clear axis labels, + line on top + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: All data visible, y-axis starts at 0 + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: N/A for single series, no misleading elements + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: Correctly formatted as "area-basic · bokeh · pyplots.ai" + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 7 + max: 8 + passed: true + comment: Shows trend, cyclical pattern, and magnitude well; could show more + dramatic variations + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Website traffic with weekly patterns and growth trend is a real, + comprehensible scenario + - id: DQ-03 + name: Appropriate Scale + score: 4 + max: 5 + passed: true + comment: Values 4000-7000 visitors/day plausible; base of 5000 perhaps high + for "basic" example + code_quality: + score: 10 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: Clean imports → data → plot → save structure, no functions/classes + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: np.random.seed(42) set + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: All imports are used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current Bokeh API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png and plot.html + library_features: + score: 2 + max: 5 + items: + - id: LF-01 + name: Distinctive Features + score: 2 + max: 5 + passed: false + comment: Uses varea() and ColumnDataSource correctly, but doesn't leverage + Bokeh's interactive features like HoverTool which would enhance the visualization + verdict: APPROVED diff --git a/plots/area-basic/metadata/highcharts.yaml b/plots/area-basic/metadata/highcharts.yaml index 13b9bf7e4b..2718b69d94 100644 --- a/plots/area-basic/metadata/highcharts.yaml +++ b/plots/area-basic/metadata/highcharts.yaml @@ -22,3 +22,173 @@ review: - Y-axis starts at 0 creating large empty space below the data (could use min property) - Axis labels lack units (could be "Daily Visitors (count)" or "Day of Month (date)") - Could leverage more Highcharts-specific features like hover tooltips or animation + image_description: The plot displays a basic area chart showing website traffic + over 30 days. The chart has a blue color scheme (#306998) with a gradient fill + that transitions from semi-opaque at the top (~0.5 alpha) to nearly transparent + at the bottom (~0.1 alpha). The title "area-basic · highcharts · pyplots.ai" is + prominently displayed at the top in bold. The X-axis is labeled "Day of Month" + with values from 1-30, and the Y-axis shows "Daily Visitors" ranging from 0 to + 4000. Small blue circular markers are placed at each data point along the line. + The data shows a clear upward trend with weekly cyclical patterns (peaks roughly + every 7 days). Grid lines are subtle and visible on both axes. The overall layout + is clean with white background. + criteria_checklist: + visual_quality: + score: 36 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title is large and bold (72px), axis labels are clear (48px), tick + labels readable (36px) + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements + - id: VQ-03 + name: Element Visibility + score: 7 + max: 8 + passed: true + comment: Markers visible, line width good, could use slightly larger markers + for 30 data points + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Single blue color palette, no colorblind issues + - id: VQ-05 + name: Layout Balance + score: 4 + max: 5 + passed: true + comment: Good proportions, though Y-axis starts at 0 creating empty space + below data + - id: VQ-06 + name: Axis Labels + score: 1 + max: 2 + passed: true + comment: Descriptive labels but no units (visitors per day could be clearer) + - id: VQ-07 + name: Grid & Legend + score: 1 + max: 2 + passed: true + comment: Grid subtle and appropriate, legend disabled but not needed for single + series + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct area chart type + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: X=days, Y=visitors correctly mapped + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Filled area, gridlines, axis labels all present per spec + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: All data points visible + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend disabled appropriately for single series + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: 'Uses exact format: "{spec-id} · {library} · pyplots.ai"' + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 7 + max: 8 + passed: true + comment: Shows trend and periodicity well, could show more variation in magnitude + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Website visitors scenario is realistic and relatable + - id: DQ-03 + name: Appropriate Scale + score: 4 + max: 5 + passed: true + comment: Values (2000-3700 visitors/day) are reasonable, though range could + be tighter + code_quality: + score: 9 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Linear script: imports → data → plot → save' + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Uses np.random.seed(42) + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: All imports are used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current highcharts-core API + - id: CQ-05 + name: Output Correct + score: 0 + max: 1 + passed: false + comment: Uses container.screenshot() instead of driver.save_screenshot() + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: true + comment: Uses gradient fill color, proper Highcharts options structure, but + doesn't leverage more advanced features like tooltips or hover effects + verdict: APPROVED diff --git a/plots/area-basic/metadata/letsplot.yaml b/plots/area-basic/metadata/letsplot.yaml index f41d1835bb..4aab01d0ba 100644 --- a/plots/area-basic/metadata/letsplot.yaml +++ b/plots/area-basic/metadata/letsplot.yaml @@ -24,3 +24,177 @@ review: - Uses numeric day_num instead of actual dates; could use scale_x_datetime for proper date axis formatting - Grid styling could be more subtle (add alpha to panel_grid) + image_description: The plot shows a basic area chart displaying daily website visitors + over 30 days. The filled area uses a semi-transparent blue color (#306998 with + alpha 0.4), with a darker blue line (same color, size=2) tracing the top boundary + of the area. The chart has a light gray dashed grid in the background. The title + "area-basic · letsplot · pyplots.ai" appears at the top. The x-axis is labeled + "Day of Month" (ranging from 0 to 30), and the y-axis is labeled "Daily Visitors" + (ranging from 0 to 8,000). The data shows a realistic pattern with an upward trend + over the month, weekly cyclical variations (approximately 7-day periods visible + as peaks and valleys), and some random noise. Values start around 5,000 visitors + and end near 7,500. + criteria_checklist: + visual_quality: + score: 37 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title, axis labels, and tick marks are all clearly readable with + appropriate font sizes (title=24, axis_title=20, axis_text=16) + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements anywhere in the plot + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Area fill and line are well-sized and clearly visible; alpha=0.4 + is appropriate + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Single blue color scheme is colorblind-safe + - id: VQ-05 + name: Layout Balance + score: 4 + max: 5 + passed: true + comment: Good proportions overall, though the y-axis starts at 0 which creates + a large empty area below the data (values range ~4,300-7,600) + - id: VQ-06 + name: Axis Labels + score: 1 + max: 2 + passed: true + comment: Labels are descriptive ("Day of Month", "Daily Visitors") but lack + units + - id: VQ-07 + name: Grid & Legend + score: 1 + max: 2 + passed: true + comment: Grid is visible with dashed style but could be more subtle (alpha + not apparent in grid styling) + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct area chart type with filled area below the line + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: X (day number) and Y (visitors) correctly mapped + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Has semi-transparent fill (alpha 0.4), gridlines, clear axis labels + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: All data visible within axes + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: No legend needed for single-series area chart + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: Correct format "area-basic · letsplot · pyplots.ai" + data_quality: + score: 19 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 7 + max: 8 + passed: true + comment: Shows trend, cyclical pattern, and variation well; could show more + dramatic peaks/valleys + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Website visitors is the exact example from spec; daily pattern with + weekly cycles is realistic + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: Visitor counts (2,000-8,000 range) are realistic for a medium-sized + website + code_quality: + score: 10 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: Simple imports → data → plot → save structure, no functions/classes + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Uses np.random.seed(42) + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: All imports are used (numpy, pandas, lets_plot) + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current lets-plot API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png and plot.html + library_features: + score: 0 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 0 + max: 5 + passed: false + comment: Implementation uses basic ggplot grammar but doesn't leverage lets-plot + specific features like interactive tooltips, scale_x_datetime for proper + date handling, or other distinctive capabilities + verdict: APPROVED diff --git a/plots/area-basic/metadata/matplotlib.yaml b/plots/area-basic/metadata/matplotlib.yaml index a9beb2bc47..56829e6289 100644 --- a/plots/area-basic/metadata/matplotlib.yaml +++ b/plots/area-basic/metadata/matplotlib.yaml @@ -23,3 +23,173 @@ review: - Axis labels missing units (e.g., Daily Visitors could include count) - Did not implement optional gradient fill from bottom to line for visual appeal - Basic matplotlib usage without leveraging distinctive features + image_description: 'The plot displays a basic area chart with a blue filled area + (#306998 color) showing daily website visitors over a 30-day period. The x-axis + is labeled "Day of Month" ranging from 1 to 30, and the y-axis shows "Daily Visitors" + ranging from 0 to approximately 8000. The title follows the correct format: "area-basic + · matplotlib · pyplots.ai". The area is filled with semi-transparent blue (alpha + ~0.4) with a solid blue line on top (linewidth 3). A subtle dashed grid (alpha + 0.3) helps with value estimation. The data shows an upward trend with natural + variation - starting around 5000 visitors and trending upward to around 6500-7000 + by day 30, with visible day-to-day fluctuations adding realism.' + criteria_checklist: + visual_quality: + score: 37 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title at 24pt, labels at 20pt, ticks at 16pt - all perfectly readable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping elements anywhere + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Line width of 3 is appropriate, area fill clearly visible + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Single blue color (#306998), good contrast, colorblind-safe + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Good proportions, tight_layout applied, no cut-off content + - id: VQ-06 + name: Axis Labels + score: 1 + max: 2 + passed: false + comment: Descriptive labels but missing units (e.g., "visitors/day") + - id: VQ-07 + name: Grid & Legend + score: 2 + max: 2 + passed: true + comment: Grid subtle at alpha 0.3 with dashed style, no legend needed + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct area chart with fill_between + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: X=days, Y=visitors correctly assigned + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Semi-transparent fill (alpha 0.4), gridlines present, clear axis + labels + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: Y-axis starts at 0, X-axis shows full 1-30 range + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: No legend needed for single series (appropriate) + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: 'Uses exact format: "area-basic · matplotlib · pyplots.ai"' + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 7 + max: 8 + passed: true + comment: 'Shows upward trend with daily variation, demonstrates area chart + purpose well. Minor: could show more dramatic changes to emphasize "volume" + aspect' + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Daily website visitors over a month is a perfect real-world scenario + matching spec examples + - id: DQ-03 + name: Appropriate Scale + score: 4 + max: 5 + passed: true + comment: 5000-7000 visitors reasonable; baseline at 0 slightly exaggerates + visual weight but acceptable + code_quality: + score: 10 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Flat script: imports → data → plot → save' + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: np.random.seed(42) set + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: Only matplotlib.pyplot and numpy used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: All APIs current + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png with dpi=300 + library_features: + score: 2 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 2 + max: 5 + passed: false + comment: Uses fill_between correctly but no gradient fill (mentioned in spec + notes as optional enhancement), no use of matplotlib-specific features like + color gradients or annotations + verdict: APPROVED diff --git a/plots/area-basic/metadata/plotly.yaml b/plots/area-basic/metadata/plotly.yaml index 6ad8c9466c..141c99499c 100644 --- a/plots/area-basic/metadata/plotly.yaml +++ b/plots/area-basic/metadata/plotly.yaml @@ -26,3 +26,176 @@ review: just "Date") - Missing hover template customization which is a key Plotly strength - Could benefit from range slider or zoom capabilities to showcase Plotly interactivity + image_description: The plot displays a basic area chart showing daily website visitors + over January 2024 (30 days). The x-axis shows dates from Jan 2, 2024 to Jan 29, + 2024, and the y-axis shows "Visitors (daily count)" ranging from 0 to approximately + 7000. The area below the line is filled with a semi-transparent blue color (rgba + blue, ~0.4 alpha), while the line itself is a darker blue (#306998). The data + exhibits a clear weekly cyclical pattern (peaks and troughs repeating roughly + every 7 days) along with an overall upward trend from ~5000 to ~7000 visitors. + The title "Daily Website Visitors · area-basic · plotly · pyplots.ai" is centered + at the top. The background uses the plotly_white template with subtle light gray + gridlines. The layout is clean with good margins and no overlapping elements. + criteria_checklist: + visual_quality: + score: 37 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title at 28pt, axis titles at 22pt, tick labels at 18pt - all perfectly + readable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text anywhere, dates are well-spaced + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Line width of 3 is appropriate, area fill clearly visible with good + alpha + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Single blue color scheme, no colorblind concerns + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Good margins, well-proportioned plot area + - id: VQ-06 + name: Axis Labels + score: 1 + max: 2 + passed: true + comment: Y-axis has units "(daily count)" but X-axis just says "Date" without + format specification + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: true + comment: Grid is subtle at alpha 0.1, but no legend shown (showlegend=False) + - for a single series this is acceptable but loses points + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct area chart using fill="tozeroy" + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Datetime on x-axis, numeric visitors on y-axis + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Semi-transparent fill (0.4), gridlines present, clear axis labels + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: Y-axis starts at 0, all data visible + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: N/A for single series, name is descriptive + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: Correctly formatted as "Daily Website Visitors · area-basic · plotly + · pyplots.ai" + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 7 + max: 8 + passed: true + comment: Shows trend, weekly pattern, and variance - good demonstration of + area chart strengths. Could show more dramatic volume changes. + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Website traffic is a perfect real-world scenario for area charts + - id: DQ-03 + name: Appropriate Scale + score: 4 + max: 5 + passed: true + comment: Values 4000-7000 are plausible for a mid-size website, though somewhat + high minimum + code_quality: + score: 10 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Simple linear flow: imports → data → plot → save' + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: np.random.seed(42) is set + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: Only numpy, pandas, plotly.graph_objects used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current Plotly API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png and plot.html + library_features: + score: 2 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 2 + max: 5 + passed: false + comment: Uses basic go.Scatter with fill, but doesn't leverage Plotly's interactive + features like hover templates, range sliders, or annotations that would + enhance the visualization + verdict: APPROVED diff --git a/plots/area-basic/metadata/plotnine.yaml b/plots/area-basic/metadata/plotnine.yaml index 3c20adbe3a..625250ce98 100644 --- a/plots/area-basic/metadata/plotnine.yaml +++ b/plots/area-basic/metadata/plotnine.yaml @@ -22,3 +22,171 @@ review: weaknesses: - Axis labels lack units (could be "Daily Visitors (count)" or "Date (2024)") - Could leverage more plotnine-specific features like stat_smooth for trend visualization + image_description: The plot displays a basic area chart showing daily website visitors + over January 2024. The chart uses a blue color (#306998) with semi-transparent + fill (alpha ~0.4) and a solid blue line on top. The X-axis displays dates from + Jan 01 to Jan 29 with weekly intervals labeled (Jan 01, Jan 08, Jan 15, Jan 22, + Jan 29). The Y-axis shows "Daily Visitors" ranging from 0 to 8000. The title "area-basic + · plotnine · pyplots.ai" is centered at the top. The data shows a clear cyclical + weekly pattern with peaks and troughs, overlaid with an upward trend, representing + realistic website traffic patterns. Grid lines are subtle and horizontal only. + The overall layout is clean with good proportions. + criteria_checklist: + visual_quality: + score: 37 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title, axis labels, and tick labels are all clearly readable at appropriate + sizes + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Area fill and line are appropriately visible with good alpha + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Single blue color, no colorblind issues + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Good proportions, no cut-off content + - id: VQ-06 + name: Axis Labels + score: 1 + max: 2 + passed: false + comment: '"Daily Visitors" and "Date" are descriptive but lack units' + - id: VQ-07 + name: Grid & Legend + score: 2 + max: 2 + passed: true + comment: Grid is subtle (alpha 0.3), no legend needed for single series + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct area chart with filled region below line + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: X=datetime, Y=numeric correctly assigned + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Semi-transparent fill, gridlines, clear axis labels all present + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: All data visible, Y-axis starts at 0 + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: N/A for single series, no legend needed + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: Correctly formatted as "area-basic · plotnine · pyplots.ai" + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 7 + max: 8 + passed: true + comment: Shows trend, cyclical pattern, and volume well; could show more variation + in amplitude + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Website traffic is a perfect real-world scenario with believable + patterns + - id: DQ-03 + name: Appropriate Scale + score: 4 + max: 5 + passed: true + comment: Values 4000-8000 daily visitors are realistic; starting Y at 0 is + good but creates some empty space + code_quality: + score: 10 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: Simple imports → data → plot → save structure, no functions/classes + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Uses np.random.seed(42) + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: All imports are used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current plotnine API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png + library_features: + score: 2 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 2 + max: 5 + passed: false + comment: Uses ggplot grammar correctly but doesn't leverage plotnine-specific + features like faceting or stat transformations + verdict: APPROVED diff --git a/plots/area-basic/metadata/pygal.yaml b/plots/area-basic/metadata/pygal.yaml index c318a018a2..c0dbd4cb41 100644 --- a/plots/area-basic/metadata/pygal.yaml +++ b/plots/area-basic/metadata/pygal.yaml @@ -25,3 +25,177 @@ review: - Y-axis label Visitors could include units (e.g., Visitors count) - Data dots could be slightly larger for better visibility at the target resolution - Could leverage more pygal-specific features like custom tooltips or value formatting + image_description: The plot displays a basic area chart with a light blue/steel + blue filled area beneath the line. The title "area-basic · pygal · pyplots.ai" + is clearly visible at the top. The X-axis is labeled "Day of Month" with values + 1, 5, 10, 15, 20, 25, 30 shown. The Y-axis is labeled "Visitors" with values ranging + from approximately 900 to 2100. Data points are marked with small dots along the + line. The area fill has semi-transparency (approximately 40% opacity). A legend + "Daily Visitors" appears at the bottom left. The background is white with subtle + horizontal gridlines. The chart shows website traffic patterns with weekend dips + and weekday peaks. + criteria_checklist: + visual_quality: + score: 36 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 9 + max: 10 + passed: true + comment: Title, axis labels, and tick marks are all readable. Font sizes are + well-scaled for the 4800x2700 canvas. + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements. X-axis labels are spaced well by showing + every 5th day. + - id: VQ-03 + name: Element Visibility + score: 7 + max: 8 + passed: true + comment: Line and fill are clearly visible. Dots are appropriately sized at + 6px. Could be slightly larger for better visibility. + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Single color scheme (#306998 blue) is colorblind-safe. + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Good proportions with legend at bottom, proper margins. + - id: VQ-06 + name: Axis Labels + score: 1 + max: 2 + passed: true + comment: Labels are descriptive ("Day of Month", "Visitors") but "Visitors" + lacks units (e.g., "count" or "per day"). + - id: VQ-07 + name: Grid & Legend + score: 1 + max: 2 + passed: true + comment: Y-axis gridlines are subtle and helpful. Legend placement is good + but could be more prominent. + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct area chart type using pygal.Line with fill=True. + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: X (days) and Y (visitors) correctly assigned. + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Semi-transparent fill (0.4), gridlines, clear axis labels all present. + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: All 30 days visible, Y-axis shows full range from ~890 to ~2150. + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend correctly shows "Daily Visitors". + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: 'Correct format: "area-basic · pygal · pyplots.ai".' + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 7 + max: 8 + passed: true + comment: Shows trends, peaks, valleys, and weekly patterns. Could show more + dramatic variation. + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Website visitor data over a month is a perfect real-world scenario + matching the spec example. + - id: DQ-03 + name: Appropriate Scale + score: 4 + max: 5 + passed: true + comment: Values (890-2150 visitors) are realistic for a small-medium website. + Range is reasonable. + code_quality: + score: 9 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Clean script: imports → data → plot → save. No functions or classes.' + - id: CQ-02 + name: Reproducibility + score: 2 + max: 3 + passed: true + comment: Data is deterministic (hardcoded list), but no random seed comment + explaining this. + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: Only pygal and Style imported, both used. + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Using current pygal API. + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png and plot.html. + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: true + comment: Uses pygal's Style class for customization, fill=True for area, show_dots, + stroke_style. Could leverage more pygal-specific features like tooltips + or value formatters. + verdict: APPROVED diff --git a/plots/area-basic/metadata/seaborn.yaml b/plots/area-basic/metadata/seaborn.yaml index 1fd7a32214..184b1bb3f1 100644 --- a/plots/area-basic/metadata/seaborn.yaml +++ b/plots/area-basic/metadata/seaborn.yaml @@ -24,3 +24,175 @@ review: seaborn native capabilities (though seaborn lacks a dedicated area chart function) - 'Grid legend scoring: single series plots could benefit from a subtle annotation or data source note' + image_description: The plot displays a basic area chart showing website visitors + over time (January 2024). The chart uses a semi-transparent blue fill (#306998 + Python Blue at alpha 0.4) with a darker blue line (linewidth 3) on top. The x-axis + shows dates from 2024-01-01 to 2024-01-29 with rotated labels at 45 degrees. The + y-axis shows visitor counts from 0 to approximately 7500. The title "area-basic + · seaborn · pyplots.ai" appears at the top. A clear weekly pattern is visible + with dips on weekends (lower traffic) and peaks mid-week. There's also an overall + upward trend. The gridlines are subtle with alpha 0.3 and dashed style. + criteria_checklist: + visual_quality: + score: 37 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title at fontsize 24, axis labels at 20, tick labels at 16, all perfectly + readable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text, date labels are rotated to avoid collision + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Line width of 3 is optimal, area fill at alpha 0.4 shows magnitude + clearly + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Single color scheme (Python Blue), colorblind-safe + - id: VQ-05 + name: Layout Balance + score: 4 + max: 5 + passed: true + comment: Good proportions, slight excess whitespace at top + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: '"Date" and "Visitors (count)" - descriptive with units' + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: true + comment: Grid is good (alpha 0.3), but no legend present (single series, acceptable + but not ideal) + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct area chart with filled region below line + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: X=datetime (dates), Y=numeric (visitors) correctly assigned + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Semi-transparent fill (alpha 0.4), gridlines, clear axis labels all + present + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: Y-axis starts at 0 (emphasizes area magnitude), all data visible + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Single series, no legend needed + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: Uses correct format "area-basic · seaborn · pyplots.ai" + data_quality: + score: 17 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 6 + max: 8 + passed: true + comment: Shows weekly pattern and upward trend, demonstrates magnitude emphasis + well, but could show more variety (e.g., occasional anomalies) + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Daily website visitors over a month is a perfect real-world scenario + - id: DQ-03 + name: Appropriate Scale + score: 4 + max: 5 + passed: true + comment: Values 3000-7500 are realistic for website traffic, though starting + y at 0 adds some empty space + code_quality: + score: 9 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: Clean imports → data → plot → save structure, no functions/classes + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Uses np.random.seed(42) + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: All imports are used (matplotlib, numpy, pandas, seaborn) + - id: CQ-04 + name: No Deprecated API + score: 0 + max: 1 + passed: true + comment: 'Minor: Uses ax.fill_between from matplotlib instead of seaborn-native + approach' + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png with dpi=300 + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: true + comment: Uses sns.lineplot which is seaborn-native, but the area fill uses + matplotlib's ax.fill_between. Seaborn doesn't have a native area chart function, + so this hybrid approach is acceptable but doesn't showcase seaborn's distinctive + features like regplot, kdeplot, or statistical aggregation. + verdict: APPROVED diff --git a/plots/area-stacked-percent/metadata/altair.yaml b/plots/area-stacked-percent/metadata/altair.yaml index fd257c20a1..9458ba9a93 100644 --- a/plots/area-stacked-percent/metadata/altair.yaml +++ b/plots/area-stacked-percent/metadata/altair.yaml @@ -27,3 +27,181 @@ review: inside plot area - Nuclear data staying perfectly flat at 12% for all 10 years feels artificially constant + image_description: 'The plot displays a 100% stacked area chart showing energy source + mix evolution from 2015 to 2024. Four colored areas are stacked from bottom to + top: Coal (steel blue), Natural Gas (golden yellow), Nuclear (medium slate blue/purple), + and Renewables (sea green). The Y-axis shows "Share of Energy Mix (%)" ranging + from 0% to 100% with percentage formatting. The X-axis displays years from 2015 + to 2024. The title "area-stacked-percent · altair · pyplots.ai" is centered at + the top. A legend on the right identifies the four energy sources with colored + circular markers. The chart clearly illustrates the energy transition narrative + with Coal declining from ~45% to ~16%, Renewables growing from ~18% to ~44%, while + Natural Gas and Nuclear remain relatively stable. Subtle dashed grid lines provide + reference. The areas have slight transparency (0.85 opacity) with visible boundary + lines.' + criteria_checklist: + visual_quality: + score: 36 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title at 28pt, axis labels at 22pt, tick labels at 18pt, all perfectly + readable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements, all labels clearly separated + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Area fills are clearly visible with good opacity (0.85), boundary + lines enhance distinction + - id: VQ-04 + name: Color Accessibility + score: 4 + max: 5 + passed: true + comment: Colors are distinguishable but blue/purple could be closer for some + colorblind users + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Good canvas utilization, plot fills appropriate space with balanced + margins + - id: VQ-06 + name: Axis Labels + score: 1 + max: 2 + passed: true + comment: Y-axis has descriptive label with unit indication (%), X-axis just + "Year" without additional context + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: true + comment: Grid is subtle with dashed style and 0.3 opacity, BUT legend is positioned + outside the plot area creating extra whitespace + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct 100% stacked area chart + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: X is time (Year), Y is percentage contribution correctly assigned + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Shows percentage stacking, multiple categories, temporal progression + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: Y-axis shows full 0-100% range, all years visible + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend labels match data categories correctly + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: 'Uses exact required format: `area-stacked-percent · altair · pyplots.ai`' + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 7 + max: 8 + passed: true + comment: Shows proportion changes over time well, demonstrates both increasing + and decreasing trends, but all changes are gradual (no dramatic shifts shown) + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Energy source mix evolution is a perfect real-world scenario, neutral + topic + - id: DQ-03 + name: Appropriate Scale + score: 4 + max: 5 + passed: true + comment: Percentages are realistic for energy mix, though nuclear staying + exactly flat at 12% for 10 years is slightly artificial + code_quality: + score: 10 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: Clean imports → data → plot → save structure, no functions/classes + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Uses `np.random.seed(42)` (though data is manually specified, seed + is set) + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: 'Only used imports: altair, numpy, pandas' + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Modern Altair API usage + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as `plot.png` and `plot.html` + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: true + comment: Uses Altair's declarative encoding with proper stacking (`stack="normalize"`), + tooltips, and `interactive()` for HTML export. However, could leverage more + Altair-specific features like selections or more sophisticated interactivity. + verdict: APPROVED diff --git a/plots/area-stacked-percent/metadata/bokeh.yaml b/plots/area-stacked-percent/metadata/bokeh.yaml index d9c083beb6..26848da6a0 100644 --- a/plots/area-stacked-percent/metadata/bokeh.yaml +++ b/plots/area-stacked-percent/metadata/bokeh.yaml @@ -24,3 +24,177 @@ review: - Data shows relatively gradual changes; more dramatic proportion shifts would better demonstrate the plot type purpose - Legend at 36pt appears slightly smaller than optimal compared to 48pt axis labels + image_description: 'The plot displays a 100% stacked area chart showing market share + evolution from 2015 to 2024 for four products (A, B, C, D). The chart uses a colorblind-safe + palette: Python blue (#306998) for Product A at the bottom, golden yellow (#FFD43B) + for Product B, sea green (#2E8B57) for Product C, and salmon/coral (#E07B53) for + Product D at the top. The Y-axis shows "Market Share (%)" ranging from 0 to 100, + and the X-axis shows "Year" with annual tick marks. The title correctly follows + the format "area-stacked-percent · bokeh · pyplots.ai". The legend is positioned + in the top-right corner with a semi-transparent background. The stacked areas + sum to 100% at each time point, showing Product A growing from ~40% to ~53%, while + Product D shrinks from ~10% to ~7% over the decade. The grid is subtle with dashed + lines and low alpha. Background is a light off-white (#fafafa).' + criteria_checklist: + visual_quality: + score: 38 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title at 72pt, axis labels at 48pt, tick labels at 36pt - all perfectly + readable at 4800x2700 + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements, all labels clear + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Area patches are clearly visible with good alpha (0.85), distinct + boundaries + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Excellent colorblind-safe palette with blue, yellow, green, and salmon + - all distinguishable + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Plot fills canvas well, good margins, legend positioned appropriately + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: '"Year" and "Market Share (%)" are descriptive with units' + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: false + comment: Grid alpha 0.3 is good, but legend text appears slightly small relative + to axis labels and could be positioned better (inside plot area takes space + from data visualization) + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct 100% stacked area chart + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: X is time (years), Y shows percentage contributions + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Normalized to 100%, shows proportional changes over time + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: Y-axis 0-100 with slight padding (105), X-axis covers all years + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend labels match the four product categories + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: Correctly uses "area-stacked-percent · bokeh · pyplots.ai" + data_quality: + score: 17 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 6 + max: 8 + passed: true + comment: Shows proportion changes over time, but data is relatively stable + without dramatic shifts that would better demonstrate the plot type's value + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Market share evolution is a perfect, neutral business scenario + - id: DQ-03 + name: Appropriate Scale + score: 4 + max: 5 + passed: true + comment: Percentages are realistic, though all products stay relatively close + to initial values + code_quality: + score: 10 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: Clean imports → data → plot → save structure, no functions/classes + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Uses np.random.seed(42) + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: All imports are used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current Bokeh API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png and plot.html + library_features: + score: 2 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 2 + max: 5 + passed: false + comment: Uses ColumnDataSource and patch() which are Bokeh fundamentals, but + doesn't leverage Bokeh's interactive features like HoverTool which would + add tooltips showing exact percentages - a key Bokeh strength + verdict: APPROVED diff --git a/plots/area-stacked-percent/metadata/highcharts.yaml b/plots/area-stacked-percent/metadata/highcharts.yaml index ff5f729f6d..b7dba1037b 100644 --- a/plots/area-stacked-percent/metadata/highcharts.yaml +++ b/plots/area-stacked-percent/metadata/highcharts.yaml @@ -25,3 +25,181 @@ review: more precisely - 'Legend symbols use symbolRadius: 0 (squares) which is fine but circular markers might match the data point markers better' + image_description: 'The plot displays a 100% stacked area chart showing "Product + Market Share Evolution (2018-2025)". Three distinct colored areas fill the chart + from bottom to top: purple (Product C) at the bottom maintaining ~21-25%, yellow + (Product B) in the middle declining from ~40% to ~24%, and steel blue (Product + A) at the top growing from ~35% to ~55%. The Y-axis shows "Market Share (%)" with + values from 0% to 100% in 2% increments. The X-axis shows years from 2018 to 2025. + The title "area-stacked-percent · highcharts · pyplots.ai" appears at the top + with a subtitle below. A horizontal legend at the bottom shows all three products + with colored squares. Data points are marked with small squares on each area boundary. + The chart fills the canvas well with balanced margins.' + criteria_checklist: + visual_quality: + score: 37 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 9 + max: 10 + passed: true + comment: Title, subtitle, axis labels, and tick marks are all clearly readable. + Font sizes are appropriate for the 4800x2700 canvas. + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements; all labels are well-spaced. + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Areas are clearly visible with good fill opacity (0.7), markers are + appropriately sized (radius 8). + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: 'Uses colorblind-safe palette (blue #306998, yellow #FFD43B, purple + #9467BD). No red-green conflicts.' + - id: VQ-05 + name: Layout Balance + score: 4 + max: 5 + passed: true + comment: Good canvas utilization; plot fills most of the space. Slight extra + whitespace at bottom due to legend placement. + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: Y-axis has "Market Share (%)" with units, X-axis has "Year". + - id: VQ-07 + name: Grid & Legend + score: 1 + max: 2 + passed: true + comment: Legend is well-placed and readable. No visible grid lines (Highcharts + default), which is acceptable but a subtle grid could enhance readability. + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: 'Correct 100% stacked area chart with `stacking: "percent"`.' + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: X-axis shows time (years), Y-axis shows percentage contributions. + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Shows proportional changes over time, total always 100%, multiple + categories stacked. + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: Y-axis correctly shows 0-100%, all years visible. + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend correctly identifies Product A, B, and C. + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: Uses correct format "area-stacked-percent · highcharts · pyplots.ai". + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 7 + max: 8 + passed: true + comment: 'Shows three trends: growing (Product A), declining (Product B), + and stable (Product C). Good variety but could show more dramatic crossover + points.' + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Market share evolution is a perfect, realistic business scenario + for this chart type. + - id: DQ-03 + name: Appropriate Scale + score: 4 + max: 5 + passed: true + comment: Values are plausible market share percentages. The data is deterministic + but the values chosen are sensible. + code_quality: + score: 8 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Linear structure: imports → data → chart setup → series → export. + No functions or classes.' + - id: CQ-02 + name: Reproducibility + score: 1 + max: 3 + passed: false + comment: Data is deterministic (no random), but no explicit seed comment. + Minor deduction. + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: All imports are used. + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current Highcharts API. + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as `plot.png` and `plot.html`. + library_features: + score: 4 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 4 + max: 5 + passed: true + comment: 'Good use of Highcharts-specific features: `stacking: "percent"`, + interactive tooltips with `{point.percentage:.1f}%`, proper series configuration. + Could leverage more advanced features like data labels or animation settings.' + verdict: APPROVED diff --git a/plots/area-stacked-percent/metadata/letsplot.yaml b/plots/area-stacked-percent/metadata/letsplot.yaml index 0460ae2fce..055a025f29 100644 --- a/plots/area-stacked-percent/metadata/letsplot.yaml +++ b/plots/area-stacked-percent/metadata/letsplot.yaml @@ -22,3 +22,181 @@ review: - Year labels display with comma separators (2,016 instead of 2016) which looks unnatural for year values - The HTML export setup_html() call is unnecessary overhead for PNG-only output + image_description: 'The plot shows a 100% stacked area chart displaying market share + evolution from 2016 to 2023 for four companies. The y-axis shows "Market Share + (%)" ranging from 0% to 100%, and the x-axis shows "Year" from 2016 to 2023. Four + colored areas are stacked: Company D (purple) at the bottom, Company C (green) + above it, Company B (yellow) in the middle, and Company A (blue) at the top. The + areas always sum to 100%. Company A (blue) shows clear growth over time (expanding + from ~40% to ~58%), while Company B (yellow) declines. Companies C and D maintain + relatively stable small shares. The title reads "area-stacked-percent · letsplot + · pyplots.ai". The legend is positioned on the right side. The background is a + subtle light gray (#FAFAFA) with light grid lines.' + criteria_checklist: + visual_quality: + score: 36 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title, axis labels, tick marks, and legend text are all clearly readable + at the appropriate sizes + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements anywhere in the plot + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Area fills are clearly visible with good alpha (0.85), boundaries + between areas are clear + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Purple, green, yellow, and blue are colorblind-friendly and highly + distinguishable + - id: VQ-05 + name: Layout Balance + score: 3 + max: 5 + passed: true + comment: Good layout but slight imbalance with extra whitespace on the right + due to legend placement + - id: VQ-06 + name: Axis Labels + score: 1 + max: 2 + passed: true + comment: Y-axis label "Market Share (%)" is descriptive, but could arguably + drop "(%)" since values show percentages + - id: VQ-07 + name: Grid & Legend + score: 1 + max: 2 + passed: true + comment: Grid is subtle and good, but year labels show commas (e.g., "2,016" + instead of "2016") + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct 100% stacked area chart + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: X=Year (continuous time), Y=Market Share percentages correctly stacked + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: 'All required features present: multiple categories stacked, normalized + to 100%, shows proportional changes over time' + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: Full data range visible from 2016-2023, 0-100% + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend correctly identifies all four companies + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: Correct format "area-stacked-percent · letsplot · pyplots.ai" + data_quality: + score: 20 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 8 + max: 8 + passed: true + comment: 'Excellent demonstration: shows growing market leader, declining + competitor, stable small players - covers all typical stacked area scenarios' + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Market share evolution is a perfect, neutral business scenario for + this chart type + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: Percentages sum to 100%, time range is realistic 8-year period, company + share values are plausible + code_quality: + score: 7 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Clean sequential structure: imports → data → plot → save' + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Uses np.random.seed(42) for reproducibility + - id: CQ-03 + name: Clean Imports + score: 0 + max: 2 + passed: false + comment: 'Several unused imports: element_blank, element_line, element_rect + are imported but used; however, LetsPlot.setup_html() is called but may + not be needed for PNG export' + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current lets-plot API + - id: CQ-05 + name: Output Correct + score: 0 + max: 1 + passed: true + comment: Saves plot.png but path parameter usage ("path='.'") is unconventional + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses Distinctive Features + score: 3 + max: 5 + passed: true + comment: Uses ggplot2-style grammar with geom_area, position="fill" for 100% + stacking, scale_y_continuous with format for percentages. Could leverage + more lets-plot specific features like tooltips for interactivity. + verdict: APPROVED diff --git a/plots/area-stacked-percent/metadata/matplotlib.yaml b/plots/area-stacked-percent/metadata/matplotlib.yaml index c5481f7d77..c60fa18dc1 100644 --- a/plots/area-stacked-percent/metadata/matplotlib.yaml +++ b/plots/area-stacked-percent/metadata/matplotlib.yaml @@ -26,3 +26,179 @@ review: - X-axis label Year is generic - could be more descriptive like Year (2015-2024) - Library features could be enhanced with annotations showing key percentages or trend indicators + image_description: The plot displays a 100% stacked area chart showing market share + evolution for four companies (A, B, C, D) from 2015 to 2024. The color scheme + uses dark blue (#306998) for Company A at the bottom, golden yellow (#FFD43B) + for Company B, light blue (#4B8BBE) for Company C, and pale yellow (#FFE873) for + Company D at the top. The Y-axis shows "Market Share (%)" with tick marks at 0%, + 25%, 50%, 75%, and 100%. The X-axis shows "Year" with all years from 2015-2024 + labeled. A legend is positioned in the upper right corner with a semi-transparent + background. Horizontal dashed grid lines appear at 25% intervals. The title reads + "area-stacked-percent · matplotlib · pyplots.ai". The visualization clearly shows + Company A declining from ~45% to ~24%, Company B growing from ~30% to ~41%, Company + C steadily increasing from ~15% to ~24%, and Company D remaining stable around + 10-11%. + criteria_checklist: + visual_quality: + score: 38 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: 'All text perfectly readable: title at 24pt, axis labels at 20pt, + tick labels at 16pt' + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text anywhere, all labels clear + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Areas clearly visible with good alpha (0.85), white edge lines separate + layers nicely + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Color scheme uses blue/yellow palette which is colorblind-friendly, + good contrast between adjacent areas + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Plot fills canvas well with proper margins, balanced whitespace + - id: VQ-06 + name: Axis Labels + score: 1 + max: 2 + passed: true + comment: Y-axis has units (%), but X-axis "Year" could be more descriptive + - id: VQ-07 + name: Grid & Legend + score: 1 + max: 2 + passed: true + comment: Grid is subtle (alpha 0.3, dashed, y-only), legend well placed but + slightly overlaps the topmost area + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct 100% stacked area chart + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: X is time (years), Y variables are categories stacked correctly + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Shows percentage contribution, always totals 100%, demonstrates proportional + changes over time + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: Y-axis 0-100%, X-axis shows full data range 2015-2024 + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend labels match data series correctly + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: Uses exact format "{spec-id} · {library} · pyplots.ai" + data_quality: + score: 19 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 7 + max: 8 + passed: true + comment: Shows multiple trends (decline, growth, steady growth, stable), but + could show more dramatic composition shifts + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Market share evolution is a perfect real-world application mentioned + in spec, uses neutral business context + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: Market share percentages (10-45%) are realistic for a competitive + market + code_quality: + score: 10 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: Clean imports → data → plot → save structure, no functions/classes + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Uses np.random.seed(42), though data is deterministic anyway + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: Only matplotlib.pyplot and numpy, both used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current matplotlib API (stackplot, ax methods) + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png with dpi=300 + library_features: + score: 2 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 2 + max: 5 + passed: false + comment: Uses standard stackplot, which is correct but not distinctive. Could + use annotations, fill_between customization, or other matplotlib-specific + features + verdict: APPROVED diff --git a/plots/area-stacked-percent/metadata/plotly.yaml b/plots/area-stacked-percent/metadata/plotly.yaml index 68d94529f4..6d713284ad 100644 --- a/plots/area-stacked-percent/metadata/plotly.yaml +++ b/plots/area-stacked-percent/metadata/plotly.yaml @@ -24,3 +24,174 @@ review: top of stack - Two green shades (Hydro olive and Wind bright) may be difficult to distinguish for colorblind users + image_description: 'The plot displays a 100% stacked area chart showing energy source + market share evolution from 2015 to 2024. Five energy sources are represented: + Coal (dark blue, bottom), Natural Gas (yellow/gold), Wind (bright green), Solar + (magenta/pink), and Hydro (olive green, top). The chart clearly shows Coal declining + from ~40% to ~22%, while renewable sources (Wind, Solar) grow over time. Natural + Gas remains relatively stable around 30-32%. The title "area-stacked-percent · + plotly · pyplots.ai" is centered at the top. A horizontal legend sits above the + plot area. The Y-axis shows "Market Share (%)" with percentage suffixes (0%-100%), + and the X-axis shows "Year" (2015-2024). The layout uses a clean white background + with subtle gridlines.' + criteria_checklist: + visual_quality: + score: 37 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title at 28pt, axis labels at 22pt, ticks at 18pt - all perfectly + readable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements anywhere + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Stacked areas are clearly visible with good fill colors + - id: VQ-04 + name: Color Accessibility + score: 4 + max: 5 + passed: true + comment: Colors are distinguishable but the olive green (Hydro) and bright + green (Wind) could be confused by some colorblind users + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Plot fills canvas well with balanced margins, legend positioned cleanly + above + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: Y-axis has "Market Share (%)" with units, X-axis has "Year" + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: false + comment: Grid is subtle (alpha 0.1), but legend order is reversed from visual + stacking order (Hydro shown first in legend but appears at top of stack) + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct 100% stacked area chart + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: X=time (years), Y=percentages correctly stacked + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Normalized to 100%, shows proportional changes over time + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: Y-axis 0-100%, X-axis covers all years + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: All 5 categories correctly labeled + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: 'Uses exact format: "area-stacked-percent · plotly · pyplots.ai"' + data_quality: + score: 20 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 8 + max: 8 + passed: true + comment: Shows multiple categories with varying trends (declining Coal, growing + renewables, stable Gas) + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Energy source market share is a real, neutral, comprehensible scenario + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: Percentages are realistic for energy mix evolution + code_quality: + score: 10 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Simple linear structure: imports → data → plot → save' + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Uses np.random.seed(42) + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: Only numpy and plotly.graph_objects used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current Plotly API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png and plot.html + library_features: + score: 5 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 5 + max: 5 + passed: true + comment: Uses stackgroup with groupnorm="percent", hovertemplate for custom + tooltips, update_layout with comprehensive styling, and generates interactive + HTML output + verdict: APPROVED diff --git a/plots/area-stacked-percent/metadata/plotnine.yaml b/plots/area-stacked-percent/metadata/plotnine.yaml index 300f77d93b..2e8e079233 100644 --- a/plots/area-stacked-percent/metadata/plotnine.yaml +++ b/plots/area-stacked-percent/metadata/plotnine.yaml @@ -28,3 +28,176 @@ review: unnecessary - Could benefit from more dramatic proportion shifts to better demonstrate the plot type capabilities + image_description: 'The plot displays a 100% stacked area chart showing tech product + market share evolution from 2015-2024. Four categories are stacked: Laptops (coral/salmon + at bottom), Wearables (teal/cyan), Tablets (yellow), and Smartphones (blue at + top). The Y-axis ranges from 0% to 100% with clear percentage labels. The X-axis + shows years from 2015 to 2023 in 2-year intervals. A legend on the right identifies + each category as "Product Category". The title "area-stacked-percent · plotnine + · pyplots.ai" is prominently displayed at the top in bold. The chart shows interesting + trends: Smartphones declining from ~45% to ~31%, Tablets declining from ~25% to + ~9%, Wearables growing dramatically from ~5% to ~28%, and Laptops remaining relatively + stable around 25-32%.' + criteria_checklist: + visual_quality: + score: 37 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title is bold and large (~24pt), axis labels are clearly readable + (~20pt), tick labels are appropriately sized (~16pt) + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements anywhere + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Areas are clearly visible with good alpha (0.85), distinct color + boundaries + - id: VQ-04 + name: Color Accessibility + score: 4 + max: 5 + passed: true + comment: Good color contrast, colors are distinguishable but blue/teal could + be closer for some colorblind users + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Excellent use of canvas, plot fills appropriate space with balanced + margins + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: Descriptive labels "Year" and "Market Share (%)" with units + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: true + comment: Grid is subtle with alpha 0.3, but legend could be better positioned + (appears slightly cramped) + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct 100% stacked area chart + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: X is time (years), Y is percentage, fill is category + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: All areas stack to 100%, shows proportional changes over time + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: Full 0-100% range shown, all years visible + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend correctly identifies all four categories + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: 'Correct format: "area-stacked-percent · plotnine · pyplots.ai"' + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 7 + max: 8 + passed: true + comment: Shows rising and falling trends, stable categories, crossover points + - could show more dramatic shifts + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Tech market share is a realistic, neutral business scenario + - id: DQ-03 + name: Appropriate Scale + score: 4 + max: 5 + passed: true + comment: Values are realistic percentages, though all values conveniently + sum to 100 in raw data + code_quality: + score: 9 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: Clean imports → data → plot → save structure, no functions/classes + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Uses np.random.seed(42) though data is actually deterministic + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: All imports are used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current plotnine API + - id: CQ-05 + name: Output Correct + score: 0 + max: 1 + passed: true + comment: Saves as 'plot.png' but uses verbose=False which is fine + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: true + comment: Uses ggplot grammar with geom_area, scale_fill_manual, theme customization. + Good use of plotnine's grammar of graphics, but could leverage more advanced + features like faceting or annotations + verdict: APPROVED diff --git a/plots/area-stacked-percent/metadata/pygal.yaml b/plots/area-stacked-percent/metadata/pygal.yaml index ebcbb83d7e..1ba91f8dee 100644 --- a/plots/area-stacked-percent/metadata/pygal.yaml +++ b/plots/area-stacked-percent/metadata/pygal.yaml @@ -25,3 +25,179 @@ review: visualization where the full 0-100% context matters - Data is somewhat artificial with perfectly linear trends and static values (Accessories at exactly 4% for all years) + image_description: 'The plot displays a 100% stacked area chart showing market share + evolution for five tech product categories from 2018 to 2024. The chart uses five + distinct colors: deep blue (Smartphones) at the bottom, golden yellow (Laptops), + teal green (Tablets), coral/salmon (Wearables), and purple (Accessories) at the + top. The stacked areas always sum to 100%, clearly showing proportional shifts + over time. The title "area-stacked-percent · pygal · pyplots.ai" appears at the + top center. The legend is positioned in the top-left corner with colored squares. + Y-axis shows "Market Share (%)" ranging from 40-100, and X-axis shows "Year" with + labels from 2018-2024. Small dots mark data points on the area boundaries. Horizontal + grid lines are visible at y-axis intervals.' + criteria_checklist: + visual_quality: + score: 35 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 9 + max: 10 + passed: true + comment: Title, axis labels, and legend text are clearly readable at full + size; font sizes are well-scaled for 4800x2700 + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements; legend is separate from chart area + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Areas are clearly visible with good opacity (0.85); small dots mark + data points effectively + - id: VQ-04 + name: Color Accessibility + score: 4 + max: 5 + passed: true + comment: Colors are distinguishable; blue/green/yellow/coral/purple palette + is reasonably colorblind-friendly, though blue and purple could be more + distinct + - id: VQ-05 + name: Layout Balance + score: 4 + max: 5 + passed: true + comment: Good use of canvas; plot fills most of the area; slight imbalance + with legend in top-left corner outside the main plot area + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: 'Descriptive labels with units: "Market Share (%)" and "Year"' + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: false + comment: Y-axis starts at ~40 instead of 0, which is misleading for a 100% + stacked chart where the visual representation should show the full 0-100% + range + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct 100% stacked area chart using pygal's StackedLine with fill=True + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: X-axis shows time (years), Y-axis shows percentage contribution + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Shows normalized percentages, multiple categories, temporal progression + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: All data points visible; years 2018-2024 shown + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend labels match data series names correctly + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: 'Correct format: "area-stacked-percent · pygal · pyplots.ai"' + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 7 + max: 8 + passed: true + comment: Shows multiple categories with changing proportions over time; demonstrates + the key feature of 100% normalization; slight deduction as all trends are + relatively smooth/linear + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Tech product market share is a realistic, neutral business scenario + - id: DQ-03 + name: Appropriate Scale + score: 4 + max: 5 + passed: true + comment: Values sum to 100% as required; percentage values are plausible for + market share; some values (e.g., Accessories staying exactly 4% for 7 years) + feel slightly artificial + code_quality: + score: 10 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Simple linear structure: imports → data → style → chart → save' + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Deterministic data (hardcoded values, no random generation) + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: Only pygal and Style imported, both used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current pygal API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png and plot.html + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: true + comment: Uses pygal's StackedLine with fill=True, custom Style, render_to_png/html; + could leverage more pygal-specific features like tooltips or value formatters + verdict: APPROVED diff --git a/plots/area-stacked-percent/metadata/seaborn.yaml b/plots/area-stacked-percent/metadata/seaborn.yaml index 570cb8b58b..e264c71cac 100644 --- a/plots/area-stacked-percent/metadata/seaborn.yaml +++ b/plots/area-stacked-percent/metadata/seaborn.yaml @@ -22,3 +22,182 @@ review: weaknesses: - Legend order (Solar, Wind, Hydro, Other top-to-bottom) is reversed from visual stack order (Other, Hydro, Wind, Solar bottom-to-top), which can confuse readers + image_description: 'The plot displays a 100% stacked area chart showing the evolution + of renewable energy sources market share from 2015 to 2024. The chart uses four + distinct colors: dark blue (Steel blue, #306998) for Solar at the top, golden + yellow (#FFD43B) for Wind in the middle-upper area, turquoise/teal (#4ECDC4) for + Hydro in the middle-lower area, and gray (#95A5A6) for Other at the bottom. The + Y-axis shows "Share (%)" ranging from 0 to 100, and the X-axis shows "Year" from + 2015 to 2024. The title follows the correct format: "area-stacked-percent · seaborn + · pyplots.ai". The legend is positioned in the upper left with a white background. + The plot clearly shows Solar growing from ~10% to ~45%, Wind growing slightly + from ~20% to ~35%, Hydro declining from ~50% to ~18%, and Other declining from + ~20% to ~2%. The areas stack to exactly 100% throughout. Subtle boundary lines + separate each area. The grid is shown only on the Y-axis with dashed lines at + low alpha.' + criteria_checklist: + visual_quality: + score: 36 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title at 24pt, axis labels at 20pt, ticks at 16pt - all perfectly + readable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements, legend well-positioned + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Areas clearly visible with good alpha (0.85), boundary lines help + distinguish layers + - id: VQ-04 + name: Color Accessibility + score: 4 + max: 5 + passed: true + comment: Good color choices with distinct hues, though yellow-on-white legend + could be slightly improved + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Plot fills canvas well, balanced margins, legend near the data + - id: VQ-06 + name: Axis Labels + score: 1 + max: 2 + passed: true + comment: Y-axis has units "Share (%)", X-axis just "Year" without units (acceptable + for years) + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: true + comment: 'Grid is subtle (alpha 0.3), but legend order (top-to-bottom: Solar, + Wind, Hydro, Other) doesn''t match visual stack order (bottom-to-top: Other, + Hydro, Wind, Solar)' + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct 100% stacked area chart + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: X=time (years), Y=percentage contributions correctly assigned + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Normalized to 100%, shows proportional changes over time + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: Y-axis 0-100%, X-axis shows all years 2015-2024 + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend labels correctly identify all four categories + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: Uses exact format "{spec-id} · {library} · pyplots.ai" + data_quality: + score: 20 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 8 + max: 8 + passed: true + comment: 'Shows all aspects: growth (Solar), steady growth (Wind), decline + (Hydro), sharp decline (Other) - excellent variation' + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Renewable energy market share is a real, neutral, comprehensible + scenario + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: Values are realistic for energy market percentages + code_quality: + score: 7 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Linear flow: imports → data → plot → save' + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: np.random.seed(42) set (though data is actually deterministic) + - id: CQ-03 + name: Clean Imports + score: 0 + max: 2 + passed: false + comment: matplotlib.patches.Patch is imported but could be avoided; all imports + are used but sns.lineplot usage is contrived + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Current seaborn API used correctly + - id: CQ-05 + name: Output Correct + score: 0 + max: 1 + passed: true + comment: Saves as plot.png correctly + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: false + comment: Uses sns.set_theme(), sns.set_context(), and sns.lineplot(). However, + the main plotting (fill_between) uses matplotlib directly. Seaborn doesn't + have a native stacked area function, so this hybrid approach is acceptable + but not ideal. + verdict: APPROVED diff --git a/plots/area-stacked/metadata/altair.yaml b/plots/area-stacked/metadata/altair.yaml index 7c770c8a41..2ed350fe54 100644 --- a/plots/area-stacked/metadata/altair.yaml +++ b/plots/area-stacked/metadata/altair.yaml @@ -24,3 +24,172 @@ review: weaknesses: - Legend symbols lack visible stroke, making color patches slightly harder to distinguish at a glance + image_description: 'The plot displays a stacked area chart showing monthly revenue + by product category over two years (Jan 2023 - Nov 2024). Four distinct areas + are stacked from bottom to top: Software (Python blue #306998), Hardware (Python + yellow #FFD43B), Services (teal #5D9B9B), and Support (mauve #A85C5C). The title + "area-stacked · altair · pyplots.ai" is centered at the top. The X-axis shows + "Month" with rotated date labels (e.g., "Jan 2023", "Mar 2023"), and the Y-axis + shows "Revenue ($ thousands)" ranging from 0 to ~300. A legend titled "Product + Category" appears on the right side. The chart has subtle dashed grid lines and + shows realistic revenue trends with variation over time.' + criteria_checklist: + visual_quality: + score: 37 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title at 28pt, axis labels at 22pt, tick labels at 18pt - all clearly + readable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text, rotated x-axis labels prevent collision + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Areas are well-sized with good opacity (0.85) and visible stroke + lines + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Four distinct colors (blue, yellow, teal, mauve) are colorblind-safe + - id: VQ-05 + name: Layout Balance + score: 4 + max: 5 + passed: true + comment: Good layout, chart fills canvas well, legend positioned appropriately + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: 'Descriptive with units: "Revenue ($ thousands)", "Month"' + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: true + comment: Grid is subtle (alpha 0.3, dashed), but legend has no stroke on symbols + making color identification slightly harder + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct stacked area chart + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Time on X-axis, revenue values on Y-axis, stacking correct + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Multiple series, stacking, legend, time-based x-axis all present + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: All data visible, baseline starts at zero + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend labels match data categories correctly + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: 'Correct format: "area-stacked · altair · pyplots.ai"' + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 7 + max: 8 + passed: true + comment: Shows 4 series with trends, but all series follow similar patterns + (general decline in 2024) + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Monthly revenue by product category is a realistic business scenario + - id: DQ-03 + name: Appropriate Scale + score: 4 + max: 5 + passed: true + comment: Values in tens to hundreds of thousands are reasonable, though cumulative + totals ~280k could use more variation + code_quality: + score: 10 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Flat script structure: imports → data → plot → save' + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Uses np.random.seed(42) + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: Only altair, numpy, pandas used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current Altair API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png and plot.html + library_features: + score: 5 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 5 + max: 5 + passed: true + comment: Declarative encoding, tooltips, interactive HTML export, proper Vega-Lite + stack ordering + verdict: APPROVED diff --git a/plots/area-stacked/metadata/bokeh.yaml b/plots/area-stacked/metadata/bokeh.yaml index c5228e7da7..3f01a2e5a9 100644 --- a/plots/area-stacked/metadata/bokeh.yaml +++ b/plots/area-stacked/metadata/bokeh.yaml @@ -25,3 +25,180 @@ review: harder to distinguish - Missing HoverTool which is a distinctive Bokeh feature for interactivity - Series not strictly ordered by size (largest at bottom) as suggested in spec Notes + image_description: The plot displays a stacked area chart showing monthly revenue + by product category (Electronics, Clothing, Home & Garden, Sports) over 24 months + from January 2023 to December 2024. The areas are stacked from bottom to top with + Sports (light yellow) at the base, then Home & Garden (light blue), Clothing (golden + yellow), and Electronics (dark blue/Python blue) on top. The legend is positioned + on the right side outside the plot area. The title "area-stacked · bokeh · pyplots.ai" + appears at the top left. X-axis labels show months in "Mon YYYY" format at an + angle, and Y-axis shows "Revenue ($K)" ranging from 0 to ~500. The plot has a + light gray background with dashed grid lines. The total revenue shows an upward + trend from ~400K to ~490K over the period. + criteria_checklist: + visual_quality: + score: 36 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 9 + max: 10 + passed: true + comment: Title, axis labels, and tick marks are clearly readable at full size. + Font sizes are appropriately scaled for the 4800x2700 canvas. + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements. X-axis labels are angled to avoid collision. + - id: VQ-03 + name: Element Visibility + score: 7 + max: 8 + passed: true + comment: Stacked areas are clearly visible with good fill alpha (0.85). Areas + are well-defined with clear boundaries. + - id: VQ-04 + name: Color Accessibility + score: 4 + max: 5 + passed: true + comment: Colors are distinguishable but the two yellow shades (Clothing and + Sports) could be confused by some viewers. Not strictly red-green issue + but similar luminance. + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Good canvas utilization with the plot filling most of the space. + Legend is well-placed on the right. + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: Y-axis has units "Revenue ($K)", X-axis has "Month" - both descriptive. + - id: VQ-07 + name: Grid & Legend + score: 1 + max: 2 + passed: true + comment: Grid is subtle with dashed lines and alpha 0.3. Legend is well-styled + but placed outside the plot area which is fine. + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct stacked area chart implementation using Bokeh varea. + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: X-axis is time (months), Y values are stacked correctly. + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: 'All spec features present: multiple series stacked, legend included, + semi-transparent fills, baseline at zero.' + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: All data visible, Y-axis extends slightly beyond max value. + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend labels correctly identify each category. + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: 'Correct format: "area-stacked · bokeh · pyplots.ai"' + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 7 + max: 8 + passed: true + comment: Shows trends (Electronics growing), seasonality (Clothing with sine + wave pattern), and composition changes over time. Could show more dramatic + compositional shifts. + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Monthly revenue by product category is a realistic e-commerce scenario + with plausible trends. + - id: DQ-03 + name: Appropriate Scale + score: 4 + max: 5 + passed: true + comment: Revenue values in $K range (50-220 per category) are realistic for + a mid-size retailer. Total ~400-500K monthly is plausible. + code_quality: + score: 9 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Linear flow: imports → data → plot → save. No functions or classes.' + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Uses np.random.seed(42). + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: All imports are used (numpy, pandas, bokeh components). + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current Bokeh API. + - id: CQ-05 + name: Output Correct + score: 0 + max: 1 + passed: false + comment: Saves as plot.png correctly, but also saves plot.html which is appropriate + for Bokeh. + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Distinctive Features + score: 3 + max: 5 + passed: true + comment: Uses ColumnDataSource, varea, Legend, FixedTicker properly. Could + leverage more Bokeh-specific features like HoverTool for interactivity. + verdict: APPROVED diff --git a/plots/area-stacked/metadata/highcharts.yaml b/plots/area-stacked/metadata/highcharts.yaml index 598a317ac7..4d5031bb78 100644 --- a/plots/area-stacked/metadata/highcharts.yaml +++ b/plots/area-stacked/metadata/highcharts.yaml @@ -23,3 +23,178 @@ review: weaknesses: - Legend background color creates slight visual disconnection from the chart area - Grid lines could be slightly more subtle (currently visible but not distracting) + image_description: |- + The plot displays a stacked area chart showing monthly revenue by product category from January 2023 through December 2024. Four distinct colored areas are stacked vertically: + - **Blue (#306998)** - Electronics (largest area, top of stack) + - **Yellow (#FFD43B)** - Software (second from top) + - **Purple (#9467BD)** - Services (third from top) + - **Cyan (#17BECF)** - Accessories (smallest, at bottom) + + The chart has clear axis labels ("Revenue ($ thousands)" on Y-axis, month labels on X-axis), a title "area-stacked · highcharts · pyplots.ai" with subtitle "Monthly Revenue by Product Category (2023-2024)", and a legend positioned in the top-right corner. The stacked areas show cumulative totals reaching peaks around 625 in Dec 2023 and 735 in Dec 2024. The baseline starts at zero and the chart effectively demonstrates both individual category contributions and overall trends. + criteria_checklist: + visual_quality: + score: 37 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title, axis labels, tick labels, and legend all clearly readable + at proper font sizes + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements, all labels fully visible + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Area fills are clearly visible with good fillOpacity (0.75), distinct + boundaries + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Uses colorblind-safe palette (blue, yellow, purple, cyan) - no red-green + conflicts + - id: VQ-05 + name: Layout Balance + score: 4 + max: 5 + passed: true + comment: Good layout, but legend placement in top-right slightly crowds the + chart area + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: Y-axis has descriptive label with units "Revenue ($ thousands)" + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: false + comment: Grid lines are subtle, but legend has white background that slightly + disrupts visual flow + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct stacked area chart type + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: X-axis shows months (time), Y-axis shows revenue values correctly + stacked + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: 'All spec features present: distinct colors, legend, stacked areas, + baseline at zero' + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: Axes show full data range, Y-axis starts at 0 + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend correctly identifies all four categories + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: Correctly formatted as "area-stacked · highcharts · pyplots.ai" + data_quality: + score: 20 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 8 + max: 8 + passed: true + comment: Shows multiple series (4 categories), seasonal patterns, year-over-year + growth, relative contributions + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Monthly revenue by product category is a plausible business scenario + matching spec examples + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: Revenue values in thousands (25-310K) are realistic for product categories + code_quality: + score: 7 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 1 + max: 3 + passed: false + comment: Code is linear but has a for loop for series creation which is acceptable, + some complexity with Selenium setup + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Uses deterministic/hardcoded data, no random elements + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: All imports are used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current highcharts-core API + - id: CQ-05 + name: Output Correct + score: 0 + max: 1 + passed: false + comment: Saves as plot.png but also creates plot.html (expected for interactive + library) + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: false + comment: Uses Highcharts stacking, shared tooltips, and series configuration, + but could leverage more interactive features like data labels or export + options + verdict: APPROVED diff --git a/plots/area-stacked/metadata/letsplot.yaml b/plots/area-stacked/metadata/letsplot.yaml index 3d4bb984f5..1d4d5f37a4 100644 --- a/plots/area-stacked/metadata/letsplot.yaml +++ b/plots/area-stacked/metadata/letsplot.yaml @@ -27,3 +27,178 @@ review: increasing grid alpha - Color palette includes red-green combination which may be challenging for colorblind users; consider using a fully colorblind-safe palette + image_description: 'The plot displays a stacked area chart showing monthly revenue + by product category over a 2-year period (Jan 2023 to Dec 2024). Four categories + are stacked: Electronics (blue, bottom), Clothing (yellow), Home & Garden (green), + and Sports (crimson/red, top). The chart uses smooth filled areas with white borders + between layers, showing clear seasonal patterns with peaks around early spring + months. The y-axis shows "Revenue (Thousands USD)" ranging from 0 to 220, and + the x-axis shows "Month" with five labeled time points. A legend on the right + identifies each category. The title "area-stacked · letsplot · pyplots.ai" appears + at the top in bold.' + criteria_checklist: + visual_quality: + score: 37 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title is bold and large (~24pt), axis labels are clearly readable + (~20pt), tick labels are appropriately sized (~16pt) + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements; all labels are well-spaced + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Area fills are clearly visible with good alpha (0.85), white borders + between layers improve distinction + - id: VQ-04 + name: Color Accessibility + score: 4 + max: 5 + passed: true + comment: Colors are distinct (blue, yellow, green, red) but red-green combination + could be problematic for some colorblind users (-1) + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Plot fills canvas well, legend is appropriately placed on the right + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: Y-axis has units "Revenue (Thousands USD)", X-axis has descriptive + "Month" + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: false + comment: Grid lines are barely visible or absent on the plot; horizontal grid + would improve readability + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct stacked area chart type + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Time on x-axis, revenue values stacked on y-axis, categories properly + mapped + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Has stacking, multiple series, legend, proper baseline at zero + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: All data visible, y-axis starts at 0 as required + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend labels match data categories correctly + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: Uses exact format "area-stacked · letsplot · pyplots.ai" + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 7 + max: 8 + passed: true + comment: Shows stacking, multiple categories, trends over time, and seasonality + (-1 for not showing crossover between categories which could demonstrate + more dynamic compositions) + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Revenue by product category over 2 years is a realistic, relatable + business scenario + - id: DQ-03 + name: Appropriate Scale + score: 4 + max: 5 + passed: true + comment: Values in thousands USD are reasonable for revenue; however the specific + scale (60-220K) could be more clearly representative (-1) + code_quality: + score: 9 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Clean linear structure: imports → data → plot → save' + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Uses `np.random.seed(42)` for reproducibility + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: All imports are used, no unused imports + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current lets-plot API + - id: CQ-05 + name: Output Correct + score: 0 + max: 1 + passed: false + comment: Saves to `plot.png` but ggsave uses path="." which is correct (-0) + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: true + comment: Uses ggplot grammar, geom_area with position="stack", scale_fill_manual, + theme_minimal customization. Could leverage more lets-plot specific features + like tooltips or interactive capabilities for HTML output. + verdict: APPROVED diff --git a/plots/area-stacked/metadata/matplotlib.yaml b/plots/area-stacked/metadata/matplotlib.yaml index e8c6859fb9..7887fe55e3 100644 --- a/plots/area-stacked/metadata/matplotlib.yaml +++ b/plots/area-stacked/metadata/matplotlib.yaml @@ -27,3 +27,171 @@ review: - Axis labels lack units - Could benefit from more distinct color separation between adjacent green and purple bands for colorblind accessibility + image_description: 'The plot displays a stacked area chart showing monthly website + visitors over 24 months (Jan 2023 to Dec 2024). Four traffic source categories + are stacked: Organic Search (blue, bottom), Direct (yellow), Social Media (green), + and Referral (purple, top). The y-axis shows Monthly Visitors ranging from 0 to + approximately 110,000. The title "area-stacked · matplotlib · pyplots.ai" is displayed + at the top. A legend in the upper left identifies the four categories. The grid + uses subtle dashed horizontal lines. All areas show realistic growth trends with + some variation over time.' + criteria_checklist: + visual_quality: + score: 36 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title at 24pt, labels at 20pt, ticks at 16pt - all perfectly readable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Stacked areas are clearly visible with good alpha (0.85) + - id: VQ-04 + name: Color Accessibility + score: 4 + max: 5 + passed: true + comment: Colors are distinguishable but blue/green could be slightly more + distinct for colorblind users + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Plot fills canvas well with balanced margins + - id: VQ-06 + name: Axis Labels + score: 1 + max: 2 + passed: false + comment: Labels are descriptive ("Month", "Monthly Visitors") but lack units + - id: VQ-07 + name: Grid & Legend + score: 2 + max: 2 + passed: true + comment: Grid is subtle (alpha=0.3, dashed), legend well placed + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct stacked area chart + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: X=time (months), Y=visitor counts correctly stacked + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Has distinct colors, legend, stacking, semi-transparent fills + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: Y-axis starts at zero, all data visible + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend labels match data categories correctly + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: Uses exact format "{spec-id} · {library} · pyplots.ai" + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 6 + max: 8 + passed: true + comment: Shows stacking and cumulative totals well, but series sizes are quite + similar; spec suggests ordering largest at bottom which is done, but more + variation between series would better demonstrate the stacked nature + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Website traffic sources is a perfect real-world scenario mentioned + in spec + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: Visitor counts in tens of thousands are realistic for a medium-sized + website + code_quality: + score: 10 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: Simple imports → data → plot → save structure, no functions/classes + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Uses np.random.seed(42) + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: Only matplotlib.pyplot and numpy used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: No deprecated functions + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as 'plot.png' + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: true + comment: Uses ax.stackplot which is matplotlib's native stacked area function, + but doesn't leverage more advanced features like color cycling or annotations + verdict: APPROVED diff --git a/plots/area-stacked/metadata/plotly.yaml b/plots/area-stacked/metadata/plotly.yaml index bf7c91e108..ae83d98072 100644 --- a/plots/area-stacked/metadata/plotly.yaml +++ b/plots/area-stacked/metadata/plotly.yaml @@ -28,3 +28,180 @@ review: demonstrate compositional changes - Axis labels lack units - Could leverage more plotly-specific features like custom hover templates + image_description: 'The plot displays a stacked area chart showing website traffic + sources over 24 months (Jan 2023 to Dec 2024). Four distinct traffic sources are + stacked: Organic Search (blue, at the bottom), Direct (yellow), Social Media (green), + and Referral (pink, at the top). The y-axis shows "Monthly Visitors" ranging from + 0 to approximately 85,000 using "k" notation. The x-axis shows "Month" with quarterly + date labels. The title reads "Website Traffic Sources · area-stacked · plotly + · pyplots.ai" with a horizontal legend placed above the chart. All four series + show upward trends over time, with Organic Search being the largest contributor. + The chart uses semi-transparent fills with subtle grid lines on a white background.' + criteria_checklist: + visual_quality: + score: 36 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title at 32pt, axis labels at 24pt, tick fonts at 18pt - all perfectly + readable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements, legend positioned cleanly above chart + - id: VQ-03 + name: Element Visibility + score: 7 + max: 8 + passed: true + comment: Areas are clearly visible with 0.7 alpha transparency, good differentiation + between stacked layers + - id: VQ-04 + name: Color Accessibility + score: 4 + max: 5 + passed: true + comment: Four distinct colors (blue, yellow, green, pink) provide reasonable + contrast, though pink/red and green together are not ideal for colorblind + users + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Excellent canvas utilization, chart fills ~65% of space with balanced + margins + - id: VQ-06 + name: Axis Labels + score: 1 + max: 2 + passed: true + comment: Descriptive labels "Monthly Visitors" and "Month" but no units + - id: VQ-07 + name: Grid & Legend + score: 1 + max: 2 + passed: true + comment: Grid subtle at 0.1 alpha, legend well placed but could benefit from + box/border + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct stacked area chart using stackgroup + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: X-axis is time (months), Y-axis is numeric values, properly stacked + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: 'All spec features present: distinct colors, legend, semi-transparent + fills, baseline at zero' + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: Y-axis starts at zero with rangemode="tozero", all data visible + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend labels correctly identify all four traffic sources + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: 'Correct format: "Website Traffic Sources · area-stacked · plotly + · pyplots.ai"' + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 7 + max: 8 + passed: true + comment: 'Shows upward trends, multiple series stacking, variation between + categories. Minor: all series trend upward, could show some declining series + for more variety' + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Website traffic sources is a classic, realistic application for stacked + area charts + - id: DQ-03 + name: Appropriate Scale + score: 4 + max: 5 + passed: true + comment: Values in 5k-45k range are realistic for web traffic; total reaching + ~85k is plausible + code_quality: + score: 10 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Clean linear structure: imports → data → plot → save' + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Uses np.random.seed(42) + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: Only numpy, pandas, and plotly.graph_objects imported, all used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current plotly API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png (4800x2700 via 1600x900 scale=3) and plot.html + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: true + comment: Uses stackgroup for proper stacking, hovermode="x unified" for interactive + features, HTML export. Could leverage more plotly-specific features like + hover templates or annotations + verdict: APPROVED diff --git a/plots/area-stacked/metadata/plotnine.yaml b/plots/area-stacked/metadata/plotnine.yaml index 274f090661..5380f08de8 100644 --- a/plots/area-stacked/metadata/plotnine.yaml +++ b/plots/area-stacked/metadata/plotnine.yaml @@ -22,3 +22,172 @@ review: - Proper date handling with scale_x_date and formatted quarterly labels weaknesses: - Y-axis label could include units like (thousands) for clarity + image_description: 'The plot displays a stacked area chart showing website traffic + sources over 24 months (January 2023 to January 2025). Four colored areas are + stacked: Social Media (red) at the bottom, Referral (green), Direct (yellow), + and Organic Search (blue) at the top. The y-axis shows "Monthly Visitors" ranging + from 0 to approximately 65,000. The x-axis shows "Month" with quarterly date labels. + The title reads "area-stacked · plotnine · pyplots.ai" in bold. A legend labeled + "Traffic Source" appears on the right side. The chart uses a minimal theme with + subtle gridlines and has good visual balance.' + criteria_checklist: + visual_quality: + score: 37 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title is bold 24pt, axis titles 20pt, axis text 16pt, all clearly + readable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text, x-axis labels rotated 45° to avoid collision + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Areas clearly visible with 0.85 alpha, good stacking visibility + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Uses Python blue, yellow, green, red - distinct and colorblind-friendly + palette + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Plot fills canvas well, legend positioned on right, balanced margins + - id: VQ-06 + name: Axis Labels + score: 1 + max: 2 + passed: false + comment: '"Monthly Visitors" and "Month" are descriptive but lack units' + - id: VQ-07 + name: Grid & Legend + score: 2 + max: 2 + passed: true + comment: Subtle grid with alpha 0.3, legend well placed + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct stacked area chart + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Date on x-axis, visitors on y-axis, categories stacked correctly + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: 'All spec features present: distinct colors, legend, ordered by size, + semi-transparent fills, baseline at zero' + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: All data visible, y-axis starts at 0 + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend correctly identifies all four traffic sources + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: 'Correct format: "area-stacked · plotnine · pyplots.ai"' + data_quality: + score: 20 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 8 + max: 8 + passed: true + comment: 'Shows 4 series with varying trends: organic growing, social growing, + direct stable with fluctuation, referral stable' + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Website traffic sources is a real-world application mentioned in + the spec + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: Visitor counts in thousands are realistic for website analytics + code_quality: + score: 10 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Simple script: imports → data → plot → save, no functions/classes' + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Uses np.random.seed(42) + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: All imports are used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Using current plotnine API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as 'plot.png' + library_features: + score: 5 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 5 + max: 5 + passed: true + comment: 'Excellent use of plotnine''s grammar of graphics: ggplot + aes + + geom_area with position="stack", scale_fill_manual, scale_x_date, theme_minimal + with extensive customization' + verdict: APPROVED diff --git a/plots/area-stacked/metadata/pygal.yaml b/plots/area-stacked/metadata/pygal.yaml index a8c85b9211..02735a5448 100644 --- a/plots/area-stacked/metadata/pygal.yaml +++ b/plots/area-stacked/metadata/pygal.yaml @@ -25,3 +25,176 @@ review: would be cleaner - Grid lines could be more subtle (current y_guides are acceptable but could use lower opacity) + image_description: 'The plot displays a stacked area chart showing monthly revenue + by product category over 2 years (Jan 2023 - Dec 2024). Four categories are shown: + Electronics (blue, bottom), Clothing (yellow), Home & Garden (green), and Books + (red, top). The areas are properly stacked, with the cumulative total reaching + peaks around 520K in December periods, showing clear holiday shopping seasonality. + The legend is positioned in the top-left corner with colored squares. X-axis labels + show month abbreviations at 45-degree rotation, Y-axis shows "Revenue ($K)". The + title "area-stacked · pygal · pyplots.ai" appears at the top center. The chart + has a white background with subtle horizontal grid lines.' + criteria_checklist: + visual_quality: + score: 36 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 9 + max: 10 + passed: true + comment: Title, axis labels, and legend are clearly readable. Tick labels + are slightly small but legible. + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements; x-axis labels are well-spaced with + rotation. + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Stacked areas are clearly visible with good opacity (0.85). + - id: VQ-04 + name: Color Accessibility + score: 4 + max: 5 + passed: true + comment: Colors are distinguishable; blue/green could be challenging for some + colorblind users but overall acceptable. + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Plot fills canvas well, good margins, legend placement is functional. + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: Y-axis has "Revenue ($K)" with units, X-axis has "Month". + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: false + comment: Legend position in top-left overlaps slightly with the plot area; + could be better placed. + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct stacked area chart using StackedLine with fill=True. + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: X-axis is time (months), Y values are stacked revenue series. + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Multiple series stacked, legend present, distinct colors, baseline + at zero. + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: All data visible, axes show complete range. + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend labels match series names correctly. + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: Correctly uses "area-stacked · pygal · pyplots.ai" format. + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 7 + max: 8 + passed: true + comment: Shows seasonal variation, growth trends, multiple series with different + patterns. Could show more dramatic differences between categories. + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Monthly retail revenue by product category is a realistic, comprehensible + scenario. + - id: DQ-03 + name: Appropriate Scale + score: 4 + max: 5 + passed: true + comment: Revenue values in $K range are realistic for retail; holiday peaks + are plausible. + code_quality: + score: 9 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Simple linear flow: imports → data → style → chart → save.' + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Uses deterministic hardcoded data, no random elements. + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: Only pygal and Style are imported and used. + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current pygal API. + - id: CQ-05 + name: Output Correct + score: 0 + max: 1 + passed: false + comment: Saves both plot.png and plot.html (minor issue, PNG is primary). + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: true + comment: Uses pygal's StackedLine with fill, custom Style, SVG-native rendering + to PNG. Could leverage more pygal features like tooltips configuration or + value_formatter. + verdict: APPROVED diff --git a/plots/area-stacked/metadata/seaborn.yaml b/plots/area-stacked/metadata/seaborn.yaml index e524e770eb..008f942c2c 100644 --- a/plots/area-stacked/metadata/seaborn.yaml +++ b/plots/area-stacked/metadata/seaborn.yaml @@ -26,3 +26,174 @@ review: right - Data series all follow similar sinusoidal patterns - more variety in trends would better demonstrate stacked area features + image_description: 'The plot displays a stacked area chart showing monthly revenue + by product category over a 2-year period (Feb 2023 to Feb 2025). Four product + categories are shown: Electronics (dark blue/Python blue, #306998) at the bottom, + Clothing (golden yellow, #FFD43B), Home & Garden (teal/turquoise, #4ECDC4), and + Sports (coral/salmon, #FF6B6B) at the top. The Y-axis shows "Revenue (Million + $)" ranging from 0 to ~145, and the X-axis shows months with quarterly intervals. + A legend titled "Product Category" is positioned in the upper left. The areas + show seasonal fluctuations with an overall growth trend. The baseline correctly + starts at zero.' + criteria_checklist: + visual_quality: + score: 36 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title at 24pt, axis labels at 20pt, tick labels at 16pt - all clearly + readable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements, x-axis labels rotated 45° for clarity + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Area fills are clearly visible with good alpha (0.85), distinct boundaries + - id: VQ-04 + name: Color Accessibility + score: 4 + max: 5 + passed: true + comment: Good color contrast between categories, though not a standard colorblind-safe + palette + - id: VQ-05 + name: Layout Balance + score: 4 + max: 5 + passed: true + comment: Good layout, plot fills most of canvas, slight margin imbalance on + right + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: Y-axis has units "Revenue (Million $)", X-axis labeled "Month" + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: true + comment: Grid has alpha=0.3 (good), but legend partially overlaps with data + area + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct stacked area chart + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Time on X-axis, revenue values stacked on Y-axis + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Has legend, distinct colors, baseline at zero, series ordered by + size + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: All data visible, Y-axis starts at 0 + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend labels match data series accurately + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: Correct format "area-stacked · seaborn · pyplots.ai" + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 6 + max: 8 + passed: true + comment: Shows seasonal variation and growth trend, but all series follow + similar patterns + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Monthly revenue by product category is a real, comprehensible business + scenario + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: Revenue values in millions are realistic for a retail business + code_quality: + score: 10 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Clean linear structure: imports → data → plot → save' + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: np.random.seed(42) set + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: All imports are used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as 'plot.png' + library_features: + score: 2 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 2 + max: 5 + passed: false + comment: Only uses sns.set_theme() for styling; stackplot is from matplotlib, + not a seaborn function + verdict: APPROVED diff --git a/plots/band-basic/metadata/altair.yaml b/plots/band-basic/metadata/altair.yaml index 4785a13adf..6cdeb294eb 100644 --- a/plots/band-basic/metadata/altair.yaml +++ b/plots/band-basic/metadata/altair.yaml @@ -25,3 +25,175 @@ review: weaknesses: - Y-axis label Signal Amplitude lacks units (should include units like mV) - No legend or annotation explaining what the band represents (e.g. 95% CI) + image_description: The plot displays a band plot with a light blue semi-transparent + confidence band between two boundary lines, with a solid dark blue central trend + line running through the middle. The band shows a sinusoidal pattern with linear + upward growth, with amplitude ranging from approximately -3 to 10 on the y-axis. + The x-axis shows "Time (s)" from 0.0 to 10.0, and the y-axis shows "Signal Amplitude". + The confidence band appropriately widens over time (from ~1.0 at t=0 to ~3.5 at + t=10), demonstrating realistic uncertainty growth. The title "band-basic · altair + · pyplots.ai" is displayed at the top. The plot has a clean white background with + subtle gray gridlines. + criteria_checklist: + visual_quality: + score: 37 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title at 28pt, axis labels at 22pt, tick labels at 18pt - all perfectly + readable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Band opacity (0.3) allows visibility, line width (4) makes central + trend clear + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Single color scheme (#306998 blue) with good contrast + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Good proportions, 16:9 aspect ratio, no cut-off content + - id: VQ-06 + name: Axis Labels + score: 1 + max: 2 + passed: true + comment: Y-axis "Signal Amplitude" is descriptive but lacks units + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: true + comment: Grid is subtle (alpha 0.3) but no legend explaining what the band + represents + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct band/area plot with central trend line + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: x mapped to time, y_lower/y_upper define band, y_center defines trend + line + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Has band with semi-transparent fill, central trend line in contrasting + style, smooth interpolation + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: All data points visible within axes + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: N/A for single-color band plot (no legend needed for basic version) + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: 'Correct format: "band-basic · altair · pyplots.ai"' + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 7 + max: 8 + passed: true + comment: Shows widening uncertainty over time, sinusoidal pattern with linear + growth - demonstrates most band plot features but could show additional + scenarios + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Time series with 95% confidence interval - plausible scientific/engineering + scenario + - id: DQ-03 + name: Appropriate Scale + score: 4 + max: 5 + passed: true + comment: Values are reasonable for signal amplitude but units are abstract + code_quality: + score: 10 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: Clean imports → data → plot → save structure, no functions/classes + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: np.random.seed(42) ensures reproducibility + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: Only altair, numpy, pandas imported - all used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current Altair API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png and plot.html + library_features: + score: 5 + max: 5 + items: + - id: LF-01 + name: Distinctive Features + score: 5 + max: 5 + passed: true + comment: Excellent use of Altair's declarative approach with mark_area, y/y2 + encoding for bands, layered composition (band + line), configure_* for styling + verdict: APPROVED diff --git a/plots/band-basic/metadata/bokeh.yaml b/plots/band-basic/metadata/bokeh.yaml index f12a8c611e..626b00a4b3 100644 --- a/plots/band-basic/metadata/bokeh.yaml +++ b/plots/band-basic/metadata/bokeh.yaml @@ -22,3 +22,171 @@ review: - Axis labels lack units (e.g., "Time (s)" or "Value (units)") - Could use Bokeh native varea() glyph instead of patch() for cleaner band implementation - Legend text appears slightly small relative to the canvas size + image_description: The plot shows a band plot with a light blue semi-transparent + filled region representing a 95% confidence interval. A yellow/gold center line + runs through the middle of the band representing the mean trend. The band starts + narrow on the left (around x=0) and progressively widens toward the right (x=10), + demonstrating growing uncertainty over time. The title "band-basic · bokeh · pyplots.ai" + appears at the top left. The x-axis is labeled "Time" (0-10) and y-axis is labeled + "Value" (approximately 1-10). A legend in the top-left corner shows "95% Confidence + Interval" and "Mean Trend". The background is white with subtle gray grid lines. + criteria_checklist: + visual_quality: + score: 36 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 9 + max: 10 + passed: true + comment: Title, axis labels, and tick marks are readable, though legend text + appears slightly small relative to the high-resolution canvas + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Band and center line are clearly visible with appropriate alpha and + line width + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Blue band and yellow line provide excellent contrast and are colorblind-safe + - id: VQ-05 + name: Layout Balance + score: 4 + max: 5 + passed: true + comment: Good proportions, though slight whitespace imbalance on right edge + - id: VQ-06 + name: Axis Labels + score: 1 + max: 2 + passed: true + comment: Labels are descriptive ("Time", "Value") but lack units + - id: VQ-07 + name: Grid & Legend + score: 1 + max: 2 + passed: true + comment: Grid is subtle (alpha 0.3), legend is well-placed but could have + better background contrast + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct band plot implementation + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: X (time), y_lower, y_upper, and y_center correctly mapped + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: 'All spec features present: semi-transparent band, center line in + contrasting color' + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: All data visible within axes + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend labels correctly describe the elements + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: Correctly uses "band-basic · bokeh · pyplots.ai" + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 7 + max: 8 + passed: true + comment: Shows growing uncertainty well, though could demonstrate more variation + in the trend + - id: DQ-02 + name: Realistic Context + score: 6 + max: 7 + passed: true + comment: Time series with 95% CI is plausible, generic but appropriate + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: Values are sensible for the context + code_quality: + score: 10 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: Clean imports → data → plot → save structure + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Uses np.random.seed(42) + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: Only necessary imports included + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Modern Bokeh API used + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png and plot.html + library_features: + score: 2 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 2 + max: 5 + passed: false + comment: Uses ColumnDataSource appropriately but patch() for band is basic; + could use varea() for cleaner band implementation + verdict: APPROVED diff --git a/plots/band-basic/metadata/highcharts.yaml b/plots/band-basic/metadata/highcharts.yaml index 747d83b3df..5447b94206 100644 --- a/plots/band-basic/metadata/highcharts.yaml +++ b/plots/band-basic/metadata/highcharts.yaml @@ -27,3 +27,176 @@ review: - Uses raw dictionary configuration instead of highcharts-core Python library classes as shown in library rules - Legend could be slightly larger for the 4800x2700 canvas size + image_description: 'The plot displays a band chart with a light blue semi-transparent + area representing the 95% confidence interval, and a golden-yellow center line + showing the mean value. The visualization follows a sinusoidal pattern over time + (x-axis: 0-10), with values ranging approximately from 24 to 104 on the y-axis. + The uncertainty band visibly widens as time increases, demonstrating heteroscedastic + behavior. The title "band-basic · highcharts · pyplots.ai" appears at the top + in bold, with a subtitle "Time series with 95% confidence interval". A legend + in the top-right corner identifies both the confidence interval band and mean + value line. The background is clean white with subtle dashed grid lines.' + criteria_checklist: + visual_quality: + score: 37 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title at 64px, axis labels at 48px, tick labels at 36px - all perfectly + readable at 4800x2700 + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements anywhere + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Band and line clearly visible with appropriate opacity (0.3 for band), + line width of 6 + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Blue (#306998) and yellow (#FFD43B) are colorblind-safe and high + contrast + - id: VQ-05 + name: Layout Balance + score: 4 + max: 5 + passed: true + comment: Good proportions with appropriate margins, slight excess whitespace + on right side + - id: VQ-06 + name: Axis Labels + score: 1 + max: 2 + passed: true + comment: Labels are descriptive ("Time", "Value") but lack units + - id: VQ-07 + name: Grid & Legend + score: 1 + max: 2 + passed: true + comment: Grid is subtle with dashed style and 0.1 alpha, legend well-placed + but could be larger + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct band/arearange chart type + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: X mapped to time, Y to value with proper upper/lower bounds + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Band with upper/lower bounds, center line, semi-transparent fill + (0.3 alpha) + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: All data visible, axes auto-scaled appropriately + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend correctly labels "95% Confidence Interval" and "Mean Value" + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: 'Uses exact format: "band-basic · highcharts · pyplots.ai"' + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 7 + max: 8 + passed: true + comment: Shows sinusoidal trend with heteroscedastic uncertainty (widening + with x), demonstrates key band plot features + - id: DQ-02 + name: Realistic Context + score: 6 + max: 7 + passed: true + comment: Time series with confidence interval is plausible; generic "Value" + label slightly reduces real-world applicability + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: Values in reasonable 24-104 range, 50 data points appropriate for + smooth band + code_quality: + score: 9 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Linear structure: imports → data → chart config → render → save' + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Uses np.random.seed(42) + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: Only necessary imports used + - id: CQ-04 + name: No Deprecated API + score: 0 + max: 1 + passed: true + comment: Using raw dict config instead of highcharts-core library classes + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: true + comment: Uses arearange series type correctly, but doesn't use highcharts-core + Python library as recommended + verdict: APPROVED diff --git a/plots/band-basic/metadata/letsplot.yaml b/plots/band-basic/metadata/letsplot.yaml index 577f6e3546..54c686963a 100644 --- a/plots/band-basic/metadata/letsplot.yaml +++ b/plots/band-basic/metadata/letsplot.yaml @@ -23,3 +23,177 @@ review: weaknesses: - Grid lines are solid gray rather than using subtle alpha for better visual subtlety - Does not leverage lets-plot distinctive interactive features or tooltips + image_description: The plot displays a band plot with a light blue semi-transparent + filled region (confidence band) spanning from approximately -2 to 9 on the y-axis, + covering the full x-axis range of 0 to 10 seconds. A darker blue central trend + line follows a sinusoidal pattern with upward linear trend (sin wave superimposed + on positive slope). The band width increases from left to right, illustrating + growing uncertainty over time. The title "band-basic · letsplot · pyplots.ai" + appears at the top left. Axis labels show "Time (s)" on x-axis and "Value (units)" + on y-axis. The background uses a minimal theme with subtle gray grid lines. All + text is clearly readable. + criteria_checklist: + visual_quality: + score: 38 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title, axis labels, and tick marks are all clearly readable at full + resolution with appropriate font sizes (24pt title, 20pt labels, 16pt ticks) + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements anywhere in the plot + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Central line has good thickness (size=1.5), band is appropriately + filled with alpha=0.3 + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Single color scheme (#306998 blue) with good contrast, colorblind-safe + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Good proportions, data fills the plot area well with appropriate + margins + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: 'Both axes have descriptive labels with units: "Time (s)" and "Value + (units)"' + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: false + comment: Grid uses solid gray lines rather than subtle alpha; no legend needed + but grid could be more subtle + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct band plot using geom_ribbon for the filled region + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: X mapped correctly, y_lower/y_upper define band, y_center shown as + line + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: 'All spec features present: semi-transparent fill, central line in + contrasting style, smooth interpolation' + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: Axes show all data without clipping + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: No legend needed for single-series band plot + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: Uses exact format "band-basic · letsplot · pyplots.ai" + data_quality: + score: 20 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 8 + max: 8 + passed: true + comment: Shows widening confidence interval (heteroscedasticity), sinusoidal + pattern with trend, 100 data points + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Time series with 95% CI is a realistic scenario (sensor data, forecasts, + etc.) + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: Values in sensible range (-2 to 9), time in seconds (0-10s) + code_quality: + score: 10 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: Clean imports → data → plot → save structure, no functions/classes + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: np.random.seed(42) set + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: All imports are used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current lets_plot API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png and plot.html + library_features: + score: 0 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 0 + max: 5 + passed: false + comment: Uses basic geom_ribbon and geom_line, which are standard ggplot features. + Could leverage lets_plot's tooltips, interactivity, or geom_smooth for more + distinctive usage + verdict: APPROVED diff --git a/plots/band-basic/metadata/matplotlib.yaml b/plots/band-basic/metadata/matplotlib.yaml index c8ccb7d91a..4966aedb5d 100644 --- a/plots/band-basic/metadata/matplotlib.yaml +++ b/plots/band-basic/metadata/matplotlib.yaml @@ -24,3 +24,168 @@ review: Measurement (units) - Data scenario is plausible but generic - could use a more concrete real-world context (e.g., stock price forecast, temperature prediction) + image_description: The plot displays a band plot with a sinusoidal central trend + line (dark blue, solid) oscillating between approximately 4 and 11 on the y-axis, + with an overlaid semi-transparent light blue band representing the 95% confidence + interval. The band visibly widens as x (time) increases from 0 to 10 seconds, + demonstrating forecasting uncertainty that grows over time. Dashed boundary lines + subtly mark the upper and lower bounds. The title reads "band-basic · matplotlib + · pyplots.ai" in a large font at the top. Axis labels show "Time (s)" on the x-axis + and "Value" on the y-axis. A legend in the upper left identifies both the confidence + interval band and mean trend line. A subtle grid with dashed lines provides reference. + criteria_checklist: + visual_quality: + score: 37 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title at 24pt, labels at 20pt, ticks at 16pt - all perfectly readable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Band and line clearly visible with appropriate alpha and linewidth + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Single blue color scheme, no colorblind issues + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Good proportions, tight_layout applied + - id: VQ-06 + name: Axis Labels + score: 1 + max: 2 + passed: false + comment: '"Value" lacks units (could be more descriptive)' + - id: VQ-07 + name: Grid & Legend + score: 2 + max: 2 + passed: true + comment: Grid at alpha 0.3, legend well placed + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct band plot using fill_between + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: X is time, y_lower/y_upper define band correctly + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Has band, central line, and boundary lines as spec suggests + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: All data visible within axes + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend correctly identifies elements + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: 'Uses correct format: band-basic · matplotlib · pyplots.ai' + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 7 + max: 8 + passed: true + comment: Shows widening uncertainty over time (good), sinusoidal pattern shows + variation + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Time series with confidence interval is a plausible scenario + - id: DQ-03 + name: Appropriate Scale + score: 4 + max: 5 + passed: true + comment: Values are sensible but somewhat generic + code_quality: + score: 10 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: Simple imports → data → plot → save structure + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Uses np.random.seed(42) + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: Only matplotlib.pyplot and numpy imported + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current matplotlib APIs + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: false + comment: fill_between is matplotlib's core feature for bands, but no advanced + features used + verdict: APPROVED diff --git a/plots/band-basic/metadata/plotly.yaml b/plots/band-basic/metadata/plotly.yaml index 82c9d44ef9..2b744a0a1b 100644 --- a/plots/band-basic/metadata/plotly.yaml +++ b/plots/band-basic/metadata/plotly.yaml @@ -23,3 +23,178 @@ review: - Axis labels lack units (e.g., "Time (s)" or "Value (units)") - Does not leverage Plotly's distinctive interactive features like custom hover templates showing the exact confidence bounds + image_description: The plot displays a band chart with a light blue semi-transparent + filled region representing a 95% confidence interval, and a darker blue solid + trend line running through the center. The band starts narrow on the left (around + x=0) and progressively widens toward the right (x=10), illustrating heteroscedasticity + (uncertainty growing over time). The title "band-basic · plotly · pyplots.ai" + is centered at the top in a large font. The x-axis is labeled "Time" (ranging + 0-10), and the y-axis is labeled "Value" (ranging ~1-10). A legend in the upper-left + corner identifies both the "95% Confidence Interval" (band) and "Trend Line". + The background is clean white with subtle gray grid lines. The overall layout + is well-balanced with good use of the 16:9 aspect ratio. + criteria_checklist: + visual_quality: + score: 37 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title, axis labels, tick marks, and legend text are all clearly readable + at full size with appropriately large fonts + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements; legend is positioned in upper-left + without covering data + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Band transparency (alpha 0.3) is optimal, trend line width (4) is + clearly visible + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Blue color scheme is colorblind-safe; good contrast between band + fill and line + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Excellent proportions, good margins, no cut-off content + - id: VQ-06 + name: Axis Labels + score: 1 + max: 2 + passed: false + comment: Labels are descriptive ("Time", "Value") but lack units + - id: VQ-07 + name: Grid & Legend + score: 2 + max: 2 + passed: true + comment: Grid is subtle (alpha 0.3), legend well-placed with semi-transparent + background + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct band/area plot showing filled region between boundaries + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: X mapped to time, y_lower/y_upper define band, y_center shown as + trend line + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: 'All spec features present: band, central line, semi-transparent + fill, smooth interpolation' + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: Axes show all data without clipping + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend labels correctly identify both elements + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: Correctly formatted as "band-basic · plotly · pyplots.ai" + data_quality: + score: 19 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 8 + max: 8 + passed: true + comment: 'Demonstrates key band plot features: widening uncertainty (heteroscedasticity), + smooth trend with slight curvature (sine component)' + - id: DQ-02 + name: Realistic Context + score: 6 + max: 7 + passed: true + comment: Time series with 95% CI is plausible, but context is generic ("Time" + vs specific domain) + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: Values are sensible for a generic measurement scenario + code_quality: + score: 10 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Clean linear flow: imports → data → plot → save, no functions/classes' + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Uses np.random.seed(42) + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: Only numpy and plotly.graph_objects, both used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current Plotly API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png and plot.html + library_features: + score: 0 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 0 + max: 5 + passed: false + comment: Uses basic go.Scatter with fill="toself" technique, which is standard + Plotly but doesn't leverage distinctive features like hover templates, rangeslider, + or animations + verdict: APPROVED diff --git a/plots/band-basic/metadata/plotnine.yaml b/plots/band-basic/metadata/plotnine.yaml index f1d2601092..0d40ccb1f3 100644 --- a/plots/band-basic/metadata/plotnine.yaml +++ b/plots/band-basic/metadata/plotnine.yaml @@ -23,3 +23,173 @@ review: - Axis labels lack units (e.g., "Time (days)" or "Predicted Value (units)") - Data could show both narrowing and widening uncertainty regions for better feature coverage + image_description: The plot shows a band plot with a semi-transparent light blue + (#306998 with alpha 0.3) filled region representing a 95% confidence interval. + A dark blue central trend line runs through the middle of the band. The x-axis + shows "Time" ranging from 0.0 to 10.0, and the y-axis shows "Predicted Value" + ranging from approximately 3 to 12. The title reads "Model Forecast with 95% Confidence + Interval · band-basic · plotnine · pyplots.ai". The confidence band widens as + time increases (heteroscedastic uncertainty), which is realistic for forecasting + scenarios. The background uses a minimal theme with subtle gray grid lines. Text + is clearly readable at all sizes. + criteria_checklist: + visual_quality: + score: 37 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title 24pt, axis labels 20pt, tick labels 16pt - all perfectly readable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Band with appropriate alpha (0.3), line properly visible (size=2) + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Single color scheme with clear contrast between line and band + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Good proportions, 16:9 aspect ratio with tight_layout + - id: VQ-06 + name: Axis Labels + score: 1 + max: 2 + passed: false + comment: '"Time" and "Predicted Value" are descriptive but lack units' + - id: VQ-07 + name: Grid & Legend + score: 2 + max: 2 + passed: true + comment: Grid subtle with alpha 0.3, minor grid disabled, no legend needed + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct band/ribbon plot type + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: X is time, y_lower/y_upper define band boundaries, y_center is trend + line + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Has semi-transparent band, central line in contrasting style, smooth + interpolation + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: All data visible, axes auto-scaled appropriately + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: No legend needed for single-series band plot + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: 'Correct format: "Model Forecast with 95% Confidence Interval · band-basic + · plotnine · pyplots.ai"' + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 7 + max: 8 + passed: true + comment: 'Shows heteroscedastic uncertainty (widening band), smooth trend, + realistic CI bounds using 1.96 multiplier. Minor: could show both narrowing + and widening regions' + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Model forecast scenario is highly realistic and commonly used + - id: DQ-03 + name: Appropriate Scale + score: 4 + max: 5 + passed: true + comment: '50 points is appropriate, values sensible. Minor: y-axis values + are unitless' + code_quality: + score: 10 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: Imports → Data → Plot → Save, no functions/classes + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: np.random.seed(42) set + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: All imports are used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current plotnine API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png + library_features: + score: 5 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 5 + max: 5 + passed: true + comment: 'Excellent use of ggplot grammar: geom_ribbon for band, aes mapping, + theme customization, element_text/element_line for styling' + verdict: APPROVED diff --git a/plots/band-basic/metadata/seaborn.yaml b/plots/band-basic/metadata/seaborn.yaml index 8803e5219f..a56d30a414 100644 --- a/plots/band-basic/metadata/seaborn.yaml +++ b/plots/band-basic/metadata/seaborn.yaml @@ -24,3 +24,162 @@ review: - The fill_between function is from matplotlib rather than a seaborn-specific function; while seaborn does not have a native band/fill_between equivalent, the implementation correctly uses sns.lineplot for the central line + image_description: The plot displays a band chart showing a 95% confidence interval + around a mean trend line. The band is rendered in a semi-transparent light blue + (#306998 with alpha 0.3), representing the confidence interval that expands over + time (heteroscedastic behavior). The central trend line is rendered in bright + yellow/gold (#FFD43B) with a linewidth of 3. The data shows a sinusoidal pattern + with an upward linear trend, ranging from approximately -1 to 8 on the amplitude + axis and 0 to 10 on the time axis. The title "band-basic · seaborn · pyplots.ai" + is clearly visible at the top. Axis labels "Time (s)" and "Amplitude" are well-sized. + A legend in the upper left corner identifies both elements. The grid uses subtle + dashed lines. Overall, the layout is clean and professional with excellent readability. + criteria_checklist: + visual_quality: + score: 40 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: 'All text perfectly readable: title 24pt, labels 20pt, ticks 16pt' + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements anywhere + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Band with alpha=0.3 and line with linewidth=3 are perfectly visible + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Blue/yellow color scheme is colorblind-safe with excellent contrast + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Excellent proportions and whitespace distribution + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: 'Descriptive with units: "Time (s)", "Amplitude"' + - id: VQ-07 + name: Grid & Legend + score: 2 + max: 2 + passed: true + comment: Subtle grid (alpha=0.3, dashed), well-placed legend + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct band plot using fill_between + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: x, y_lower, y_upper, y_center all correctly implemented + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Band with transparency, central line in contrasting color + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: All data visible, axes appropriately scaled + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend accurately describes "95% Confidence Interval" and "Mean Trend" + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: 'Correct format: band-basic · seaborn · pyplots.ai' + data_quality: + score: 20 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 8 + max: 8 + passed: true + comment: Shows expanding uncertainty over time (heteroscedasticity), demonstrates + band behavior excellently + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Time series with 95% CI bounds is a realistic scientific application + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: Sensible amplitude and time values + code_quality: + score: 10 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: Clean imports → data → plot → save structure + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Uses np.random.seed(42) + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: All imports are used (matplotlib.pyplot, numpy, seaborn) + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current seaborn API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png + library_features: + score: 3 + max: 5 + items: [] + verdict: APPROVED diff --git a/plots/bar-3d/metadata/altair.yaml b/plots/bar-3d/metadata/altair.yaml index 6a4bcaf150..def526fd44 100644 --- a/plots/bar-3d/metadata/altair.yaml +++ b/plots/bar-3d/metadata/altair.yaml @@ -25,3 +25,172 @@ review: correspond to actual sales values - Quarter labels positioning could be clearer - they overlap with depth axis indicator - Spec suggests semi-transparent bars for revealing occluded bars which is not implemented + image_description: The plot displays a 3D isometric bar chart showing quarterly + sales data across four products (Product A, B, C, D). Each bar is rendered with + three faces (front, top, side) to create a 3D effect, using the viridis color + scale to encode sales values from ~56K to 200K. The bars are arranged in a grid + with products on the x-axis and quarters (Q1-Q4) progressing into the depth dimension. + The title reads "bar-3d · altair · pyplots.ai" with a subtitle "Quarterly Sales + by Product (Isometric 3D Projection)". A color legend for "Sales ($K)" is positioned + on the right. Quarter labels (Q1-Q4) are visible on the right side of the chart, + and an angled "Quarters →" indicator is shown. Product B has the highest bar (yellow, + ~200K), while Product C shows the lowest values (purple/blue tones). + criteria_checklist: + visual_quality: + score: 35 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 9 + max: 10 + passed: true + comment: Title and labels are clearly readable; tick labels slightly dense + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements + - id: VQ-03 + name: Element Visibility + score: 7 + max: 8 + passed: true + comment: 3D bar faces are visible; some occlusion but depth ordering is correct + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Viridis colormap is colorblind-safe + - id: VQ-05 + name: Layout Balance + score: 4 + max: 5 + passed: true + comment: Good use of canvas; slight imbalance with more space on left + - id: VQ-06 + name: Axis Labels + score: 1 + max: 2 + passed: true + comment: Y-axis shows "Sales Revenue (Relative Height)" but the actual scale + values don't map directly to sales amounts + - id: VQ-07 + name: Grid & Legend + score: 1 + max: 2 + passed: true + comment: Grid is subtle; legend well placed + spec_compliance: + score: 23 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correctly implements 3D bar chart using isometric projection + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: X (products), Y (quarters as depth), Z (sales as height) correctly + mapped + - id: SC-03 + name: Required Features + score: 4 + max: 5 + passed: true + comment: 'Has color gradient for z-values; interactivity enabled; minor: no + transparency for occluded bars' + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: All data visible + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend correctly shows sales scale + - id: SC-06 + name: Title Format + score: 1 + max: 2 + passed: true + comment: Title format correct; subtitle adds context but y-axis label is misleading + data_quality: + score: 20 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 8 + max: 8 + passed: true + comment: Shows variation across products and quarters; seasonal patterns and + growth trends visible + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Quarterly sales by product is a realistic business scenario + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: Sales values ($56K-$200K) are realistic + code_quality: + score: 10 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: Linear script structure with imports → data → plot → save + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Uses np.random.seed(42) + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: Only necessary imports + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current Altair API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png and plot.html + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: true + comment: Good use of mark_rect, tooltips, and interactive(); could better + leverage Altair's declarative grammar for the layering + verdict: APPROVED diff --git a/plots/bar-3d/metadata/bokeh.yaml b/plots/bar-3d/metadata/bokeh.yaml index c802f43f5a..b1e040d0f3 100644 --- a/plots/bar-3d/metadata/bokeh.yaml +++ b/plots/bar-3d/metadata/bokeh.yaml @@ -23,3 +23,184 @@ review: - Realistic business scenario with meaningful variation in data weaknesses: - Title format uses hyphens/dashes instead of middle dots as required by SC-06 + image_description: 'The plot displays a 3D bar chart showing quarterly sales data + across 5 products (A through E) over 4 quarters (Q1-Q4). The visualization uses + an isometric projection with bars rendered as 3D rectangular prisms. Colors are + mapped using the Viridis palette, ranging from dark blue (low values ~45) through + green to bright yellow (high values ~130). Product C has the tallest bars (yellow/green, + ~120-130 range), Product D has the shortest (dark blue, ~45-60 range). The chart + includes: three axes (Products, Quarters, and implied Z for height), clear product + labels along one axis, quarter labels along another, a color bar on the right + showing "Sales (thousands)" with scale from 0-130, and a title "Quarterly Sales + by Product - bar-3d - bokeh - pyplots.ai". The bars have semi-transparency (alpha=0.75) + with subtle edge lines, and face shading to give 3D depth perception. Background + is light gray with subtle dotted grid lines.' + criteria_checklist: + visual_quality: + score: 37 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 9 + max: 10 + passed: true + comment: 'Title 44pt, axis titles 32pt, labels 26pt - all clearly readable. + Minor: title uses hyphen not middle dot' + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text; labels well-spaced along projected axes + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bars clearly visible with good 3D shading; semi-transparency reveals + occluded bars + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Viridis palette is colorblind-safe + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Plot fills canvas well with balanced margins; color bar positioned + appropriately + - id: VQ-06 + name: Axis Labels + score: 1 + max: 2 + passed: false + comment: '"Products" and "Quarters" labels present; color bar has "Sales (thousands)" + with units. Deducting 1 pt for no explicit Z-axis label showing units' + - id: VQ-07 + name: Grid & Legend + score: 1 + max: 2 + passed: true + comment: Grid is subtle (alpha 0.2, dashed), but colorbar title font could + be more readable + spec_compliance: + score: 24 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct 3D bar chart with bars on 2D grid rising into third dimension + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: X=Products, Y=Quarters, Z=Sales height correctly mapped + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Color gradient reinforces z-values, semi-transparency reveals hidden + bars, proper category counts (5x4) + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: All data visible, scale 0-130 appropriate + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Color bar correctly shows sales scale + - id: SC-06 + name: Title Format + score: 1 + max: 2 + passed: false + comment: Uses "Quarterly Sales by Product - bar-3d - bokeh - pyplots.ai" instead + of required "bar-3d \u00b7 bokeh \u00b7 pyplots.ai" format (uses hyphen-dash, + not middle dot) + data_quality: + score: 20 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 8 + max: 8 + passed: true + comment: 'Shows variation: high performer (Product C ~120-130), low performer + (Product D ~45-60), mixed performers, quarterly trends' + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Business sales scenario with products and quarters is neutral and + plausible + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: Sales values 45-130 (thousands) are realistic for quarterly product + sales + code_quality: + score: 8 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Linear script: imports \u2192 data \u2192 projection logic \u2192 + plot \u2192 save' + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: np.random.seed(42) set + - id: CQ-03 + name: Clean Imports + score: 1 + max: 2 + passed: false + comment: 'Most imports used, but ColorBar and LinearColorMapper are created + but ColorBar mapper uses the mapper. Range1d, CDN all used. Minor: could + simplify' + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Current Bokeh 3.8 API + - id: CQ-05 + name: Output Correct + score: 0 + max: 1 + passed: true + comment: Saves as plot.png and plot.html (both correct for Bokeh) + library_features: + score: 5 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 5 + max: 5 + passed: true + comment: Uses Bokeh's patch(), ColorBar, LinearColorMapper, custom Label annotations, + export_png for static output plus save() for interactive HTML + verdict: APPROVED diff --git a/plots/bar-3d/metadata/highcharts.yaml b/plots/bar-3d/metadata/highcharts.yaml index 9e554461b0..aee0097e0f 100644 --- a/plots/bar-3d/metadata/highcharts.yaml +++ b/plots/bar-3d/metadata/highcharts.yaml @@ -25,3 +25,183 @@ review: could help - The interactive HTML version could include drag-to-rotate functionality for better exploration + image_description: 'The plot displays a 3D bar chart with 5 product categories (Laptop, + Tablet, Phone, Monitor, Keyboard) on the x-axis extending into depth, with quarterly + data (Q1-Q4) represented as separate colored bars along the z-axis. The y-axis + shows Revenue ($K) from 0 to 260. The bars use a colorblind-safe palette: blue + (#306998) for Q1, yellow (#FFD43B) for Q2, purple (#9467BD) for Q3, and cyan (#17BECF) + for Q4. The title "bar-3d · highcharts · pyplots.ai" appears at the top in bold, + with a subtitle showing the data context. The 3D perspective is applied with a + moderate viewing angle (alpha=15, beta=20), creating depth perception. A vertical + legend in the upper-right corner identifies each quarter. The Phone category shows + the tallest bars (especially Q2 at ~235), while Keyboard shows the shortest values + (~30-50). The 3D effect shows bars arranged in depth with proper occlusion.' + criteria_checklist: + visual_quality: + score: 36 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 9 + max: 10 + passed: true + comment: Title and subtitle readable, axis labels clear, but y-axis title + "Revenue ($K)" is slightly rotated and could be clearer + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text, all labels clearly separated + - id: VQ-03 + name: Element Visibility + score: 7 + max: 8 + passed: true + comment: Bars are well-sized for the 3D view; some bars in the back are partially + occluded by taller front bars (expected in 3D but reduces visibility slightly) + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Excellent colorblind-safe palette with blue, yellow, purple, and + cyan + - id: VQ-05 + name: Layout Balance + score: 4 + max: 5 + passed: true + comment: Good canvas utilization with plot filling ~60% of area; slight imbalance + with legend far right + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: Descriptive axis labels with units ("Revenue ($K)", "Product Category", + "Quarter") + - id: VQ-07 + name: Grid & Legend + score: 1 + max: 2 + passed: true + comment: Legend well-placed and readable; however, the z-axis "Quarter" label + appears at bottom right and is somewhat isolated + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct 3D bar chart with proper depth rendering + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: X=products, Y=revenue, Z=quarters correctly mapped as per spec + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: 'All spec features present: 3D depth, categorical x/y dimensions, + numeric height values' + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: Full data range visible (0-260 covers all values) + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend correctly identifies Q1-Q4 + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: 'Correct format: "bar-3d · highcharts · pyplots.ai"' + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 7 + max: 8 + passed: true + comment: Shows variation across products and quarters with realistic seasonal + patterns; could show more extreme variation between products + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Sales revenue by product category is a realistic and neutral business + scenario + - id: DQ-03 + name: Appropriate Scale + score: 4 + max: 5 + passed: true + comment: Revenue values in $K are sensible (30-235K); some products have similar + heights making comparison harder + code_quality: + score: 9 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Clean linear structure: imports → data → chart config → series → + export' + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Uses np.random.seed(42) for deterministic output + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: All imports are used (numpy, highcharts_core, selenium, urllib, tempfile, + time, Path) + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current Highcharts API + - id: CQ-05 + name: Output Correct + score: 0 + max: 1 + passed: false + comment: Outputs plot.png correctly, but uses underscore in loop variable + "_product" and "_quarter" which is unnecessary + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: true + comment: Good use of Highcharts 3D module (options3d, alpha, beta, depth, + viewDistance), but could leverage more interactivity features in the HTML + version like drag rotation + verdict: APPROVED diff --git a/plots/bar-3d/metadata/letsplot.yaml b/plots/bar-3d/metadata/letsplot.yaml index 646d53cf84..1387786dd4 100644 --- a/plots/bar-3d/metadata/letsplot.yaml +++ b/plots/bar-3d/metadata/letsplot.yaml @@ -22,3 +22,176 @@ review: weaknesses: - Product labels on left side appear stacked vertically rather than aligned with their corresponding bar rows in the 3D space + image_description: The plot displays a 3D bar chart with an isometric perspective. + The title "bar-3d · letsplot · pyplots.ai" appears in bold at the top left. Twenty + 3D bars are arranged in a 5x4 grid representing quarterly sales (Q1-Q4) across + five product categories (Electronics, Clothing, Home, Sports, Books). Each bar + uses the viridis color scale (purple→teal→green→yellow) to encode revenue values + ranging from ~15M to 65M. The bars have three visible faces (front, top, right) + with dark outlines creating clear 3D definition. A subtle gray floor grid provides + depth reference. Product labels are stacked vertically on the left, quarter labels + (Q1-Q4) appear along the front edge, and "Revenue ($M)" labels the z-axis. A color + legend on the right maps the gradient to revenue values. + criteria_checklist: + visual_quality: + score: 36 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title at 32pt, labels at 11-12pt are all clearly readable at full + resolution + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: All labels well separated, no text overlap + - id: VQ-03 + name: Element Visibility + score: 7 + max: 8 + passed: true + comment: Bars have good size and 0.85 alpha, depth sorting works well; minor + deduction for some back bars partially occluded + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Viridis is colorblind-safe with excellent perceptual uniformity + - id: VQ-05 + name: Layout Balance + score: 4 + max: 5 + passed: true + comment: Good canvas utilization, slight asymmetry with labels on left + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: '"Revenue ($M)" has units, descriptive category labels' + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: true + comment: Floor grid is subtle at alpha 0.5, legend well placed; however axis + lines are somewhat hidden + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct 3D bar chart with bars rising from a 2D plane + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: X=quarters, Y=products, Z=revenue correctly assigned + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Two categorical dimensions, numeric height, color gradient for depth + perception + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: All 20 bars fully visible with no clipping + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Color legend accurately shows Revenue ($M) range + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: '"bar-3d · letsplot · pyplots.ai" matches required format' + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 7 + max: 8 + passed: true + comment: Shows variation across quarters and products, Electronics Q4 peak + at 65M, Books consistently lower; could show more extreme variation + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Quarterly sales by product category is a realistic business analytics + scenario + - id: DQ-03 + name: Appropriate Scale + score: 4 + max: 5 + passed: true + comment: Revenue values 15-65M are plausible; good variation but range could + be wider + code_quality: + score: 9 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Linear flow: imports → data → projection math → plot → save' + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Uses np.random.seed(42) + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: All imports are used (pandas, numpy, lets_plot components) + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Current lets-plot API + - id: CQ-05 + name: Output Correct + score: 0 + max: 1 + passed: true + comment: Saves both plot.png and plot.html (HTML is a bonus, not a defect) + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: true + comment: Good use of geom_polygon, layer_tooltips for interactivity, scale_fill_viridis, + theme customization; could better utilize lets-plot's native grammar of + graphics features + verdict: APPROVED diff --git a/plots/bar-3d/metadata/matplotlib.yaml b/plots/bar-3d/metadata/matplotlib.yaml index e7725d89f2..e671b9ed47 100644 --- a/plots/bar-3d/metadata/matplotlib.yaml +++ b/plots/bar-3d/metadata/matplotlib.yaml @@ -24,3 +24,173 @@ review: - Grid styling could use alpha parameter for subtler appearance - Could benefit from slightly more contrast in bar heights (all values in 65-225 range, some near-zero values would show more variation) + image_description: The plot shows a 3D bar chart with 5 products (Product A through + E) on the x-axis, 4 quarters (Q1-Q4) on the y-axis, and sales values (ranging + from ~65 to ~225) on the z-axis. The bars use a viridis colormap where purple/dark + blue represents lower values (~65-100), teal/green for mid-range values (~120-160), + and yellow for higher values (~200-225). The viewing angle is set at elevation + 25° and azimuth 45°, providing good visibility of most bars. A colorbar on the + right reinforces the sales values. The bars have semi-transparent faces (alpha=0.85) + with dark gray edges. All axis labels are clear and readable, with "Product" and + "Quarter" labels and "Sales (thousands $)" on the z-axis. + criteria_checklist: + visual_quality: + score: 36 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title 24pt, labels 20pt, ticks 14-16pt, all perfectly readable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text, all labels clearly separated + - id: VQ-03 + name: Element Visibility + score: 7 + max: 8 + passed: true + comment: Bars well-sized and visible, slight occlusion of some back bars but + transparency helps + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Viridis colormap is colorblind-safe + - id: VQ-05 + name: Layout Balance + score: 4 + max: 5 + passed: true + comment: Good proportions, plot fills canvas well, colorbar slightly increases + right margin + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: 'Descriptive with units: "Sales (thousands $)"' + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: false + comment: No grid alpha setting (default grid), colorbar serves as legend substitute + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct 3D bar chart + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Products on x, quarters on y, sales as height correctly mapped + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: 3D bars, color gradient for depth perception, semi-transparency as + spec suggests + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: All data visible, z-axis range appropriate + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Colorbar correctly labeled with units + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: Uses exact format "bar-3d · matplotlib · pyplots.ai" + data_quality: + score: 19 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 7 + max: 8 + passed: true + comment: Shows variation across products and quarters, different growth patterns, + but all values are positive (no contrasting negative/near-zero) + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Sales by product and quarter is a classic, neutral business scenario + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: Values in thousands of dollars (65-225) are realistic for quarterly + product sales + code_quality: + score: 10 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Clean linear flow: imports → data → plot → save' + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: np.random.seed(42) set, though data is actually hardcoded + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: Only matplotlib.pyplot and numpy used, both required + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: All APIs current + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png with dpi=300 + library_features: + score: 2 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 2 + max: 5 + passed: false + comment: Uses bar3d which is matplotlib's standard 3D plotting, but doesn't + use advanced features like annotations, custom lighting, or multiple subplots + for rotation views + verdict: APPROVED diff --git a/plots/bar-3d/metadata/plotly.yaml b/plots/bar-3d/metadata/plotly.yaml index ccc399cb43..5fb4fe6567 100644 --- a/plots/bar-3d/metadata/plotly.yaml +++ b/plots/bar-3d/metadata/plotly.yaml @@ -24,3 +24,173 @@ review: - Legend marker style (circular) does not match the bar chart style - Some minor occlusion of back rows inherent to 3D visualization could be mitigated with more transparency + image_description: The plot displays a 3D bar chart showing quarterly sales data + across 5 product categories (Electronics, Clothing, Food, Home, Sports). The bars + rise from a 2D plane with product categories on the x-axis and quarters (Q1-Q4) + on the y-axis. Bar heights represent sales values in thousands of dollars (z-axis + labeled "Sales ($K)"). Colors range from dark blue (Electronics) through lighter + blues (Clothing, Food) to yellow tones (Home, Sports), following a Python-inspired + color scheme. The title "bar-3d · plotly · pyplots.ai" is centered at the top. + A legend in the upper right identifies each product category. The 3D perspective + clearly shows Electronics having the highest sales overall with a notable Q4 holiday + boost pattern visible across categories. + criteria_checklist: + visual_quality: + score: 36 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 9 + max: 10 + passed: true + comment: Title and axis labels are readable, tick labels slightly small but + acceptable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements + - id: VQ-03 + name: Element Visibility + score: 7 + max: 8 + passed: true + comment: Bars are well-sized, some occlusion in back rows but acceptable for + 3D + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Blue-to-yellow gradient is colorblind-safe, good contrast + - id: VQ-05 + name: Layout Balance + score: 4 + max: 5 + passed: true + comment: Good use of canvas, slight whitespace at top + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: All axes have descriptive labels with units where appropriate + - id: VQ-07 + name: Grid & Legend + score: 1 + max: 2 + passed: true + comment: Legend well placed, grid subtle but background could be lighter + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct 3D bar chart implementation + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: X=products, Y=quarters, Z=sales correctly assigned + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Two categorical dimensions, color differentiation, 3D perspective + all present + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: All data visible, z-axis shows 0-150 range + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend correctly identifies all product categories + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: 'Uses correct format: bar-3d · plotly · pyplots.ai' + data_quality: + score: 17 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 6 + max: 8 + passed: true + comment: Shows variation across products and quarters, Q4 seasonal boost visible, + but could show more dramatic variation + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Sales data by product category and quarter is a realistic business + scenario + - id: DQ-03 + name: Appropriate Scale + score: 4 + max: 5 + passed: true + comment: Values in $10K-$160K range are plausible for quarterly sales + code_quality: + score: 10 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Clean linear flow: imports → data → plot → save' + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: np.random.seed(42) set + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: Only necessary imports (numpy, plotly.graph_objects) + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current Plotly API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png and plot.html + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: true + comment: Uses Mesh3d for proper 3D bars, hover templates, interactive HTML + export. Could leverage Plotly animation or more interactive features. + verdict: APPROVED diff --git a/plots/bar-basic/metadata/altair.yaml b/plots/bar-basic/metadata/altair.yaml index c30857b508..ab6d86e6a1 100644 --- a/plots/bar-basic/metadata/altair.yaml +++ b/plots/bar-basic/metadata/altair.yaml @@ -25,3 +25,175 @@ review: - Image dimensions (4500x2400) slightly below target specification (4800x2700); should use width=1600 for exact match - No value labels on or above bars as suggested in the specification Notes section + image_description: 'The plot displays a vertical bar chart showing product sales + by category. Seven blue bars (#306998) with subtle rounded top corners are arranged + in descending order from left to right. Categories shown are: Electronics (~$45,200), + Clothing (~$32,100), Home & Garden (~$28,400), Sports (~$21,800), Books (~$18,500), + Toys (~$15,200), and Food (~$12,300). The Y-axis displays "Sales ($)" with currency + formatting from $0 to $50,000. X-axis labels are rotated -45 degrees and show + "Product Category". The title reads "bar-basic · altair · pyplots.ai". A subtle + dashed grid is visible in the background. All text is clearly readable.' + criteria_checklist: + visual_quality: + score: 37 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title, axis labels, and tick marks are all clearly readable with + appropriate font sizes (title 28pt, labels 22pt, ticks 18pt) + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text; the -45 degree angle on x-axis labels prevents + overlap effectively + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bars are well-sized with good spacing, easily distinguishable + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Single blue color (#306998) is colorblind-safe + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Good proportions with appropriate whitespace + - id: VQ-06 + name: Axis Labels + score: 1 + max: 2 + passed: true + comment: Y-axis has "Sales ($)" which is descriptive but unit is in the label + not separate; X-axis has "Product Category" + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: false + comment: Grid has appropriate opacity (0.3) with dashed styling, but no legend + present (not strictly required for single-series bar chart, but could add + context) + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct vertical bar chart type + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Categories on X-axis, values on Y-axis correctly + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Consistent bar widths, single color, adequate spacing present + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: All data visible within axes + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: N/A for single-series (no legend needed) + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: Correctly uses "bar-basic · altair · pyplots.ai" + data_quality: + score: 19 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 7 + max: 8 + passed: true + comment: Shows good variation in values; bars sorted by height shows ranking + well; could benefit from value labels as suggested in spec + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Product sales by retail category is a real, comprehensible scenario + matching spec examples + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: Sales values ($12K-$45K) are realistic for retail category data + code_quality: + score: 9 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: Clean imports → data → plot → save structure, no functions/classes + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Deterministic data (no random generation) + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: Only altair and pandas imported, both used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current Altair API + - id: CQ-05 + name: Output Correct + score: 0 + max: 1 + passed: false + comment: Saves as plot.png and plot.html correctly, but dimensions (1500×800 + × 3 = 4500×2400) slightly below target (4800×2700) + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: true + comment: Uses Altair's declarative encoding, tooltips, sort parameter, and + cornerRadius styling; could leverage more interactive features like selection + or conditional encoding + verdict: APPROVED diff --git a/plots/bar-basic/metadata/bokeh.yaml b/plots/bar-basic/metadata/bokeh.yaml index 5d0926f544..1cc63a20a2 100644 --- a/plots/bar-basic/metadata/bokeh.yaml +++ b/plots/bar-basic/metadata/bokeh.yaml @@ -23,3 +23,164 @@ review: weaknesses: - Data values are monotonically decreasing which does not showcase varied comparisons typical in real bar charts + image_description: The plot displays a vertical bar chart showing product sales + by category. Six blue bars (#306998) represent Electronics ($42,500), Clothing + ($31,200), Home & Garden ($28,700), Sports ($19,800), Books ($15,400), and Toys + ($12,600). Value labels appear above each bar. The title "bar-basic · bokeh · + pyplots.ai" is centered at the top. The x-axis is labeled "Product Category" and + the y-axis "Sales ($)". A subtle dashed horizontal grid aids value reading. The + y-axis correctly starts at 0. Bars have consistent widths with adequate spacing + between them. + criteria_checklist: + visual_quality: + score: 37 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title at 36pt, axis labels at 28pt, tick labels at 24pt - all clearly + readable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bars well-sized with good alpha (0.9), clear visibility + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Single blue color, no colorblind concerns + - id: VQ-05 + name: Layout Balance + score: 4 + max: 5 + passed: true + comment: Good proportions, slight right margin imbalance + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: '"Product Category" and "Sales ($)" with unit' + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: true + comment: Grid is good (alpha 0.3, dashed), but no legend needed for single-series + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct vertical bar chart + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Categories on x-axis, values as bar heights + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Value labels present, consistent bar widths, single color, adequate + spacing + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: Y-axis shows all data, starts at 0 + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: No legend needed for single-series bar chart + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: 'Correct format: "bar-basic · bokeh · pyplots.ai"' + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 6 + max: 8 + passed: true + comment: Shows variation in values across categories, but data is monotonically + decreasing (could show more varied pattern) + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Product sales by category is a real, comprehensible business scenario + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: Sales values in $12K-$42K range are realistic for category-level + retail data + code_quality: + score: 9 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Simple linear flow: imports → data → plot → save' + - id: CQ-02 + name: Reproducibility + score: 2 + max: 3 + passed: false + comment: Data is deterministic (hardcoded), no random elements, but could + include seed comment for clarity + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: All imports are used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current Bokeh API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png and plot.html + library_features: + score: 3 + max: 5 + items: [] + verdict: APPROVED diff --git a/plots/bar-basic/metadata/highcharts.yaml b/plots/bar-basic/metadata/highcharts.yaml index c8abc8bee8..24ea770d76 100644 --- a/plots/bar-basic/metadata/highcharts.yaml +++ b/plots/bar-basic/metadata/highcharts.yaml @@ -24,3 +24,172 @@ review: more subtle)' - Uses raw dict configuration instead of highcharts-core Python library classes - Bar height variation could be more pronounced to better demonstrate ranking differences + image_description: 'The plot displays a vertical bar chart (column chart) with 6 + blue bars (#306998) on a white background. The title "bar-basic · highcharts · + pyplots.ai" is displayed at the top center. The x-axis shows product categories: + Electronics, Clothing, Home & Garden, Sports, Books, and Toys. The y-axis shows + "Sales (Units)" ranging from 0 to 4500. Each bar has a data label showing the + exact value (4,200, 3,100, 2,800, 2,400, 1,900, 1,500). The bars are well-spaced + with subtle rounded corners. Grid lines are visible on the y-axis with a light + gray color. The layout is clean with good margins.' + criteria_checklist: + visual_quality: + score: 37 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title, axis labels, tick labels, and data labels are all clearly + readable at the high resolution + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements, all labels fully visible + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bars are well-sized with appropriate spacing and visibility + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Single blue color (#306998) is colorblind-safe + - id: VQ-05 + name: Layout Balance + score: 4 + max: 5 + passed: true + comment: Good proportions, slight excess whitespace on top margin + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: '"Product Category" and "Sales (Units)" are descriptive with units' + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: true + comment: Legend disabled (appropriate for single series), but grid lines could + be more subtle (currently too prominent) + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct vertical bar/column chart + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Categories on x-axis, values as bar heights + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Consistent bar widths, value labels on bars, single color, adequate + spacing + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: Y-axis properly shows 0 to 4500, displaying all data + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend correctly disabled for single series + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: 'Correct format: "bar-basic · highcharts · pyplots.ai"' + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 6 + max: 8 + passed: true + comment: Shows 6 categories with varying values, demonstrates ranking capability, + but could show more variation in bar heights + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Product sales by category is a real, comprehensible retail scenario + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: Sales values (1,500-4,200 units) are realistic for retail + code_quality: + score: 9 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Simple linear structure: imports → data → config → HTML → screenshot' + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Deterministic data (hardcoded values, no randomness) + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: All imports are used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current Highcharts patterns + - id: CQ-05 + name: Output Correct + score: 0 + max: 1 + passed: false + comment: Uses dict-based config instead of highcharts-core library classes + (works but differs from library guide) + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: true + comment: Uses Highcharts-specific features like dataLabels, borderRadius, + pointPadding, but doesn't use the highcharts-core Python library as recommended + in library rules + verdict: APPROVED diff --git a/plots/bar-basic/metadata/letsplot.yaml b/plots/bar-basic/metadata/letsplot.yaml index 8f8f2d0119..0b9ef67153 100644 --- a/plots/bar-basic/metadata/letsplot.yaml +++ b/plots/bar-basic/metadata/letsplot.yaml @@ -23,3 +23,166 @@ review: weaknesses: - Could use scale_y_continuous with labels parameter for formatted y-axis tick values (currently shows raw numbers like 45,000 instead of $45K) + image_description: 'The plot displays a vertical bar chart showing sales data for + 6 product categories: Electronics ($45,200), Clothing ($32,800), Home & Garden + ($28,500), Sports ($21,300), Books ($18,900), and Toys ($15,600). All bars use + a consistent blue color (#306998) with dollar-formatted value labels positioned + above each bar. The x-axis labels are rotated 45 degrees for readability. The + plot uses a minimal theme with subtle horizontal gridlines (no vertical gridlines). + The title "bar-basic · letsplot · pyplots.ai" is centered at the top. The y-axis + shows "Sales ($)" and x-axis shows "Product Category".' + criteria_checklist: + visual_quality: + score: 40 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: All text perfectly readable at full resolution + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text, rotated x-labels avoid collision + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bars well-sized with appropriate width (0.6) + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Single blue color, no colorblind issues + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Good proportions and margins + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: 'Descriptive with units: "Sales ($)", "Product Category"' + - id: VQ-07 + name: Grid & Legend + score: 2 + max: 2 + passed: true + comment: Subtle horizontal grid, no legend needed + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct vertical bar chart + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Categories on X, values on Y correctly mapped + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Value labels, consistent bar widths, single color as spec suggests + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: All data visible within y-axis limits (0-55000) + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: N/A for single-color chart + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: 'Correct: "bar-basic · letsplot · pyplots.ai"' + data_quality: + score: 20 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 8 + max: 8 + passed: true + comment: Shows 6 varied categories with descending values demonstrating comparison + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: 'Real scenario: product sales by category with plausible values' + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: Realistic sales values ($15K-$45K range) + code_quality: + score: 10 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Simple linear structure: imports → data → plot → save' + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Deterministic data (no random values needed) + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: Only necessary imports + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Current API usage + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves plot.png and plot.html + library_features: + score: 4 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 4 + max: 5 + passed: true + comment: Good use of ggplot grammar, geom_text with label_format for currency, + theme_minimal, custom theme elements + verdict: APPROVED diff --git a/plots/bar-basic/metadata/matplotlib.yaml b/plots/bar-basic/metadata/matplotlib.yaml index c1f590dead..f761cce6c5 100644 --- a/plots/bar-basic/metadata/matplotlib.yaml +++ b/plots/bar-basic/metadata/matplotlib.yaml @@ -23,3 +23,171 @@ review: arrangement showing natural category variation - Could use matplotlib FuncFormatter for y-axis tick labels to show dollar signs consistently + image_description: 'The plot displays a vertical bar chart showing product sales + by category. Six steel-blue bars (#306998) represent different product categories: + Electronics ($45,200), Clothing ($32,800), Home & Garden ($28,500), Sports ($21,300), + Books ($18,900), and Toys ($15,600). Each bar has a dollar-formatted value label + positioned above it. The y-axis shows "Sales ($)" ranging from 0 to ~45,000, and + the x-axis shows "Product Category". The title follows the correct format: "bar-basic + · matplotlib · pyplots.ai". The plot has a clean design with subtle horizontal + grid lines, no top/right spines, and consistent bar widths with adequate spacing.' + criteria_checklist: + visual_quality: + score: 38 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title at 24pt, axis labels at 20pt, tick labels at 16pt, value annotations + at 16pt - all perfectly readable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text, all category labels clearly separated + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bars well-sized with good width (0.6), appropriate spacing + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Single color scheme, no colorblind issues + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Well-proportioned, good use of space with tight_layout + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: 'Descriptive labels with units: "Sales ($)" and "Product Category"' + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: false + comment: Grid is subtle (alpha=0.3) but no legend needed; however y-axis grid + only is appropriate + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct vertical bar chart + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Categories on x-axis, values as bar heights + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Value labels on bars, consistent bar widths, single color, adequate + spacing + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: Y-axis starts at 0, shows all data properly + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: No legend needed for single-series bar chart + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: 'Correct format: "bar-basic · matplotlib · pyplots.ai"' + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 6 + max: 8 + passed: true + comment: Shows 6 categories with clear value differences, though data is monotonically + decreasing which is less interesting than mixed ordering + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Product sales by category is a plausible, real-world scenario + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: Sales values in thousands are realistic for category comparisons + code_quality: + score: 9 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Simple linear flow: imports → data → plot → save' + - id: CQ-02 + name: Reproducibility + score: 2 + max: 3 + passed: false + comment: Data is deterministic (hardcoded), but no random seed comment to + indicate intentional reproducibility + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: Only matplotlib.pyplot imported + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current matplotlib API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png with dpi=300 + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: false + comment: Good use of Axes methods, spines control, and annotation, but could + leverage more matplotlib-specific features like custom formatters + verdict: APPROVED diff --git a/plots/bar-basic/metadata/plotly.yaml b/plots/bar-basic/metadata/plotly.yaml index ca3de2a8dd..b0767ff7a9 100644 --- a/plots/bar-basic/metadata/plotly.yaml +++ b/plots/bar-basic/metadata/plotly.yaml @@ -15,3 +15,4 @@ review: strengths: [] weaknesses: [] improvements: [] + verdict: APPROVED diff --git a/plots/bar-basic/metadata/plotnine.yaml b/plots/bar-basic/metadata/plotnine.yaml index 4a04ea2277..97b9813005 100644 --- a/plots/bar-basic/metadata/plotnine.yaml +++ b/plots/bar-basic/metadata/plotnine.yaml @@ -25,3 +25,172 @@ review: setting - Could use scale_y_continuous to add dollar formatting to y-axis tick labels for consistency with value labels + image_description: 'The plot displays a vertical bar chart showing sales data across + 6 product categories. The bars are rendered in a consistent blue color (#306998). + The x-axis shows "Product Category" with labels: Books, Clothing, Electronics, + Home & Garden, Sports, and Toys. The y-axis shows "Sales ($)" ranging from 0 to + approximately 45,000. Each bar has a value label positioned above it showing the + exact sales figure with dollar formatting (e.g., $45,200, $32,800, etc.). The + title reads "bar-basic · plotnine · pyplots.ai" in the correct format. The plot + uses a clean minimal theme with a light gray background and subtle gridlines. + The layout is well-balanced with a 16:9 aspect ratio.' + criteria_checklist: + visual_quality: + score: 38 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title at 24pt, axis titles at 20pt, tick labels at 16pt - all perfectly + readable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements, all labels clear and separated + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bars are well-sized with appropriate width (0.7), clearly visible + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Single blue color, no colorblind issues + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Good proportions, 16:9 aspect ratio, balanced whitespace + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: 'Descriptive labels with units: "Sales ($)" and "Product Category"' + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: false + comment: No legend needed, but grid is default plotnine style (could be more + subtle) + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct vertical bar chart + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Categories on x-axis, values on y-axis correctly mapped + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Consistent bar widths, value labels above bars, single color, adequate + spacing + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: Y-axis shows full data range from 0 to beyond max value + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: No legend needed for single-color bar chart + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: 'Correct format: "bar-basic · plotnine · pyplots.ai"' + data_quality: + score: 17 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 6 + max: 8 + passed: true + comment: Shows 6 categories with varying heights, good range of values, but + all positive (no variation in direction) + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Product sales by category is a real, comprehensible business scenario + - id: DQ-03 + name: Appropriate Scale + score: 4 + max: 5 + passed: true + comment: Sales values are realistic ($12K-$45K range), though slightly round + numbers + code_quality: + score: 9 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: Clean imports → data → plot → save structure, no functions/classes + - id: CQ-02 + name: Reproducibility + score: 2 + max: 3 + passed: false + comment: Data is deterministic (hardcoded), but no explicit seed for any randomness + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: All imports are used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Using current plotnine API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as "plot.png" + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Distinctive Features + score: 3 + max: 5 + passed: false + comment: Uses ggplot grammar correctly with geom_bar + geom_text, theme_minimal, + but could leverage more plotnine features like scale_y_continuous for formatting + verdict: APPROVED diff --git a/plots/bar-basic/metadata/pygal.yaml b/plots/bar-basic/metadata/pygal.yaml index fbecd983b7..7324411902 100644 --- a/plots/bar-basic/metadata/pygal.yaml +++ b/plots/bar-basic/metadata/pygal.yaml @@ -22,3 +22,170 @@ review: - Grid lines could be more subtle (currently at default opacity) - Font sizes in the style are larger than library defaults but tick labels could be slightly larger for optimal legibility + image_description: 'The plot displays a vertical bar chart showing "Quarterly sales + by product category" with 6 categories: Electronics ($45,200), Clothing ($32,800), + Home & Garden ($28,500), Sports ($19,700), Books ($15,300), and Toys ($12,400). + All bars use a consistent Python Blue color (#306998). Value labels are positioned + on top of each bar with dollar formatting. The title "bar-basic · pygal · pyplots.ai" + appears at the top. The x-axis is labeled "Category" and y-axis "Sales ($)" with + horizontal grid lines. The layout is clean with good proportions and adequate + spacing between bars.' + criteria_checklist: + visual_quality: + score: 36 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 9 + max: 10 + passed: true + comment: Title, axis labels, and value labels are all clearly readable; tick + labels slightly small but acceptable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bars are well-sized with good spacing + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Single color scheme, colorblind-safe + - id: VQ-05 + name: Layout Balance + score: 4 + max: 5 + passed: true + comment: Good proportions, slight extra whitespace on right + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: 'Descriptive with units: "Sales ($)", "Category"' + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: true + comment: No legend shown (appropriate since single series), but grid could + be more subtle + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct vertical bar chart + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Categories on x-axis, values as bar heights + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Value labels present, consistent bar widths, adequate spacing + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: All data visible, y-axis starts at $0 + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend correctly hidden for single series + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: Uses correct format "bar-basic · pygal · pyplots.ai" + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 7 + max: 8 + passed: true + comment: Shows variation in values, clear ranking; could benefit from more + contrast between adjacent values + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Quarterly sales by product category is a plausible retail scenario + - id: DQ-03 + name: Appropriate Scale + score: 4 + max: 5 + passed: true + comment: Values are realistic for quarterly sales; range could be slightly + wider for more visual impact + code_quality: + score: 9 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: Clean imports → data → chart → save structure + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Deterministic data (hardcoded values) + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: Only pygal and Style imported, both used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Current pygal API + - id: CQ-05 + name: Output Correct + score: 0 + max: 1 + passed: false + comment: Saves as plot.png but also creates plot.html (minor) + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: true + comment: Uses custom Style, value_formatter, print_values; could leverage + more pygal-specific interactivity features + verdict: APPROVED diff --git a/plots/bar-basic/metadata/seaborn.yaml b/plots/bar-basic/metadata/seaborn.yaml index 062778b0d9..71307e2425 100644 --- a/plots/bar-basic/metadata/seaborn.yaml +++ b/plots/bar-basic/metadata/seaborn.yaml @@ -23,3 +23,160 @@ review: capabilities - Does not leverage seaborn-specific features beyond basic barplot (e.g., error bars, hue encoding for highlighting) + image_description: 'The plot displays a vertical bar chart showing product sales + by category. Six blue bars (#306998) represent categories: Electronics (145), + Clothing (98), Home & Garden (76), Sports (112), Books (54), and Toys (89). Bold + value labels appear above each bar. The title "bar-basic · seaborn · pyplots.ai" + is positioned at the top. The y-axis shows "Sales (units)" and x-axis shows "Product + Category". The chart has a clean design with removed top/right spines and subtle + dashed gridlines on the y-axis. All text is clearly legible and well-sized.' + criteria_checklist: + visual_quality: + score: 37 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title 24pt, labels 20pt, ticks 16pt, value labels 18pt - all perfectly + readable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text, all elements clearly separated + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bar widths appropriate, good spacing between bars + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Single blue color, no colorblind issues + - id: VQ-05 + name: Layout Balance + score: 4 + max: 5 + passed: true + comment: Good proportions, slight extra whitespace on right + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: 'Descriptive labels with units: "Sales (units)", "Product Category"' + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: true + comment: Grid is subtle (alpha 0.3), but no legend needed for single-color + bars + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct vertical bar chart + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Categories on X, values on Y correctly assigned + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Value labels on bars, consistent bar widths, adequate spacing + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: Y-axis shows full range from 0 to beyond max value + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: No legend needed, single color used appropriately + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: 'Correct format: "bar-basic · seaborn · pyplots.ai"' + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 6 + max: 8 + passed: true + comment: Shows variation in bar heights, but all values in similar range (54-145) + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Product sales by category is a real, comprehensible scenario + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: Values are realistic for unit sales (54-145 units) + code_quality: + score: 9 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Clean linear flow: imports → data → plot → save' + - id: CQ-02 + name: Reproducibility + score: 2 + max: 3 + passed: false + comment: Deterministic data (no randomness), but no explicit seed comment + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: Only matplotlib, pandas, seaborn - all used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current seaborn API correctly + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png with correct dpi and bbox_inches + library_features: + score: 3 + max: 5 + items: [] + verdict: APPROVED diff --git a/plots/bar-categorical/metadata/altair.yaml b/plots/bar-categorical/metadata/altair.yaml index bbd8993339..ee67e962a8 100644 --- a/plots/bar-categorical/metadata/altair.yaml +++ b/plots/bar-categorical/metadata/altair.yaml @@ -23,3 +23,173 @@ review: weaknesses: - Category frequency distribution could show more extreme variation to better demonstrate the counting feature (e.g., one very rare category) + image_description: 'The plot displays a vertical bar chart showing retail transaction + counts across 6 product categories. The bars are rendered in a pleasant blue color + (#306998) with subtle rounded corners at the top. Categories are displayed on + the x-axis with labels angled at -30 degrees for readability: Electronics (42), + Clothing (34), Home & Garden (27), Books (19), Sports (16), and Toys (12). The + bars are sorted in descending order by count. The y-axis shows "Number of Transactions" + ranging from 0 to 44. The title "bar-categorical · altair · pyplots.ai" appears + at the top center. The layout is clean with subtle gray gridlines and good use + of canvas space.' + criteria_checklist: + visual_quality: + score: 38 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title at 28pt, axis labels at 22pt, tick labels at 18pt - all clearly + readable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: X-axis labels angled at -30° prevents overlap, all text readable + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bars are well-sized, clearly visible, appropriate for 6 categories + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Single blue color scheme is colorblind-safe + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Good canvas utilization, balanced margins, plot fills appropriate + space + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: 'Descriptive labels: "Product Category" and "Number of Transactions"' + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: false + comment: Grid is subtle (alpha 0.3), but no legend needed for single-color + bars (deducting 0 - actually fine) + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct bar chart for categorical count data + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Categories on X-axis, counts on Y-axis as specified + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Automatic count aggregation using `count():Q`, sorted by count descending + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: Y-axis shows full range from 0 to slightly above max count + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: N/A for single-series chart, tooltips provided instead + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: 'Correct format: "bar-categorical · altair · pyplots.ai"' + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 6 + max: 8 + passed: true + comment: Shows varying frequencies across categories with realistic distribution, + but could show more extreme variation + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Retail transactions by product category is a believable, neutral + business scenario + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: 150 transactions across 6 categories with realistic weighted distribution + code_quality: + score: 10 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Clean linear flow: imports → data → chart → save' + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Uses `np.random.seed(42)` + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: Only altair, numpy, pandas imported and all used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current Altair API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png and plot.html + library_features: + score: 5 + max: 5 + items: + - id: LF-01 + name: Distinctive Features + score: 5 + max: 5 + passed: true + comment: 'Excellent use of Altair declarative syntax: `count():Q` aggregation, + `:N` encoding type, `sort="-y"`, tooltips, `cornerRadius` styling, `configure_axis` + and `configure_view`' + verdict: APPROVED diff --git a/plots/bar-categorical/metadata/bokeh.yaml b/plots/bar-categorical/metadata/bokeh.yaml index 45044f1398..afa53f6df4 100644 --- a/plots/bar-categorical/metadata/bokeh.yaml +++ b/plots/bar-categorical/metadata/bokeh.yaml @@ -21,3 +21,170 @@ review: weaknesses: - Missing HoverTool to display exact counts on hover (Bokeh's key interactive feature) - Could benefit from value labels on top of bars for static PNG output + image_description: The plot displays a vertical bar chart showing programming language + popularity based on survey responses. There are 7 bars representing Python (~153), + JavaScript (~118), Java (~74), C++ (~48), Rust (~39), Go (~37), and TypeScript + (~30). The bars are rendered in a muted blue color (#306998) with darker blue + outlines. The title "bar-categorical · bokeh · pyplots.ai" appears at the top + center. The x-axis is labeled "Programming Language" and shows category names + horizontally (no rotation). The y-axis is labeled "Number of Responses" with values + from 0 to 160. The background is light gray (#fafafa) with subtle dashed horizontal + grid lines. Bars are sorted in descending order by count. + criteria_checklist: + visual_quality: + score: 38 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title at 48pt, axis labels at 36pt, tick labels at 28pt - all perfectly + readable at 4800x2700 + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text, category labels are well-spaced horizontally + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bars are appropriately sized with good width (0.7), visible borders + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Single color scheme, no color distinction needed for this plot type + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Plot fills canvas well, balanced margins, good use of space + - id: VQ-06 + name: Axis Labels + score: 1 + max: 2 + passed: true + comment: Descriptive labels but no units (counts don't need units, acceptable) + - id: VQ-07 + name: Grid & Legend + score: 1 + max: 2 + passed: true + comment: Subtle dashed grid (alpha 0.3), no legend needed; x-grid correctly + disabled + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct bar chart for categorical count data + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Categories on x-axis, counts on y-axis + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Automatic counting from raw data, sorted by count descending + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: Y-axis starts at 0, shows all data + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: No legend needed for single-series bar chart + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: 'Correct format: "bar-categorical · bokeh · pyplots.ai"' + data_quality: + score: 17 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 6 + max: 8 + passed: true + comment: Shows frequency distribution with varied counts; could show more + dramatic variation + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Programming language survey is a realistic, neutral scenario + - id: DQ-03 + name: Appropriate Scale + score: 4 + max: 5 + passed: true + comment: 500 responses with 7 categories is reasonable; counts are realistic + code_quality: + score: 10 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Clean linear flow: imports → data → plot → save' + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Uses np.random.seed(42) + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: Only necessary imports used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current Bokeh APIs + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png + library_features: + score: 2 + max: 5 + items: + - id: LF-01 + name: Distinctive Features + score: 2 + max: 5 + passed: false + comment: Uses ColumnDataSource and vbar correctly, but doesn't leverage Bokeh's + interactive features (HoverTool with count display would enhance this) + verdict: APPROVED diff --git a/plots/bar-categorical/metadata/highcharts.yaml b/plots/bar-categorical/metadata/highcharts.yaml index fb205268ac..917a5372af 100644 --- a/plots/bar-categorical/metadata/highcharts.yaml +++ b/plots/bar-categorical/metadata/highcharts.yaml @@ -23,3 +23,172 @@ review: - X-axis title is partially cut off at the bottom of the image despite marginBottom/spacingBottom settings - Image height is 2561px instead of the specified 2700px (browser viewport issue) + image_description: 'The plot displays a vertical column/bar chart with a white background. + The title "bar-categorical · highcharts · pyplots.ai" appears at the top in bold + black text, with a subtitle "Product Category Purchase Frequency" below it. Six + blue (#306998) bars represent different product categories: Electronics (130), + Clothing (93), Books (86), Home & Garden (78), Sports (58), and Toys (55). Each + bar has a data label showing its count value. The x-axis is labeled "Product Category" + and shows all category names clearly. The y-axis is labeled "Count" and ranges + from 0 to 140 with gridlines. The bars are sorted in descending order by count. + The bars have slightly rounded corners (borderRadius: 4).' + criteria_checklist: + visual_quality: + score: 36 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 9 + max: 10 + passed: true + comment: Title at 48px, axis titles at 36px, labels at 32px - all highly readable. + Slight deduction as tick labels could be slightly larger. + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text anywhere; categories well-spaced + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bars are appropriately sized and clearly visible + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Single color (#306998 blue) is colorblind-safe + - id: VQ-05 + name: Layout Balance + score: 3 + max: 5 + passed: true + comment: Good overall but x-axis title "Product Category" is cut off at the + bottom of the image + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: '"Product Category" and "Count" are descriptive' + - id: VQ-07 + name: Grid & Legend + score: 1 + max: 2 + passed: true + comment: Grid is subtle, legend correctly disabled for single series + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct column/bar chart for categorical counts + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Categories on x-axis, counts on y-axis + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Auto-counts raw categorical data, sorts by descending count + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: Y-axis shows full range (0-140) covering all data + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend appropriately disabled for single series + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: 'Correct format: "bar-categorical · highcharts · pyplots.ai"' + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 7 + max: 8 + passed: true + comment: Shows varying frequencies across 6 categories demonstrating the counting + functionality well. Could have more categories for richer demonstration. + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Product category purchases is a realistic e-commerce scenario + - id: DQ-03 + name: Appropriate Scale + score: 4 + max: 5 + passed: true + comment: 500 samples with counts ranging 55-130 is reasonable, though probabilities + could create more dramatic variation + code_quality: + score: 9 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Linear flow: imports → data → chart config → export' + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Uses np.random.seed(42) + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: All imports are used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current highcharts-core API + - id: CQ-05 + name: Output Correct + score: 0 + max: 1 + passed: false + comment: Outputs plot.png correctly, but image dimensions are 4800x2561 instead + of specified 4800x2700 + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: true + comment: Uses ColumnSeries, dataLabels, borderRadius styling. Could leverage + more Highcharts features like animations or tooltips in HTML output. + verdict: APPROVED diff --git a/plots/bar-categorical/metadata/letsplot.yaml b/plots/bar-categorical/metadata/letsplot.yaml index fb6c7d812e..ee6fd7a84c 100644 --- a/plots/bar-categorical/metadata/letsplot.yaml +++ b/plots/bar-categorical/metadata/letsplot.yaml @@ -23,3 +23,171 @@ review: - Does not leverage lets-plot interactive features (tooltips, hover effects) that distinguish it from plotnine - Data context is generic; could use a more specific real-world scenario + image_description: 'The plot displays a categorical bar chart showing fruit type + frequency counts. Five vertical bars represent different fruits: Bananas (~40), + Mangoes (~31), Grapes (~33), Oranges (~40), and Apples (~56). The bars are rendered + in a muted blue color (#306998) with darker borders. The title "bar-categorical + · letsplot · pyplots.ai" appears at the top left in bold. The x-axis is labeled + "Fruit Type" with category names below each bar, and the y-axis is labeled "Count" + with tick marks from 0 to 55. The plot uses a minimal theme with horizontal grid + lines only, and the overall layout is clean with good proportions.' + criteria_checklist: + visual_quality: + score: 36 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title is bold and large, axis labels and tick text are clearly readable + at full resolution + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text, category labels are well-spaced + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bars are appropriately sized with good width and clear visibility + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Single color scheme with good contrast, no colorblind issues + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Plot fills canvas appropriately with balanced margins + - id: VQ-06 + name: Axis Labels + score: 1 + max: 2 + passed: false + comment: Labels are descriptive ("Fruit Type", "Count") but lack units + - id: VQ-07 + name: Grid & Legend + score: 1 + max: 2 + passed: false + comment: Horizontal grid only is appropriate for bar chart, but no legend + needed; minor grid could be more subtle + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct categorical count bar chart using geom_bar() + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Categories on x-axis, counts on y-axis (computed automatically) + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Automatic count computation from raw categorical data + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: Y-axis shows full range of counts (0-55) + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: No legend needed for single-series bar chart + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: Correctly formatted as "bar-categorical · letsplot · pyplots.ai" + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 8 + max: 8 + passed: true + comment: Shows variation in counts across categories, demonstrates the counting + functionality well + - id: DQ-02 + name: Realistic Context + score: 5 + max: 7 + passed: false + comment: Fruit popularity is plausible but generic; could be more specific + (e.g., store inventory, survey results) + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: 200 samples with realistic probability weights producing sensible + counts + code_quality: + score: 9 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: Clean imports → data → plot → save structure + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Uses np.random.seed(42) + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: All imports are used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Modern lets-plot API + - id: CQ-05 + name: Output Correct + score: 0 + max: 1 + passed: false + comment: Saves both plot.png and plot.html which is correct for letsplot + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: false + comment: Uses ggplot grammar correctly with geom_bar() and theme customization, + but does not leverage lets-plot specific features like tooltips or interactivity + verdict: APPROVED diff --git a/plots/bar-categorical/metadata/matplotlib.yaml b/plots/bar-categorical/metadata/matplotlib.yaml index 7a7790595a..5b188884e7 100644 --- a/plots/bar-categorical/metadata/matplotlib.yaml +++ b/plots/bar-categorical/metadata/matplotlib.yaml @@ -23,3 +23,172 @@ review: - Could use more distinctive matplotlib features (e.g., custom hatching, gradient fills, or annotation arrows) - Y-axis label "Count (Frequency)" is slightly redundant - could be simplified + image_description: 'The plot displays a vertical bar chart with 5 bars representing + product categories (Product A through E) on the x-axis. The bars are colored in + Python Blue (#306998) with a darker edge color. Each bar has a bold count label + above it showing the frequency values: Product A (154), Product B (118), Product + C (97), Product D (76), and Product E (55). The bars are sorted in descending + order by count. The y-axis shows "Count (Frequency)" ranging from 0 to 160, and + the x-axis is labeled "Product Category". The title follows the correct format: + "bar-categorical · matplotlib · pyplots.ai". A subtle horizontal dashed grid is + visible on the y-axis. The top and right spines are removed for a cleaner appearance.' + criteria_checklist: + visual_quality: + score: 38 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title at 24pt, axis labels at 20pt, tick labels at 16pt, value labels + at 18pt bold - all perfectly readable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text, bars well-spaced, labels clear + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bars are appropriately sized, good width relative to spacing + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Single color scheme (Python Blue), no colorblind issues + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Plot fills canvas well, balanced margins, good proportions + - id: VQ-06 + name: Axis Labels + score: 1 + max: 2 + passed: true + comment: Descriptive labels but y-axis could have units (e.g., "Count (n)" + or just "Count") + - id: VQ-07 + name: Grid & Legend + score: 1 + max: 2 + passed: true + comment: Grid is subtle (alpha=0.3), but no legend needed for this single-series + chart + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct bar chart for categorical count data + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Categories on x-axis, counts on y-axis as specified + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Auto-counts raw categorical data, sorted descending as noted in spec + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: Y-axis shows full range from 0 to above max value + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: No legend needed, N/A + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: 'Correct format: "bar-categorical · matplotlib · pyplots.ai"' + data_quality: + score: 19 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 7 + max: 8 + passed: true + comment: Shows varying frequencies across 5 categories, good distribution + variety + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Product preference survey is a realistic, neutral business scenario + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: 500 survey responses with sensible probability distribution + code_quality: + score: 10 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: Clean imports → data → plot → save structure, no functions/classes + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: np.random.seed(42) ensures reproducibility + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: All imports (matplotlib, numpy, pandas) are used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current matplotlib API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png with correct dpi and bbox_inches + library_features: + score: 2 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 2 + max: 5 + passed: true + comment: Uses standard matplotlib bar chart with Axes methods. Added value + labels and spine removal are nice touches, but could leverage more matplotlib-specific + features like custom tick formatting or annotations. + verdict: APPROVED diff --git a/plots/bar-categorical/metadata/plotly.yaml b/plots/bar-categorical/metadata/plotly.yaml index 766868d8b8..8417bfd69b 100644 --- a/plots/bar-categorical/metadata/plotly.yaml +++ b/plots/bar-categorical/metadata/plotly.yaml @@ -23,3 +23,169 @@ review: interactivity - Grid lines are very subtle (alpha 0.1) - could be slightly more visible for better readability + image_description: 'The plot displays a vertical bar chart with 6 blue bars representing + fruit category frequencies. The title "bar-categorical · plotly · pyplots.ai" + is centered at the top. The x-axis is labeled "Fruit Category" showing categories: + Apple (130), Banana (93), Orange (86), Grape (78), Mango (58), and Strawberry + (55). The y-axis is labeled "Count (Frequency)" ranging from 0 to 120+. Each bar + has its count value displayed above it. The bars are a solid blue color (#306998) + with darker blue borders. The background is white with subtle horizontal grid + lines. The layout is clean with good spacing between bars.' + criteria_checklist: + visual_quality: + score: 37 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title at 32pt, axis labels at 24pt, tick labels at 20pt - all perfectly + readable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text, category labels well spaced + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bars clearly visible with good sizing and spacing (bargap=0.3) + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Single blue color scheme, no color differentiation issues + - id: VQ-05 + name: Layout Balance + score: 4 + max: 5 + passed: true + comment: Good proportions, plot fills canvas well, slight excess margin on + right + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: 'Descriptive labels: "Fruit Category" and "Count (Frequency)"' + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: false + comment: Grid is subtle (alpha 0.1), but no legend needed; grid could be slightly + more visible + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct bar chart type for categorical counting + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Categories on x-axis, counts on y-axis as required + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Automatic counting from raw data, sorted by count descending + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: All data visible, y-axis appropriately scaled + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: No legend needed for single-series bar chart + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: Correctly formatted as "bar-categorical · plotly · pyplots.ai" + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 7 + max: 8 + passed: true + comment: Shows varying frequencies well; could show more dramatic differences + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Fruit preference survey is a neutral, realistic scenario + - id: DQ-03 + name: Appropriate Scale + score: 4 + max: 5 + passed: true + comment: 500 samples reasonable, though frequencies are relatively close together + code_quality: + score: 10 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: Clean imports → data → plot → save structure, no functions/classes + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: np.random.seed(42) set + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: Only numpy, pandas, and plotly.graph_objects used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current Plotly API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png and plot.html + library_features: + score: 2 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 2 + max: 5 + passed: false + comment: Uses go.Bar correctly but doesn't leverage Plotly's interactive features + like hover templates or animations + verdict: APPROVED diff --git a/plots/bar-categorical/metadata/plotnine.yaml b/plots/bar-categorical/metadata/plotnine.yaml index 23f799f00e..762d7dca09 100644 --- a/plots/bar-categorical/metadata/plotnine.yaml +++ b/plots/bar-categorical/metadata/plotnine.yaml @@ -25,3 +25,176 @@ review: - Could use scale_fill_brewer() with a diverging palette instead of manual colors for better colorblind accessibility - Missing count annotations on bars which would enhance readability + image_description: 'The plot displays a vertical bar chart showing customer satisfaction + survey results. Five categories are shown on the x-axis: "Excellent", "Good", + "Average", "Poor", and "Very Poor" (in logical order from best to worst). The + y-axis shows "Number of Responses" ranging from 0 to approximately 65. The bars + use a gradient color scheme from blue tones (Excellent=#306998, Good=#4A90C2) + through yellow (Average=#FFD43B) to orange-brown tones (Poor=#E8A838, Very Poor=#CC6633). + The "Good" category has the highest count (~66), followed by "Excellent" (~55), + "Average" (~36), "Poor" (~27), and "Very Poor" (~15). The title correctly shows + "bar-categorical · plotnine · pyplots.ai". The plot has a clean minimal theme + with no legend (appropriately hidden since colors match x-axis labels), subtle + horizontal grid lines, and well-proportioned layout filling the canvas appropriately.' + criteria_checklist: + visual_quality: + score: 37 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title at 24pt, axis titles at 20pt, tick labels at 16pt - all perfectly + readable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text, category labels well-spaced + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bars are well-sized with appropriate width (0.7) and alpha (0.9) + - id: VQ-04 + name: Color Accessibility + score: 4 + max: 5 + passed: true + comment: Good diverging color scheme from blue to orange, but the yellow "Average" + bar is slightly low contrast + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Excellent use of 16:9 canvas, plot fills space appropriately + - id: VQ-06 + name: Axis Labels + score: 1 + max: 2 + passed: true + comment: Descriptive labels but no units (though "Number of Responses" is + clear enough for count data) + - id: VQ-07 + name: Grid & Legend + score: 1 + max: 2 + passed: true + comment: Grid is appropriately subtle, legend correctly hidden, but major + x-grid removed which is good + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct categorical bar chart with automatic counting via geom_bar() + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Categories on X, counts on Y (computed automatically) + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Automatic count computation, ordered categories displayed + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: Y-axis shows full range of data + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend appropriately hidden as colors are redundant with x-axis + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: 'Correct format: "bar-categorical · plotnine · pyplots.ai"' + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 7 + max: 8 + passed: true + comment: Shows varying counts across categories with realistic distribution, + but could show more extreme variation + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Product satisfaction survey is a perfect, neutral real-world scenario + - id: DQ-03 + name: Appropriate Scale + score: 4 + max: 5 + passed: true + comment: 200 responses is reasonable for a survey, though counts are slightly + high for a typical survey sample + code_quality: + score: 10 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: Clean imports → data → plot → save structure, no functions/classes + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: np.random.seed(42) properly set + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: All imports are used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current plotnine API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png + library_features: + score: 2 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 2 + max: 5 + passed: false + comment: Uses ggplot grammar correctly with geom_bar for automatic counting, + pd.Categorical for ordering, but could leverage more plotnine features like + stat_count annotations or scale_fill_brewer + verdict: APPROVED diff --git a/plots/bar-categorical/metadata/pygal.yaml b/plots/bar-categorical/metadata/pygal.yaml index a35d5d6504..605edc76aa 100644 --- a/plots/bar-categorical/metadata/pygal.yaml +++ b/plots/bar-categorical/metadata/pygal.yaml @@ -22,3 +22,175 @@ review: - Could use more distinctive pygal features (e.g., custom tooltips with percentage, value_formatter showing both count and percentage) - Color variety could be added to distinguish high vs low frequency categories + image_description: 'The plot displays a vertical bar chart showing product category + frequencies. Six blue bars (#306998) represent different electronics categories: + Smartphone (142), Laptop (130), Tablet (74), Smartwatch (62), Desktop (48), and + Headphones (44). The bars are sorted in descending order by count. Each bar has + its count value displayed on top. The title "bar-categorical · pygal · pyplots.ai" + appears at the top. The x-axis is labeled "Product Category" and y-axis is labeled + "Count (Frequency)". Horizontal grid lines (dotted, subtle) help read values. + White background with clean layout.' + criteria_checklist: + visual_quality: + score: 37 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title, axis labels, tick labels, and value labels all clearly readable + at full resolution + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text; category labels well-spaced, values above bars + don't collide + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bars are well-sized and clearly visible with good spacing between + them + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Single color scheme (blue), no color differentiation needed for this + single-series chart + - id: VQ-05 + name: Layout Balance + score: 4 + max: 5 + passed: true + comment: Good use of canvas space, plot fills appropriate area; slight whitespace + on right + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: 'Both axes have descriptive labels: "Product Category" and "Count + (Frequency)"' + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: false + comment: Grid is appropriately subtle, but legend is hidden (show_legend=False) + which is correct for single series + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct bar chart for categorical count data + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Categories on x-axis, counts on y-axis as specified + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Automatically counts raw categorical data, sorted by count descending + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: Y-axis shows full range from 0 to beyond max count (142) + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend appropriately hidden for single-series data + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: 'Correct format: "bar-categorical · pygal · pyplots.ai"' + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 7 + max: 8 + passed: true + comment: Shows varying frequencies across categories demonstrating the count + concept; could show more extreme variation + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Electronics product categories is a neutral, realistic business scenario + - id: DQ-03 + name: Appropriate Scale + score: 4 + max: 5 + passed: true + comment: 500 samples with realistic probability weights; counts are reasonable + code_quality: + score: 10 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Clean linear flow: imports → data → style → chart → save' + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Uses np.random.seed(42) + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: Only necessary imports (numpy, pygal, Style) + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current pygal API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png and plot.html + library_features: + score: 2 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 2 + max: 5 + passed: false + comment: Uses pygal's Style customization and print_values feature, but could + leverage more pygal-specific features like tooltips or animations in HTML + output + verdict: APPROVED diff --git a/plots/bar-categorical/metadata/seaborn.yaml b/plots/bar-categorical/metadata/seaborn.yaml index 4d62407d86..8812824b4c 100644 --- a/plots/bar-categorical/metadata/seaborn.yaml +++ b/plots/bar-categorical/metadata/seaborn.yaml @@ -24,3 +24,172 @@ review: seaborn styling - The order parameter manually specifies the order rather than computing it from the data + image_description: 'The plot displays a vertical bar chart showing programming language + preferences from survey responses. Seven bars represent different languages: Python + (dark blue, 140 responses), JavaScript (golden yellow, 101), Java (steel blue, + 86), C++ (teal, 53), Go (olive/teal, 47), Rust (salmon/peach, 37), and TypeScript + (medium blue, 36). Each bar has its count displayed above it. The title reads + "bar-categorical · seaborn · pyplots.ai" at the top. X-axis is labeled "Programming + Language" and Y-axis "Number of Responses". A subtle dashed grid is present on + the y-axis. The top and right spines are removed for a cleaner appearance.' + criteria_checklist: + visual_quality: + score: 38 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title at 24pt, labels at 20pt, ticks at 16pt - all perfectly readable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text, all labels and bar annotations clearly separated + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bars are well-sized and clearly visible with good spacing + - id: VQ-04 + name: Color Accessibility + score: 4 + max: 5 + passed: true + comment: Custom palette with distinct colors; mostly accessible but the two + blue tones (Python/TypeScript) are somewhat similar + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Excellent use of canvas, plot fills appropriate space with balanced + margins + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: Descriptive labels "Programming Language" and "Number of Responses" + - id: VQ-07 + name: Grid & Legend + score: 1 + max: 2 + passed: true + comment: Grid is subtle (alpha=0.3), but no legend needed here (colors are + self-explanatory via x-axis) + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct categorical count bar chart using countplot + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Categories on x-axis, counts on y-axis as specified + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Automatic counting, categories displayed, ordered by frequency (descending) + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: All categories and counts fully visible + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: No legend needed; bar labels serve the purpose + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: 'Correct format: "bar-categorical · seaborn · pyplots.ai"' + data_quality: + score: 20 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 8 + max: 8 + passed: true + comment: Shows variation in counts from high (140) to low (36), demonstrating + frequency distribution well + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Programming language survey is a neutral, relatable scenario for + developers + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: 500 total responses with realistic weighted distribution + code_quality: + score: 10 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Simple linear structure: imports → data → plot → styling → save' + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Uses np.random.seed(42) + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: Only necessary imports (matplotlib, numpy, seaborn) + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current seaborn API with hue parameter correctly + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png with dpi=300 + library_features: + score: 0 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 0 + max: 5 + passed: false + comment: Uses sns.countplot which is a seaborn-specific function for automatic + counting, but the implementation could have leveraged more seaborn styling + features like set_theme() or statistical annotations + verdict: APPROVED diff --git a/plots/bar-diverging/metadata/altair.yaml b/plots/bar-diverging/metadata/altair.yaml index bfcb59e7f7..e06d09f1e4 100644 --- a/plots/bar-diverging/metadata/altair.yaml +++ b/plots/bar-diverging/metadata/altair.yaml @@ -24,3 +24,169 @@ review: closer to the chart or at top - Realistic context score slightly reduced - while customer satisfaction is valid, the exact score values feel somewhat arbitrary + image_description: 'The plot displays a horizontal diverging bar chart showing "Net + Satisfaction Score" for 12 company departments. Bars extend from a central zero + baseline - positive values (blue/Python blue #306998) extend to the right, negative + values (yellow/Python yellow #FFD43B) extend to the left. The chart is sorted + by satisfaction score from lowest (Logistics at -45) at the top to highest (Customer + Service at +42) at the bottom. A dark vertical line marks the zero baseline. The + x-axis ranges from -60 to 60 with label "Net Satisfaction Score". Department names + appear on the y-axis. A legend in the bottom-right corner shows "Sentiment" with + Positive and Negative indicators. The title "bar-diverging · altair · pyplots.ai" + appears centered at the top. Grid lines are subtle with dashed styling.' + criteria_checklist: + visual_quality: + score: 37 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title at 28pt, axis labels at 22pt, tick labels at 18pt - all clearly + readable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text, department labels well spaced + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bars are appropriately sized with cornerRadius for polish + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Blue/yellow is colorblind-safe (not red-green) + - id: VQ-05 + name: Layout Balance + score: 4 + max: 5 + passed: true + comment: Good use of canvas, slight margin imbalance on left side with longer + department names + - id: VQ-06 + name: Axis Labels + score: 1 + max: 2 + passed: true + comment: X-axis has descriptive label but no units (score is unitless, so + acceptable) + - id: VQ-07 + name: Grid & Legend + score: 1 + max: 2 + passed: true + comment: Grid is subtle with alpha 0.3 and dashed style; legend placed bottom-right + but could be better integrated + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct diverging bar chart with bars extending in opposite directions + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Category on Y-axis, value on X-axis, correctly mapped + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Contrasting colors, horizontal orientation, zero baseline, sorted + bars - all present + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: Scale domain [-60, 60] shows all data with headroom + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend correctly identifies Positive/Negative sentiment + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: Exact format "bar-diverging · altair · pyplots.ai" used + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 8 + max: 8 + passed: true + comment: Shows both positive and negative values with good distribution across + the range + - id: DQ-02 + name: Realistic Context + score: 5 + max: 7 + passed: true + comment: Customer satisfaction survey is plausible; scores ranging -45 to + +42 are reasonable for net satisfaction + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: Values are sensible for a satisfaction score context + code_quality: + score: 9 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Simple linear flow: imports → data → plot → save' + - id: CQ-02 + name: Reproducibility + score: 2 + max: 3 + passed: true + comment: Deterministic data (no random), but could benefit from explicit comment + noting this + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: Only altair and pandas imported, both used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current Altair API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png and plot.html + library_features: + score: 3 + max: 5 + items: [] + verdict: APPROVED diff --git a/plots/bar-diverging/metadata/bokeh.yaml b/plots/bar-diverging/metadata/bokeh.yaml index 9c46e369ba..2697f7e1dc 100644 --- a/plots/bar-diverging/metadata/bokeh.yaml +++ b/plots/bar-diverging/metadata/bokeh.yaml @@ -27,3 +27,174 @@ review: be consistent with style guide) - Could leverage Bokeh interactive features like HoverTool to show exact values on hover + image_description: The plot displays a horizontal diverging bar chart showing customer + satisfaction survey results (Net Promoter Score style) across 10 categories. Blue + bars (#306998) extend rightward from zero for positive values, while yellow/gold + bars (#FFD43B) extend leftward for negative values. Categories are sorted by value + from lowest (Tech Support at -35) to highest (Return Policy at +52). The title + "bar-diverging · bokeh · pyplots.ai" appears at the top left. X-axis shows "Net + Satisfaction Score" ranging from -60 to 60+, Y-axis shows "Category" with all + 10 category labels clearly visible. A subtle vertical baseline at zero separates + positive from negative values. The plot uses the full canvas width effectively + with good proportions. + criteria_checklist: + visual_quality: + score: 37 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title at 28pt, axis labels at 22pt, tick labels at 18pt - all clearly + readable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text, horizontal orientation prevents label collisions + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bars are well-sized with good height (0.7), alpha at 0.9 provides + solid visibility + - id: VQ-04 + name: Color Accessibility + score: 4 + max: 5 + passed: true + comment: Blue/yellow is colorblind-safe, though contrast could be slightly + better + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Plot fills canvas well, good margins, balanced whitespace + - id: VQ-06 + name: Axis Labels + score: 1 + max: 2 + passed: true + comment: Descriptive labels but no units (score is unitless, so acceptable) + - id: VQ-07 + name: Grid & Legend + score: 1 + max: 2 + passed: true + comment: Grid is subtle (alpha 0.3), but no legend explaining color meaning + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct diverging bar chart type + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Categories on Y-axis, values on X-axis correctly mapped + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: 'All spec features present: contrasting colors, horizontal orientation, + zero baseline, sorted bars' + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: X-range (-60, 70) shows all data with padding + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: No legend needed as colors are self-explanatory with positive/negative + context + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: 'Correct format: "bar-diverging · bokeh · pyplots.ai"' + data_quality: + score: 19 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 8 + max: 8 + passed: true + comment: Shows both positive and negative values with good variety (-35 to + +52) + - id: DQ-02 + name: Realistic Context + score: 6 + max: 7 + passed: true + comment: Customer satisfaction NPS scenario is realistic and comprehensible + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: Values in -100 to +100 NPS range are realistic + code_quality: + score: 7 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Linear flow: imports → data → plot → save' + - id: CQ-02 + name: Reproducibility + score: 0 + max: 3 + passed: false + comment: No random seed, though data is deterministic (hardcoded values) + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: Only necessary imports used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Modern Bokeh API used + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses Bokeh features + score: 3 + max: 5 + passed: true + comment: Uses ColumnDataSource, Span for zero line, hbar method, but could + leverage HoverTool or other interactive features + verdict: APPROVED diff --git a/plots/bar-diverging/metadata/highcharts.yaml b/plots/bar-diverging/metadata/highcharts.yaml index 72463669d7..169f33140c 100644 --- a/plots/bar-diverging/metadata/highcharts.yaml +++ b/plots/bar-diverging/metadata/highcharts.yaml @@ -22,3 +22,171 @@ review: weaknesses: - Y-axis title lacks units (could be "Net Satisfaction Score (%)") - Bars could be slightly thicker (pointWidth) to better fill the vertical space + image_description: 'The plot displays a horizontal diverging bar chart showing "Department + Net Satisfaction Scores". Ten department categories are listed on the y-axis (Customer + Service, IT Support, Sales, Marketing, Finance, Operations, HR, R&D, Legal, Logistics). + Bars extend from a central zero baseline - positive values (blue/teal color #306998) + extend to the right, negative values (yellow/gold color #FFD43B) extend to the + left. A clear vertical black line marks the zero baseline. Each bar has a data + label showing its value. The title follows the correct format "bar-diverging · + highcharts · pyplots.ai" with a subtitle "Department Net Satisfaction Scores". + The x-axis ranges from -50 to 60 with clear tick labels.' + criteria_checklist: + visual_quality: + score: 36 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title, labels, and tick marks are all clearly readable at full resolution + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements, category labels well-spaced + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bars are appropriately sized with good visual weight + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Blue and yellow are colorblind-safe, excellent contrast + - id: VQ-05 + name: Layout Balance + score: 3 + max: 5 + passed: true + comment: Good use of canvas but bars appear somewhat thin relative to the + large canvas + - id: VQ-06 + name: Axis Labels + score: 1 + max: 2 + passed: true + comment: Y-axis title "Net Satisfaction Score" is descriptive but lacks units + - id: VQ-07 + name: Grid & Legend + score: 1 + max: 2 + passed: true + comment: Grid is subtle, legend disabled (appropriate for single series) + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct diverging bar chart with bars extending both directions from + zero + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Categories on Y-axis, values on X-axis correctly assigned + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Has contrasting colors, horizontal orientation, zero baseline indicator, + data sorted by value + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: Axes show all data with appropriate min/max (-50 to 60) + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend disabled appropriately for single-series chart + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: Correctly uses "bar-diverging · highcharts · pyplots.ai" + data_quality: + score: 19 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 8 + max: 8 + passed: true + comment: Shows both positive and negative values with good spread + - id: DQ-02 + name: Realistic Context + score: 6 + max: 7 + passed: true + comment: Customer satisfaction survey is plausible, though scores could be + more varied + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: Net satisfaction scores from -38 to +45 are realistic + code_quality: + score: 9 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Linear flow: imports → data → plot → save' + - id: CQ-02 + name: Reproducibility + score: 2 + max: 3 + passed: true + comment: Data is deterministic (hardcoded), but no random seed needed + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: All imports are used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current Highcharts API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: true + comment: Uses Highcharts plotLines for zero baseline, data labels, but could + leverage more interactive features + verdict: APPROVED diff --git a/plots/bar-diverging/metadata/letsplot.yaml b/plots/bar-diverging/metadata/letsplot.yaml index 212164d1dd..0349fb8088 100644 --- a/plots/bar-diverging/metadata/letsplot.yaml +++ b/plots/bar-diverging/metadata/letsplot.yaml @@ -25,3 +25,178 @@ review: - Could add interactive tooltips to leverage lets-plot interactive capabilities in the HTML output - Data distribution slightly unbalanced (only 4 negative vs 8 positive categories) + image_description: 'The plot displays a horizontal diverging bar chart showing Net + Promoter Scores for 12 customer satisfaction categories. Bars extend left (red, + #DC2626) for negative scores and right (blue, #306998) for positive scores from + a clear vertical baseline at zero. Categories are sorted by score from lowest + (Mobile App at -35) to highest (Product Quality at +72). The title "bar-diverging + · letsplot · pyplots.ai" appears at top center in bold. X-axis is labeled "Net + Promoter Score" and Y-axis is labeled "Category". A legend on the right shows + "Sentiment" with Negative (red) and Positive (blue) indicators. The layout is + clean with a minimal theme, subtle grid lines on the x-axis only, and good use + of whitespace.' + criteria_checklist: + visual_quality: + score: 37 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title is large and bold, axis labels and tick marks are all clearly + readable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text, category labels are well-spaced horizontally + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bars are well-sized with appropriate width and alpha for clear visibility + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Red/blue is colorblind-safe (distinguishable even with red-green + colorblindness) + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Good use of canvas space, balanced margins, legend positioned appropriately + - id: VQ-06 + name: Axis Labels + score: 1 + max: 2 + passed: false + comment: Labels are descriptive but "Net Promoter Score" could include units + or range indicator + - id: VQ-07 + name: Grid & Legend + score: 2 + max: 2 + passed: true + comment: Grid is subtle (only on x-axis), legend is well-placed and doesn't + overlap data + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct diverging bar chart with bars extending in opposite directions + from zero + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Categories on Y-axis, values on X-axis, correctly mapped + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Has contrasting colors, horizontal orientation, zero baseline indicator, + sorted bars + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: All data visible, range from -40 to +70 shown appropriately + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend correctly identifies Negative/Positive sentiment + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: Exact format "bar-diverging · letsplot · pyplots.ai" + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 8 + max: 8 + passed: true + comment: Shows both positive and negative values with good distribution (4 + negative, 8 positive) + - id: DQ-02 + name: Realistic Context + score: 5 + max: 7 + passed: true + comment: Customer satisfaction NPS data is plausible, though slightly more + negative categories could improve balance + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: NPS scores from -35 to +72 are realistic for the -100 to +100 scale + code_quality: + score: 9 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Simple script: imports → data → plot → save, no functions/classes' + - id: CQ-02 + name: Reproducibility + score: 2 + max: 3 + passed: false + comment: Data is deterministic (hardcoded), but no random seed comment for + clarity + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: All imports are used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current lets-plot API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png and plot.html + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: false + comment: Uses ggplot grammar correctly with geom_bar, geom_vline, scale_fill_manual, + and theme customization. Could leverage more lets-plot specific features + like tooltips for interactivity. + verdict: APPROVED diff --git a/plots/bar-diverging/metadata/matplotlib.yaml b/plots/bar-diverging/metadata/matplotlib.yaml index 212efb0551..7ea4a26fda 100644 --- a/plots/bar-diverging/metadata/matplotlib.yaml +++ b/plots/bar-diverging/metadata/matplotlib.yaml @@ -23,3 +23,171 @@ review: weaknesses: - X-axis label could include context (e.g., Net Satisfaction Score (%)) to clarify the measurement scale + image_description: 'The plot displays a horizontal diverging bar chart showing product + satisfaction survey scores for 12 categories. Blue bars (#306998) extend rightward + from the zero baseline for positive satisfaction scores (satisfied), while yellow + bars (#FFD43B) extend leftward for negative scores (dissatisfied). Categories + are sorted by value from lowest (Mobile App: -52) at the bottom to highest (Brand + Trust: +85) at the top. Each bar has a bold value label at its end showing the + score with +/- sign. A clear vertical black line marks the zero baseline. The + title "bar-diverging · matplotlib · pyplots.ai" appears at the top. A legend in + the lower right explains "Positive (Satisfied)" and "Negative (Dissatisfied)". + Subtle dashed gridlines appear on the x-axis. The x-axis is labeled "Net Satisfaction + Score" with range from -100 to +100.' + criteria_checklist: + visual_quality: + score: 38 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title 24pt, labels 20pt, ticks 16pt, all perfectly readable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text anywhere + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bar height 0.7 optimal for 12 categories + - id: VQ-04 + name: Color Accessibility + score: 4 + max: 5 + passed: true + comment: Blue/yellow colorblind-safe but not ideal (blue/orange would be better) + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Excellent canvas utilization, balanced margins + - id: VQ-06 + name: Axis Labels + score: 1 + max: 2 + passed: true + comment: '"Net Satisfaction Score" descriptive but unitless' + - id: VQ-07 + name: Grid & Legend + score: 2 + max: 2 + passed: true + comment: Subtle dashed grid (alpha 0.3), well-placed legend + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct diverging bar chart + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Categories on Y-axis, values on X-axis + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: 'All spec features present: contrasting colors, horizontal orientation, + zero baseline indicator, sorted by value' + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: Full range visible with appropriate padding + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Labels correctly describe positive/negative + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: 'Uses correct format: bar-diverging · matplotlib · pyplots.ai' + data_quality: + score: 20 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 8 + max: 8 + passed: true + comment: Shows both positive AND negative values with good variation in magnitudes + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Product satisfaction survey with plausible categories (Customer Support, + Pricing, Mobile App, etc.) + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: Values in -100 to +100 range as specified in spec + code_quality: + score: 10 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Clean flow: imports → data → plot → save (no functions/classes)' + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: np.random.seed(42) used + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: All imports used (matplotlib.pyplot, numpy, Patch) + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: No outdated functions + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png + library_features: + score: 4 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 4 + max: 5 + passed: true + comment: Good use of barh, axvline, spines manipulation, Patch for custom + legend + verdict: APPROVED diff --git a/plots/bar-diverging/metadata/plotly.yaml b/plots/bar-diverging/metadata/plotly.yaml index d450c142cc..a86df9d0fb 100644 --- a/plots/bar-diverging/metadata/plotly.yaml +++ b/plots/bar-diverging/metadata/plotly.yaml @@ -23,3 +23,180 @@ review: - Missing legend to explain color coding (blue=satisfied, yellow=dissatisfied) - X-axis label could include units like Satisfaction Score (NPS-style -100 to +100) - Data values could include more extreme scores closer to ±100 for fuller demonstration + image_description: The plot displays a horizontal diverging bar chart showing customer + satisfaction survey results across 10 departments. Blue bars (#306998) extend + rightward from the zero baseline for positive scores, while yellow/gold bars (#FFD43B) + extend leftward for negative scores. The data is sorted by value from highest + (Customer Support at +72) at the top to lowest (Return Policy at -42) at the bottom. + Each bar displays its value with +/- sign positioned outside the bar. A clear + dark vertical line marks the zero baseline. The x-axis spans -100 to +100 with + tick marks at 25-point intervals. Title reads "Customer Satisfaction Survey · + bar-diverging · plotly · pyplots.ai" centered at top. The layout uses a clean + white template with subtle gridlines. + criteria_checklist: + visual_quality: + score: 36 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title at 28pt, axis labels at 22pt, tick fonts at 18pt, value labels + at 16pt - all clearly readable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements, all labels fully readable + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bars well-sized with good spacing (bargap=0.3), white borders provide + separation + - id: VQ-04 + name: Color Accessibility + score: 4 + max: 5 + passed: true + comment: Blue/yellow is colorblind-safe, though yellow on white could have + slightly better contrast + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Good proportions, plot fills canvas well with appropriate margins + - id: VQ-06 + name: Axis Labels + score: 1 + max: 2 + passed: true + comment: '"Satisfaction Score" is descriptive but lacks units; "Department" + is appropriate' + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: true + comment: Grid is subtle (good), but no legend explaining color meaning (blue=positive, + yellow=negative) + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct diverging bar chart with bars extending in opposite directions + from zero + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Categories on Y-axis, values on X-axis correctly assigned + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Has contrasting colors, horizontal orientation, zero baseline, sorted + by value + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: X-axis range [-100, 100] shows all data appropriately + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: N/A for this chart type, colors are self-explanatory with +/- values + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: 'Uses correct format: "Customer Satisfaction Survey · bar-diverging + · plotly · pyplots.ai"' + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 8 + max: 8 + passed: true + comment: Shows both positive (6 categories) and negative (4 categories) values + with good range of magnitudes + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Customer satisfaction survey is a perfect real-world use case for + diverging bars + - id: DQ-03 + name: Appropriate Scale + score: 3 + max: 5 + passed: true + comment: Values are plausible but could be more varied (no extreme values + near ±100) + code_quality: + score: 8 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Clean linear flow: imports → data → sort → plot → save' + - id: CQ-02 + name: Reproducibility + score: 0 + max: 3 + passed: false + comment: No random seed, but data is deterministic (hardcoded values) - this + is acceptable + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: Only `plotly.graph_objects` imported, which is used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current Plotly API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png and plot.html + library_features: + score: 5 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 5 + max: 5 + passed: true + comment: Uses go.Bar with orientation, add_vline, proper layout configuration, + write_html for interactivity + verdict: APPROVED diff --git a/plots/bar-diverging/metadata/plotnine.yaml b/plots/bar-diverging/metadata/plotnine.yaml index bc1b82ff51..a504f6e121 100644 --- a/plots/bar-diverging/metadata/plotnine.yaml +++ b/plots/bar-diverging/metadata/plotnine.yaml @@ -24,3 +24,183 @@ review: - Legend placement could be closer to the plot area to reduce whitespace on the right - Could use a diverging Brewer palette (e.g., RdBu) for better colorblind accessibility + image_description: The plot displays a horizontal diverging bar chart showing customer + satisfaction survey results across 12 product categories. Blue bars extend to + the right for positive net satisfaction scores (Mobile App at ~72%, Customer Service + at ~45%, Website at ~38%, Delivery Speed at ~25%, Product Quality at ~18%, Pricing + at ~8%), while coral/red bars extend to the left for negative scores (Return Policy + at ~-5%, Packaging at ~-12%, Email Support at ~-22%, Chat Support at ~-35%, Documentation + at ~-48%, Warranty at ~-62%). A clear vertical baseline at zero separates positive + from negative values. The title "bar-diverging · plotnine · pyplots.ai" is centered + at the top. The Y-axis is labeled "Product Category" and the X-axis is labeled + "Net Satisfaction Score (%)". A legend on the right shows "Sentiment" with Negative + (coral) and Positive (blue) indicators. The bars are sorted by value from highest + (Mobile App) to lowest (Warranty), and the layout uses a clean minimal theme with + subtle gridlines. + criteria_checklist: + visual_quality: + score: 38 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title at 24pt, axis labels at 20pt, tick labels at 16pt - all perfectly + readable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements, horizontal orientation prevents label + crowding + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bar width of 0.7 is well-suited for 12 categories, all bars clearly + visible + - id: VQ-04 + name: Color Accessibility + score: 4 + max: 5 + passed: true + comment: Blue/coral contrast is good but not ideal colorblind-safe palette + (blue-orange would be slightly better) + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Plot fills canvas well with good margins, legend positioned appropriately + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: '"Net Satisfaction Score (%)" includes units, "Product Category" + is descriptive' + - id: VQ-07 + name: Grid & Legend + score: 1 + max: 2 + passed: true + comment: Grid is subtle at alpha=0.3, but legend could be positioned better + (closer to the plot) + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct diverging bar chart with bars extending from central baseline + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Categories on Y-axis, values on X-axis correctly mapped + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Zero baseline visible, contrasting colors, horizontal orientation, + sorted by value + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: Full range from -62 to +72 displayed correctly + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: '"Positive" and "Negative" labels correctly match bar colors' + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: Uses exact format "bar-diverging · plotnine · pyplots.ai" + data_quality: + score: 19 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 8 + max: 8 + passed: true + comment: Shows both positive and negative values with good spread, 6 positive + and 6 negative categories + - id: DQ-02 + name: Realistic Context + score: 6 + max: 7 + passed: true + comment: Customer satisfaction survey is plausible, though some category pairings + are slightly arbitrary + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: Values range from -62 to +72, realistic for net satisfaction scores + (-100 to +100 range) + code_quality: + score: 9 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Simple linear structure: imports → data → plot → save' + - id: CQ-02 + name: Reproducibility + score: 2 + max: 3 + passed: true + comment: Deterministic data (no random), but no seed statement for future + proofing + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: All imports are used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Current plotnine API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as 'plot.png' + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: true + comment: Uses ggplot grammar with geom_bar, coord_flip, scale_fill_manual, + theme customization - solid plotnine usage but nothing exceptional like + facets or statistical layers + verdict: APPROVED diff --git a/plots/bar-diverging/metadata/pygal.yaml b/plots/bar-diverging/metadata/pygal.yaml index ee661cae05..1e21fac249 100644 --- a/plots/bar-diverging/metadata/pygal.yaml +++ b/plots/bar-diverging/metadata/pygal.yaml @@ -24,3 +24,183 @@ review: - Font sizes deviate from library template defaults though they work well for the canvas size - Legend could be positioned closer to the chart area to reduce empty space + image_description: The plot displays a horizontal diverging bar chart showing customer + satisfaction survey results across 10 departments. Bars extend left (coral/salmon + color, -12 to -45) for dissatisfied and right (blue, +31 to +72) for satisfied + scores. The chart uses a white background with clear category labels on the left + Y-axis (Customer Support, Response Time, Website Experience, etc.), numerical + value labels centered within each bar with +/- signs, and an X-axis showing Satisfaction + Score ranging from -100 to +100. The title "Customer Satisfaction Survey · bar-diverging + · pygal · pyplots.ai" appears at the top. A legend at the bottom shows "Satisfied" + (blue) and "Dissatisfied" (coral). Data is sorted by value from highest (Customer + Support +72) to lowest (Return Process -45). + criteria_checklist: + visual_quality: + score: 36 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 9 + max: 10 + passed: true + comment: Title, labels, and values are clearly readable. Font sizes are appropriate + for the 4800×2700 canvas. + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text; horizontal orientation works perfectly with + category labels. + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bars are well-sized, values displayed in center are clearly visible. + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Blue (#306998) vs coral (#E07A5F) provides excellent colorblind-safe + contrast. + - id: VQ-05 + name: Layout Balance + score: 4 + max: 5 + passed: true + comment: Good use of canvas space, though some empty area on the right side. + - id: VQ-06 + name: Axis Labels + score: 1 + max: 2 + passed: true + comment: X-axis has "Satisfaction Score" but no units specified (though implicit + -100 to +100 scale). + - id: VQ-07 + name: Grid & Legend + score: 1 + max: 2 + passed: true + comment: X-guides are visible and helpful; legend at bottom is clear but could + be positioned closer to the chart. + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct diverging bar chart with bars extending in opposite directions + from zero. + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Categories on Y-axis, values on X-axis correctly mapped. + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Zero baseline clear, contrasting colors for pos/neg, horizontal orientation, + sorted by value. + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: Range set to -100 to +100, all data visible. + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend correctly identifies Satisfied/Dissatisfied. + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: 'Uses correct format: `{title} · bar-diverging · pygal · pyplots.ai`.' + data_quality: + score: 20 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 8 + max: 8 + passed: true + comment: Excellent mix of positive and negative values, varying magnitudes. + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Customer satisfaction survey is a perfect real-world use case. + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: Scores from -45 to +72 are realistic for a satisfaction scale. + code_quality: + score: 7 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Clean linear flow: imports → data → sort → style → chart → save.' + - id: CQ-02 + name: Reproducibility + score: 0 + max: 3 + passed: false + comment: No random seed, but data is deterministic (hardcoded), so this is + actually fine. Full points. + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Data is hardcoded/deterministic. + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: Only pygal and Style imported, both used. + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current pygal API. + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: false + comment: Saves as `plot.png` and `plot.html`. + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: true + comment: Good use of pygal's HorizontalBar, custom Style, print_values, value_formatter + with signed numbers, and dual output (PNG + HTML). However, could leverage + more interactive features. + verdict: APPROVED diff --git a/plots/bar-diverging/metadata/seaborn.yaml b/plots/bar-diverging/metadata/seaborn.yaml index 4b8dfe1f06..e9d88843b3 100644 --- a/plots/bar-diverging/metadata/seaborn.yaml +++ b/plots/bar-diverging/metadata/seaborn.yaml @@ -26,3 +26,180 @@ review: left instead - Data scenario is somewhat generic - could use more specific real-world context (e.g., specific industry or year) + image_description: The plot shows a horizontal diverging bar chart displaying Net + Promoter Scores by Department. The chart features 12 departments on the y-axis + (Operations at top, Sales at bottom) sorted by NPS score from lowest to highest. + Bars extend left (negative/yellow) or right (positive/blue) from a central black + vertical baseline at zero. Blue bars represent "Positive (Promoters)" ranging + from +8 to +62, while yellow/gold bars represent "Negative (Detractors)" ranging + from -8 to -45. Each bar has a value label showing the score (e.g., +55, -32). + The title is "bar-diverging · seaborn · pyplots.ai" in bold at the top. X-axis + shows "Net Promoter Score" from -60 to 80, Y-axis shows "Department". A legend + in the lower right explains the color coding. Grid lines are subtle dashed vertical + lines. + criteria_checklist: + visual_quality: + score: 38 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title 24pt bold, axis labels 20pt, tick labels 16pt, value labels + 14pt - all perfectly readable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text, department labels well spaced, value labels + positioned outside bars + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bars are appropriately sized for 12 categories, clear distinction + between bars + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Blue (#306998) and yellow (#FFD43B) are colorblind-safe, high contrast + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Plot fills canvas well, balanced margins, legend positioned appropriately + - id: VQ-06 + name: Axis Labels + score: 1 + max: 2 + passed: true + comment: '"Net Promoter Score" and "Department" are descriptive but lack units + (NPS is unitless, so acceptable)' + - id: VQ-07 + name: Grid & Legend + score: 1 + max: 2 + passed: true + comment: Grid is subtle (alpha=0.3, dashed), legend well placed but slightly + overlaps with Sales bar area + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct diverging bar chart with bars extending in opposite directions + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Categories on Y-axis, values on X-axis, correctly implemented + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: 'All spec features present: contrasting colors, horizontal orientation, + zero baseline, sorted bars' + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: X-axis shows full range (-70 to 80), all data visible + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend correctly identifies Positive (Promoters) and Negative (Detractors) + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: Exact format "bar-diverging · seaborn · pyplots.ai" + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 8 + max: 8 + passed: true + comment: Shows both positive and negative values, good range of magnitudes, + variety of departments + - id: DQ-02 + name: Realistic Context + score: 5 + max: 7 + passed: true + comment: NPS by department is plausible but somewhat generic; real companies + rarely have such wide NPS variation between departments + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: NPS scores ranging from -45 to +62 are realistic (NPS ranges from + -100 to +100) + code_quality: + score: 9 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Simple linear flow: imports → data → plot → save' + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: np.random.seed(42) set (though data is hardcoded) + - id: CQ-03 + name: Clean Imports + score: 1 + max: 2 + passed: true + comment: All imports used, but numpy seed not strictly necessary since data + is hardcoded + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses modern seaborn API with hue parameter + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png with correct dpi and bbox_inches + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: true + comment: Uses seaborn's barplot correctly with hue parameter for modern API, + but doesn't leverage seaborn-specific features like statistical aggregation + or built-in themes + verdict: APPROVED diff --git a/plots/bar-error/metadata/altair.yaml b/plots/bar-error/metadata/altair.yaml index 73b8bff34d..e21ffe5336 100644 --- a/plots/bar-error/metadata/altair.yaml +++ b/plots/bar-error/metadata/altair.yaml @@ -23,3 +23,170 @@ review: - No tooltips for interactivity - Altair strength is interactive visualization - Only symmetric error bars shown; asymmetric example would demonstrate fuller feature coverage + image_description: 'The plot displays a bar chart with 5 blue bars (#306998) representing + treatment groups: Control, Drug A, Drug B, Drug C, and Combination. The x-axis + is labeled "Treatment Group" and the y-axis "Response Rate (%)" with a scale from + 0-100. Each bar features black error bars with clearly visible caps at both top + and bottom ends. The title "bar-error · altair · pyplots.ai" is centered at the + top. An annotation "Error bars: ±1 SD" is positioned in the upper right corner. + The background has subtle gray gridlines (alpha 0.3), and all text elements are + clearly readable with appropriate font sizes.' + criteria_checklist: + visual_quality: + score: 36 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title at 28pt, axis labels at 22pt, tick labels at 18pt - all perfectly + readable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements, category labels are well-spaced + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bars well-sized (size=60), error bars clearly visible with 3px stroke + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Single color scheme, no colorblind issues + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Plot fills canvas well, balanced margins + - id: VQ-06 + name: Axis Labels + score: 1 + max: 2 + passed: false + comment: '"Response Rate (%)" has units, but no units needed for categorical + x-axis' + - id: VQ-07 + name: Grid & Legend + score: 1 + max: 2 + passed: false + comment: Grid is subtle (0.3 alpha), but no legend (annotation used instead, + which is acceptable) + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct bar chart type + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Categories on X, values on Y correctly assigned + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Error bars with caps present, annotation explaining error bars included + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: Y-axis 0-100 shows all data appropriately + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: 'Annotation "Error bars: ±1 SD" clearly explains error representation' + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: 'Uses correct format: "bar-error · altair · pyplots.ai"' + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 6 + max: 8 + passed: true + comment: Shows variation in response rates and error magnitudes, but all symmetric + errors (no asymmetric example) + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Scientific drug treatment comparison is a perfect real-world scenario + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: Response rates 45-82% with SD 8-15% are realistic for treatment studies + code_quality: + score: 10 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Linear structure: imports → data → plot layers → save' + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Deterministic data (no random generation) + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: Only altair and pandas imported, both used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current Altair API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png and plot.html + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: false + comment: Good use of layered chart composition (bars + error_bars + caps + + annotation), but could add interactivity with tooltips + verdict: APPROVED diff --git a/plots/bar-error/metadata/bokeh.yaml b/plots/bar-error/metadata/bokeh.yaml index bdae46fbbb..70f3823022 100644 --- a/plots/bar-error/metadata/bokeh.yaml +++ b/plots/bar-error/metadata/bokeh.yaml @@ -23,3 +23,173 @@ review: - Error bars annotation appears partially cut off at right edge - Only symmetric error bars shown; spec mentions asymmetric errors as a feature - Grid alpha could be more subtle + image_description: 'The plot displays a vertical bar chart with 5 product categories + (Electronics, Clothing, Home & Garden, Sports, Books) on the x-axis and Quarterly + Revenue in millions on the y-axis. Bars are rendered in a medium blue color (#306998) + with dark outlines. Each bar has black error bars with visible horizontal caps + (TeeHead style) at both ends, representing ±1 standard deviation. The title "bar-error + · bokeh · pyplots.ai" appears in the top-left. An annotation "Error bars: ±1 SD" + is visible in the top-right corner. The background is light gray (#fafafa) with + subtle dashed horizontal grid lines. Y-axis starts at 0 and extends to ~108. All + text is legible and well-sized.' + criteria_checklist: + visual_quality: + score: 36 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title at 42pt, axis labels at 32pt, tick labels at 24-26pt - all + clearly readable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bars well-sized, error bars with line_width=5 and TeeHead size=40 + are clearly visible + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Single blue color scheme, no colorblind issues + - id: VQ-05 + name: Layout Balance + score: 3 + max: 5 + passed: true + comment: Good use of canvas but right margin slightly large due to annotation + positioning + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: '"Product Category" and "Quarterly Revenue ($ millions)" - descriptive + with units' + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: true + comment: No legend present (not strictly needed), but annotation for error + bar meaning is cut off at the edge + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct bar chart with error bars + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Categories on X, values on Y, errors correctly mapped + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Error bars have visible caps, annotation explains what they represent + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: Y-axis starts at 0, shows all data including error bar extensions + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Annotation correctly states "±1 SD" + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: Uses correct format "bar-error · bokeh · pyplots.ai" + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 6 + max: 8 + passed: true + comment: Shows variation in bar heights and different error magnitudes, but + all errors are symmetric (spec mentions asymmetric errors as a feature) + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Quarterly revenue by product category is a realistic business scenario + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: Revenue values ($35-85M) and standard deviations ($4-9M) are realistic + code_quality: + score: 10 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Linear script: imports → data → plot → save' + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: np.random.seed(42) set + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: All imports are used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current Bokeh API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png and plot.html + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: true + comment: Uses ColumnDataSource, Whisker with TeeHead for error bars, Label + for annotation - good Bokeh idioms but could leverage more interactive features + verdict: APPROVED diff --git a/plots/bar-error/metadata/highcharts.yaml b/plots/bar-error/metadata/highcharts.yaml index e4dd9af6c0..d26c9ee282 100644 --- a/plots/bar-error/metadata/highcharts.yaml +++ b/plots/bar-error/metadata/highcharts.yaml @@ -25,3 +25,180 @@ review: not visible in the rendered image - Could demonstrate asymmetric error bars to fully showcase the capability mentioned in spec + image_description: 'The plot displays a vertical bar chart with 5 blue columns (#306998) + representing treatment groups: Control, Treatment A, Treatment B, Treatment C, + and Treatment D. Each bar has black error bars with visible caps (whiskers) extending + above and below the bar tops. The title "bar-error · highcharts · pyplots.ai" + appears at the top in bold, with a subtitle "Error bars represent ±1 Standard + Deviation" below it. The y-axis is labeled "Response Value (units)" ranging from + 0 to ~80, and the x-axis is labeled "Treatment Group". A legend showing "Mean + Value" appears in the top-right corner. The grid uses subtle dashed horizontal + lines. Treatment C shows the highest value (~68), while Control shows the lowest + (~42).' + criteria_checklist: + visual_quality: + score: 36 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 9 + max: 10 + passed: true + comment: Title, axis labels, and tick marks are all clearly readable. Font + sizes are appropriate for the 4800x2700 canvas. + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements; all labels are fully readable + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bars are well-sized, error bars have visible caps/whiskers, good + contrast + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Uses colorblind-safe blue (#306998) with dark error bars; no red-green + issues + - id: VQ-05 + name: Layout Balance + score: 4 + max: 5 + passed: true + comment: Good use of canvas space; minor issue with legend only showing "Mean + Value" (missing error bar legend entry in visible legend) + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: 'Descriptive labels with units: "Response Value (units)" and "Treatment + Group"' + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: true + comment: Grid is subtle with dashed lines (good), but legend is incomplete + - only shows "Mean Value", the "Error (±1 SD)" entry defined in code is + not visible in the screenshot + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct bar chart with error bars + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Categories on X-axis, values on Y-axis correctly mapped + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Error bars with visible caps, subtitle explaining error bar meaning + (±1 SD) + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: Y-axis starts at 0 and shows all data including error bar ranges + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend labels match data series + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: 'Correct format: "bar-error · highcharts · pyplots.ai"' + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 6 + max: 8 + passed: true + comment: Shows variation in bar heights and different error magnitudes. Missing + asymmetric error bars which spec mentions as optional + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Treatment comparison with control group is a plausible scientific + experiment scenario + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: Values (42-68 range) and errors (4.8-8.3) are realistic for experimental + data + code_quality: + score: 8 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Simple linear structure: imports → data → chart config → render' + - id: CQ-02 + name: Reproducibility + score: 1 + max: 3 + passed: false + comment: Uses deterministic data (no random), but no seed comment. The data + is hardcoded which is reproducible. + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: All imports are used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current highcharts-core API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png and plot.html + library_features: + score: 4 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 4 + max: 5 + passed: true + comment: Uses Highcharts errorbar series type, highcharts-more.js module, + proper whisker configuration, interactive HTML output + verdict: APPROVED diff --git a/plots/bar-error/metadata/letsplot.yaml b/plots/bar-error/metadata/letsplot.yaml index 95f4aaf6b5..4166e5d8dc 100644 --- a/plots/bar-error/metadata/letsplot.yaml +++ b/plots/bar-error/metadata/letsplot.yaml @@ -23,3 +23,176 @@ review: - The alternating blue/yellow color scheme is decorative rather than informative; colors could encode a meaningful variable - Grid could benefit from a subtle alpha setting + image_description: 'The plot displays a bar chart with 5 vertical bars representing + A/B test groups: Control, Variant A, Variant B, Variant C, and Variant D. The + bars alternate between Python blue (#306998) and yellow (#FFD43B) colors. Each + bar has clearly visible black error bars with horizontal caps at both ends, indicating + the 95% confidence intervals. The Y-axis is labeled "Conversion Rate (%)" and + ranges from 0 to 19. The X-axis is labeled "Test Group" with category names below + each bar. The title "bar-error · letsplot · pyplots.ai" appears at the top left. + A caption "Error bars show 95% CI" is positioned at the bottom right, explaining + what the error bars represent. The minimal theme provides a clean look with subtle + gridlines on the Y-axis only.' + criteria_checklist: + visual_quality: + score: 37 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title, axis labels, and tick labels are all clearly readable at the + target resolution + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements; category labels are well-spaced + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bars are appropriately sized, error bars are clearly visible with + proper caps + - id: VQ-04 + name: Color Accessibility + score: 4 + max: 5 + passed: true + comment: Blue/yellow is colorblind-friendly, though the alternating pattern + doesn't convey meaning + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Good use of canvas space, balanced margins + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: Both axes have descriptive labels with units ("Conversion Rate (%)", + "Test Group") + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: false + comment: No legend present (show_legend=False), but also no semantic meaning + to the colors + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct bar chart with error bars + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Categories on X, values on Y, error bars correctly positioned + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Error bars have visible caps, caption explains error representation + (95% CI) + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: Y-axis starts at 0, shows all data including error bar extents + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: N/A (no legend needed for this use case, colors are decorative) + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: 'Correct format: "bar-error · letsplot · pyplots.ai"' + data_quality: + score: 17 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 6 + max: 8 + passed: true + comment: Shows asymmetric error bars, variation in bar heights, but colors + don't encode meaningful data + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: A/B test conversion rates is a plausible, real-world scenario + - id: DQ-03 + name: Appropriate Scale + score: 4 + max: 5 + passed: true + comment: Conversion rates of 11-17% are realistic; error magnitudes (1-2%) + are reasonable for typical sample sizes + code_quality: + score: 10 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Simple linear structure: imports → data → plot → save' + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Deterministic data (no random generation) + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: All imports are used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current lets-plot API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png and plot.html + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: true + comment: Uses ggplot grammar (geom_bar, geom_errorbar, theme_minimal), but + doesn't leverage lets-plot specific interactive features in the static output + verdict: APPROVED diff --git a/plots/bar-error/metadata/matplotlib.yaml b/plots/bar-error/metadata/matplotlib.yaml index ef19f411d4..d5dc0c879e 100644 --- a/plots/bar-error/metadata/matplotlib.yaml +++ b/plots/bar-error/metadata/matplotlib.yaml @@ -27,3 +27,173 @@ review: being more integrated with the plot - Basic library usage without leveraging advanced matplotlib features like bar_label() for showing values + image_description: 'The plot displays a bar chart with 5 blue vertical bars representing + A/B test groups (Control, Variant A, Variant B, Variant C, Variant D). Each bar + has dark blue error bars with visible caps extending above and below the bar tops. + The bars use a consistent blue color (#306998) with darker edge color (#1e4466). + The y-axis shows "Conversion Rate (%)" ranging from 0 to approximately 24, and + the x-axis shows "Test Group". The title follows the required format "bar-error + · matplotlib · pyplots.ai". A small annotation box in the bottom-right corner + states "Error bars: 95% CI". The grid is subtle with horizontal dashed lines at + alpha 0.3.' + criteria_checklist: + visual_quality: + score: 37 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title at 24pt, axis labels at 20pt, tick labels at 16pt - all perfectly + readable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bars and error bars are clearly visible with appropriate sizing + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Single color scheme, no colorblind issues + - id: VQ-05 + name: Layout Balance + score: 4 + max: 5 + passed: true + comment: 'Good proportions, plot fills canvas well, minor: could use slightly + more vertical space' + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: 'Descriptive with units: "Conversion Rate (%)"' + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: true + comment: Grid is subtle and appropriate, but the annotation box placement + in bottom-right corner is not optimal (sits in empty space rather than near + legend position) + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct bar chart with error bars + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Categories on X, values on Y correctly assigned + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Error bars with visible caps, annotation explaining error bar meaning + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: Y-axis shows all data with appropriate headroom (0 to ~24) + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Annotation accurately describes "95% CI" + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: 'Correct format: "bar-error · matplotlib · pyplots.ai"' + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 6 + max: 8 + passed: true + comment: Shows varying bar heights and different error magnitudes, but all + errors are symmetric (spec mentions asymmetric errors as an option) + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: A/B test conversion rates is a realistic, comprehensible scenario + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: Conversion rates of 11-18% with CI widths of 1-3% are realistic + code_quality: + score: 10 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: Clean imports → data → plot → save structure, no functions/classes + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Uses np.random.seed(42) + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: Only matplotlib and numpy, both used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current matplotlib API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png + library_features: + score: 2 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 2 + max: 5 + passed: true + comment: Uses ax.bar() and ax.errorbar() correctly, but these are basic matplotlib + features. Could have used more advanced features like bar_label() for value + annotations or customized error bar styling + verdict: APPROVED diff --git a/plots/bar-error/metadata/plotly.yaml b/plots/bar-error/metadata/plotly.yaml index 9a0d763faa..b237931d76 100644 --- a/plots/bar-error/metadata/plotly.yaml +++ b/plots/bar-error/metadata/plotly.yaml @@ -27,3 +27,178 @@ review: interaction - Error magnitude variation across groups is relatively uniform - more dramatic differences would better showcase the feature + image_description: 'The plot shows a bar chart with 5 blue bars (#306998) representing + treatment groups: Control, Treatment A, Treatment B, Treatment C, and Treatment + D. Each bar has dark vertical error bars with horizontal caps at the ends indicating + asymmetric standard deviations. The y-axis shows "Response Value (%)" ranging + from 0-90, and the x-axis shows "Treatment Group". The title reads "Lab Treatment + Results · bar-error · plotly · pyplots.ai" centered at the top. An annotation + in the upper right corner states "Error bars: ±1 SD (asymmetric)". The plot uses + a clean white background with subtle horizontal grid lines. Treatment C has the + highest response (~72%) with the largest error range, while Control has the lowest + (~45%).' + criteria_checklist: + visual_quality: + score: 37 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title at 32pt, axis labels at 24pt, tick labels at 20pt - all perfectly + readable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text anywhere, category labels well-spaced + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bars clearly visible, error bars with thick lines (3px) and wide + caps (12px) + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Single blue color scheme, no colorblind issues + - id: VQ-05 + name: Layout Balance + score: 4 + max: 5 + passed: true + comment: Good proportions, slight excess whitespace at bottom + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: Y-axis has units "Response Value (%)", X-axis descriptive "Treatment + Group" + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: true + comment: Grid is subtle (alpha 0.1), but no legend shown (showlegend=False) + - annotation explains error bars but a legend entry would be cleaner + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct bar chart with error bars + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Categories on X, values on Y, errors correctly applied + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Error bars have caps, annotation explains error representation, asymmetric + errors demonstrated + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: Y-axis range [0, 90] shows all data with headroom for error bars + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Annotation accurately describes "±1 SD (asymmetric)" + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: 'Follows exact format: "Lab Treatment Results · bar-error · plotly + · pyplots.ai"' + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 6 + max: 8 + passed: true + comment: Shows asymmetric errors and variation across groups, but could show + more dramatic differences in error magnitudes + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Lab treatment experiment is a perfect real-world scenario for error + bars + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: Response values 45-72% with errors 4-8% are realistic for treatment + studies + code_quality: + score: 10 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Simple linear flow: imports → data → figure → layout → save' + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: np.random.seed(42) set + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: Only numpy and plotly.graph_objects imported + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current Plotly API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png and plot.html + library_features: + score: 2 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 2 + max: 5 + passed: false + comment: Uses go.Bar with error_y correctly, but doesn't leverage Plotly's + interactive features (hover templates, animations) or Express API for simpler + code + verdict: APPROVED diff --git a/plots/bar-error/metadata/plotnine.yaml b/plots/bar-error/metadata/plotnine.yaml index 05218c0aa7..70b7a25bfd 100644 --- a/plots/bar-error/metadata/plotnine.yaml +++ b/plots/bar-error/metadata/plotnine.yaml @@ -26,3 +26,176 @@ review: color mapping would be cleaner - Only symmetric error bars shown (spec mentions asymmetric may be needed for some cases) + image_description: The plot displays a bar chart with 6 survey categories on the + x-axis (Product Quality, Customer Service, Delivery Speed, Price Value, Website + UX, Return Policy) and satisfaction scores (1-5) on the y-axis. Bars alternate + between Python blue (#306998) and gold (#FFD43B) colors. Each bar has black error + bars with horizontal caps representing 95% confidence intervals. The title "bar-error + · plotnine · pyplots.ai" appears in bold at the top. Category labels are rotated + ~25 degrees for readability. A caption "Error bars represent 95% CI" appears in + italics at the bottom right. The layout uses a minimal theme with subtle horizontal + grid lines only. + criteria_checklist: + visual_quality: + score: 36 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title 24pt bold, axis titles 20pt, tick labels appropriately sized, + all perfectly readable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: Rotated x-axis labels prevent overlap, all text fully readable + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bars well-sized, error bars clearly visible with caps + - id: VQ-04 + name: Color Accessibility + score: 4 + max: 5 + passed: true + comment: Blue/yellow is colorblind-safe, but alternating colors don't convey + meaning + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Good proportions, plot fills canvas well + - id: VQ-06 + name: Axis Labels + score: 1 + max: 2 + passed: true + comment: Y-axis has units "(1-5)", X-axis label "Survey Category" is descriptive + but generic + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: true + comment: No legend needed, but grid only on y-axis is good; however caption + is slightly cut off on right edge + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct bar chart with error bars + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Categories on X, values on Y, error bars correctly positioned + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Error bars have visible caps, caption explains error bars represent + 95% CI + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: All data visible, y-axis starts at 0 + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: No legend needed for this visualization + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: Uses correct format "bar-error · plotnine · pyplots.ai" + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 6 + max: 8 + passed: true + comment: Shows varying bar heights and different error magnitudes, but all + symmetric errors (spec mentions asymmetric errors may be needed) + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Customer satisfaction survey is a realistic, comprehensible scenario + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: 1-5 satisfaction scale with values 3.5-4.5 and CI widths 0.2-0.5 + are realistic + code_quality: + score: 9 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: Simple imports → data → plot → save structure, no functions/classes + - id: CQ-02 + name: Reproducibility + score: 2 + max: 3 + passed: true + comment: Data is deterministic but uses hardcoded values (acceptable, but + np.random.seed would show variety) + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: All imports are used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current plotnine API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: true + comment: Uses ggplot grammar with geom_col + geom_errorbar, pd.Categorical + for ordering, theme customization. Could use scale_fill_brewer for more + idiomatic palette usage. + verdict: APPROVED diff --git a/plots/bar-error/metadata/pygal.yaml b/plots/bar-error/metadata/pygal.yaml index b5a326c1e9..56f583a901 100644 --- a/plots/bar-error/metadata/pygal.yaml +++ b/plots/bar-error/metadata/pygal.yaml @@ -23,3 +23,175 @@ review: - Legend placement at bottom-left corner appears disconnected from the chart - Grid lines could be more subtle (currently dotted but still prominent) - Only symmetric error bars shown when spec mentions asymmetric as an option + image_description: The plot displays a bar chart with 5 blue bars representing treatment + groups (Control, Treatment A, Treatment B, Treatment C, Treatment D) on the x-axis. + The y-axis shows "Response Value (units)" ranging from 0 to 100. Each bar has + error bars extending vertically from the top, showing confidence intervals with + horizontal caps at the ends. The bars are a consistent blue color (#306998). The + title reads "bar-error · pygal · pyplots.ai" at the top. A legend at the bottom + left shows "Mean ± 1 SD" with a blue square indicator. The background is white + with subtle horizontal grid lines. Treatment B has the highest value (~78) and + Control has the lowest (~45). + criteria_checklist: + visual_quality: + score: 36 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title, axis labels, tick labels all clearly readable at full size + with appropriate font sizes + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements, all category labels clearly separated + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bars are well-sized, error bars clearly visible with caps + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Single blue color scheme, no colorblind issues + - id: VQ-05 + name: Layout Balance + score: 3 + max: 5 + passed: true + comment: Good proportions but legend placement at bottom-left is slightly + awkward, could be better integrated + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: 'Both axes have descriptive labels with units: "Treatment Group" + and "Response Value (units)"' + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: false + comment: Grid is too prominent (dotted lines visible but not subtle enough), + legend is positioned awkwardly at bottom-left corner + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct bar chart with error bars + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Categories on X-axis, values on Y-axis correctly assigned + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Error bars present with visible caps, legend explains error representation + (±1 SD) + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: Y-axis range 0-100 shows all data appropriately + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend correctly identifies "Mean ± 1 SD" + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: 'Correct format: "bar-error · pygal · pyplots.ai"' + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 6 + max: 8 + passed: true + comment: Shows variation in means and different error magnitudes, but all + errors are symmetric (spec mentions asymmetric as option) + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Scientific experiment comparing treatment groups is a perfect real-world + scenario + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: Values 45-78 with SD of 8-15 are realistic for experimental data + code_quality: + score: 9 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Simple linear structure: imports → data → chart config → save' + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Deterministic data (no random generation) + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: Only pygal and Style imported, both used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current pygal API + - id: CQ-05 + name: Output Correct + score: 0 + max: 1 + passed: false + comment: Saves as plot.png (correct) but strict=True in zip is Python 3.10+ + specific style + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: true + comment: Uses pygal's confidence interval feature with 'ci' dict, custom Style, + but could leverage more interactive/SVG features + verdict: APPROVED diff --git a/plots/bar-error/metadata/seaborn.yaml b/plots/bar-error/metadata/seaborn.yaml index 5b3488f9c4..5319287315 100644 --- a/plots/bar-error/metadata/seaborn.yaml +++ b/plots/bar-error/metadata/seaborn.yaml @@ -27,3 +27,172 @@ review: in the corner - Feature coverage could show more variation (e.g., one notably different group or wider CI range) + image_description: 'The plot displays a bar chart with 6 categories (Control, Variant + A through E) on the x-axis and Conversion Rate (%) on the y-axis ranging from + 0 to ~7.5%. Bars alternate between dark blue (#306998) and golden yellow (#FFD43B) + colors. Each bar has black error bars with visible caps extending vertically to + show 95% confidence intervals. The title "bar-error · seaborn · pyplots.ai" is + prominently displayed at the top in bold. An annotation box in the upper right + corner explains "Error bars: 95% CI". A subtle horizontal dashed grid is visible + behind the bars. The layout is clean with good proportions and all text is clearly + legible.' + criteria_checklist: + visual_quality: + score: 37 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title at 24pt bold, axis labels at 20pt, tick labels at 16pt - all + perfectly readable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements, category labels well-spaced + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bars appropriately sized, error bars clearly visible with prominent + caps + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Blue/yellow alternating pattern is colorblind-safe (not red-green) + - id: VQ-05 + name: Layout Balance + score: 4 + max: 5 + passed: true + comment: Good proportions, plot fills canvas well, minor whitespace at top + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: 'Descriptive with units: "Conversion Rate (%)" and "Test Group"' + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: true + comment: Grid is subtle and appropriate, but annotation placement in corner + could be closer to data + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct bar chart with error bars + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Categories on X-axis, values on Y-axis, errors properly displayed + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Error bars have visible caps, annotation explains error bar meaning + (95% CI), asymmetric errors implemented + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: Y-axis starts at 0, shows all data with headroom + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Annotation accurately describes error bars + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: Exact format "bar-error · seaborn · pyplots.ai" + data_quality: + score: 17 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 6 + max: 8 + passed: true + comment: Shows multiple categories with varying conversion rates and asymmetric + CIs, but all positive/similar magnitude + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: A/B test conversion rates is a real, comprehensible scenario + - id: DQ-03 + name: Appropriate Scale + score: 4 + max: 5 + passed: true + comment: Conversion rates of 4-6% are realistic, error margins appropriate + code_quality: + score: 9 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Linear flow: imports → data → plot → save, no functions/classes' + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Uses np.random.seed(42) + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: All imports used (matplotlib, numpy, pandas, seaborn) + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses modern seaborn API with hue parameter + - id: CQ-05 + name: Output Correct + score: 0 + max: 1 + passed: true + comment: Saves as 'plot.png' correctly + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses seaborn's barplot with proper hue/palette API + score: 3 + max: 5 + passed: true + comment: Uses sns.barplot correctly but error bars added via matplotlib's + errorbar rather than seaborn's native capabilities + verdict: APPROVED diff --git a/plots/bar-feature-importance/metadata/altair.yaml b/plots/bar-feature-importance/metadata/altair.yaml index ba702ddf69..b59f3beee2 100644 --- a/plots/bar-feature-importance/metadata/altair.yaml +++ b/plots/bar-feature-importance/metadata/altair.yaml @@ -21,3 +21,175 @@ review: weaknesses: - Grid opacity at 0.3 could be reduced further (0.2) for subtler appearance - Unnecessary plot.html output alongside plot.png + image_description: 'The plot displays a horizontal bar chart showing feature importance + values for 15 features from a customer analytics model. Bars are colored using + a blue sequential gradient (light to dark) based on importance values. Features + are sorted from lowest importance (social_media_engagement at 0.005) at the top + to highest importance (customer_lifetime_value at 0.182) at the bottom. Each bar + has a black error bar showing standard deviation, and importance values are displayed + as text annotations (3 decimal places) to the right of each bar''s error bar. + The title "bar-feature-importance · altair · pyplots.ai" is positioned at the + top-left. Axis labels are clear: "Feature" on y-axis and "Importance Score" on + x-axis. The grid is subtle with light gray lines.' + criteria_checklist: + visual_quality: + score: 36 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title at 28pt, axis labels at 20pt, tick labels at 16pt, all perfectly + readable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text, feature names are fully visible + - id: VQ-03 + name: Element Visibility + score: 7 + max: 8 + passed: true + comment: Bars are well-sized, error bars visible, though smallest bars are + quite small + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Blue sequential colorscheme is colorblind-safe + - id: VQ-05 + name: Layout Balance + score: 4 + max: 5 + passed: true + comment: Good use of canvas, minor empty space on right side + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: 'Descriptive labels: "Feature" and "Importance Score"' + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: false + comment: No legend (acceptable since no legend needed), but grid could be + slightly more subtle + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct horizontal bar chart + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Features on Y-axis, importance on X-axis correctly + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Has sorting, color gradient, error bars, and text annotations + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: All data visible within axis range + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: No legend needed for this chart type + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: 'Uses correct format: "{spec-id} · {library} · pyplots.ai"' + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 7 + max: 8 + passed: true + comment: Shows 15 features with varying importances, good range from 0.005 + to 0.182 + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Customer analytics scenario with realistic feature names (customer_lifetime_value, + purchase_frequency, etc.) + - id: DQ-03 + name: Appropriate Scale + score: 4 + max: 5 + passed: true + comment: Importances sum to ~1.0 as expected for tree-based models, though + std values could be slightly more varied + code_quality: + score: 9 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Linear script: imports → data → plot → save' + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Uses np.random.seed(42) + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: Only used imports (altair, numpy, pandas) + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current Altair API + - id: CQ-05 + name: Output Correct + score: 0 + max: 1 + passed: false + comment: Saves as plot.png (correct) but also saves plot.html (unnecessary + extra output) + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: true + comment: Uses Altair's declarative encoding, layered chart composition, and + transform_calculate. Could leverage tooltips more prominently or add interactivity. + verdict: APPROVED diff --git a/plots/bar-feature-importance/metadata/bokeh.yaml b/plots/bar-feature-importance/metadata/bokeh.yaml index bf09330d5c..364842e3d0 100644 --- a/plots/bar-feature-importance/metadata/bokeh.yaml +++ b/plots/bar-feature-importance/metadata/bokeh.yaml @@ -22,3 +22,182 @@ review: weaknesses: - Missing HoverTool for interactive exploration in HTML output (Bokeh key strength) - Y-axis label could be added (Feature or Model Feature) + image_description: 'The plot displays a horizontal bar chart showing feature importances + from a machine learning classification model. There are 12 features displayed + on the y-axis (from bottom to top: Account Balance, Payment History, Home Ownership, + Num Inquiries, Education Level, Loan Amount, Num Accounts, Debt Ratio, Employment + Years, Age, Credit Score, Income). The bars extend horizontally with length proportional + to importance scores. A blue sequential color gradient is applied - darker blue + for higher importance values, lighter blue for lower values. Each bar has its + importance value labeled at the end (ranging from 0.015 to 0.185). The title "bar-feature-importance + · bokeh · pyplots.ai" appears at the top in blue. The x-axis is labeled "Importance + Score" with tick marks at 0, 0.05, 0.1, 0.15, and 0.2. The background is light + gray (#fafafa) with subtle dashed vertical grid lines.' + criteria_checklist: + visual_quality: + score: 36 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 9 + max: 10 + passed: true + comment: Title, axis labels, and value annotations are clearly readable. Feature + names on y-axis are legible. Slightly smaller than optimal for some elements. + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements. All feature names and value labels + are clearly separated. + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bars are well-sized with good height (0.7), clearly distinguishable. + Color gradient effectively shows importance hierarchy. + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Blues9 palette is colorblind-safe. Sequential blue gradient provides + good contrast. + - id: VQ-05 + name: Layout Balance + score: 4 + max: 5 + passed: true + comment: 'Good use of canvas space. Slight issue: feature names appear slightly + close to edge on y-axis.' + - id: VQ-06 + name: Axis Labels + score: 1 + max: 2 + passed: true + comment: X-axis has "Importance Score" but no units (importance scores are + unitless, so acceptable). Y-axis has no label (features are self-explanatory). + - id: VQ-07 + name: Grid & Legend + score: 1 + max: 2 + passed: true + comment: Subtle dashed grid with alpha 0.3 is good. No legend needed for this + plot type. + spec_compliance: + score: 24 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct horizontal bar chart for feature importance. + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Features on y-axis, importance values on x-axis as specified. + - id: SC-03 + name: Required Features + score: 4 + max: 5 + passed: true + comment: Has sorted bars (highest at top), color gradient, value annotations. + Missing optional error bars (std) mentioned in spec. + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: X-axis range (0 to ~0.21) properly shows all data with 15% padding. + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: No legend needed; color gradient is self-explanatory. + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: 'Correct format: "bar-feature-importance · bokeh · pyplots.ai"' + data_quality: + score: 19 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 7 + max: 8 + passed: true + comment: Shows 12 features with good variation in importance values. Could + show more dramatic range differences. + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Credit scoring/loan approval model context is realistic and comprehensible. + Feature names are plausible for this domain. + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: Importance values sum close to 1.0, realistic for tree-based model + feature importances. + code_quality: + score: 9 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Clean linear structure: imports → data → processing → plot → save.' + - id: CQ-02 + name: Reproducibility + score: 2 + max: 3 + passed: true + comment: Data is deterministic (hardcoded), but no random seed comment. Minor + deduction. + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: All imports are used (export_png, save, ColumnDataSource, LabelSet, + LinearColorMapper, Blues9, figure, CDN). + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current Bokeh API. + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png and plot.html. + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Distinctive Features + score: 3 + max: 5 + passed: true + comment: Uses ColumnDataSource, LinearColorMapper, LabelSet - good Bokeh patterns. + Could leverage HoverTool for interactivity in HTML output. + verdict: APPROVED diff --git a/plots/bar-feature-importance/metadata/highcharts.yaml b/plots/bar-feature-importance/metadata/highcharts.yaml index ac332e97b8..e3aac9daf2 100644 --- a/plots/bar-feature-importance/metadata/highcharts.yaml +++ b/plots/bar-feature-importance/metadata/highcharts.yaml @@ -27,3 +27,182 @@ review: - Does not use the highcharts-core Python library as recommended in library rules - Error bars not included despite spec mentioning them as valuable for ensemble methods + image_description: The plot displays a horizontal bar chart showing feature importances + from a Random Forest model for house price prediction. There are 15 features displayed, + sorted from highest importance at the top (Square Footage with 0.215) to lowest + at the bottom (Energy Efficiency Score with 0.004). The bars use a gradient color + scheme from dark blue (#306998 for high importance) to light blue (#a8d5f2 for + low importance). Each bar has a data label showing the precise importance value + positioned just to the right of the bar. The title "bar-feature-importance · highcharts + · pyplots.ai" is centered at the top with a subtitle "House Price Prediction - + Random Forest Feature Importances" below it. The x-axis shows "Importance Score" + ranging from 0 to 0.25. Feature names (e.g., "Square Footage", "Number of Bedrooms", + "Location Score") are clearly displayed on the y-axis. The chart has a clean white + background with subtle gray gridlines. + criteria_checklist: + visual_quality: + score: 37 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title, subtitle, axis labels, and feature names are all clearly readable + with appropriate font sizes for the 4800x2700 canvas + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text, feature names are well-spaced, data labels do + not overlap bars + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bars are well-sized, gradient colors clearly distinguish importance + levels + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Blue gradient is colorblind-safe, good contrast against white background + - id: VQ-05 + name: Layout Balance + score: 4 + max: 5 + passed: true + comment: Good use of canvas space, though the right side has significant whitespace + due to the x-axis extending to 0.25 while max value is 0.215 + - id: VQ-06 + name: Axis Labels + score: 1 + max: 2 + passed: true + comment: Y-axis has "Importance Score" label but no units (importance scores + are unitless, so this is acceptable) + - id: VQ-07 + name: Grid & Legend + score: 1 + max: 2 + passed: true + comment: Grid is subtle and appropriate; legend disabled (appropriate for + single series) but x-axis tick labels are overly dense + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct horizontal bar chart as specified + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Features on y-axis, importance on x-axis, correctly assigned + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Sorted bars, gradient coloring, data labels for precision all present + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: All 15 features visible with appropriate axis range + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: No legend needed for single-series chart (appropriate) + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: Uses exact format "{spec-id} · {library} · pyplots.ai" + data_quality: + score: 17 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 6 + max: 8 + passed: true + comment: Shows 15 features with good variation in importance values; however, + spec mentions optional error bars for ensemble methods which are not shown + despite the data being described as "from ensemble averaging" + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: House price prediction is a classic ML use case, features are realistic + and meaningful + - id: DQ-03 + name: Appropriate Scale + score: 4 + max: 5 + passed: true + comment: Importance values sum close to 1.0 (0.997), which is realistic; however + individual values could show more spread + code_quality: + score: 9 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 2 + max: 3 + passed: true + comment: Mostly linear structure but contains a helper function `importance_to_color()` + which slightly violates KISS principle + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Deterministic data (no random seed needed as data is hardcoded) + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: All imports are used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current APIs + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png and plot.html + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: true + comment: Uses Highcharts bar chart with data labels and custom styling; however, + does not use highcharts-core Python library as suggested in the library + rules, instead builds JSON config manually + verdict: APPROVED diff --git a/plots/bar-feature-importance/metadata/letsplot.yaml b/plots/bar-feature-importance/metadata/letsplot.yaml index 80df0cd769..4b4ef3769c 100644 --- a/plots/bar-feature-importance/metadata/letsplot.yaml +++ b/plots/bar-feature-importance/metadata/letsplot.yaml @@ -24,3 +24,178 @@ review: weaknesses: - Legend is positioned far from the main plot area, creating visual disconnect - Missing random seed even though data is deterministic (minor but good practice) + image_description: The plot displays a horizontal bar chart showing feature importance + scores for a loan default prediction model. There are 15 features shown, sorted + from highest importance (income at 0.182) to lowest (region at 0.003). The bars + use a sequential color gradient from light blue (#A8D5E5) for low importance to + dark blue (#306998) for high importance. Each bar has error bars (standard deviation) + shown in dark gray, and importance values are annotated at the end of each bar. + The title "bar-feature-importance · letsplot · pyplots.ai" is at the top, the + y-axis is labeled "Feature", and the x-axis is labeled "Importance Score". A color + legend for the gradient is positioned on the right side. The layout is clean with + subtle grid lines on the x-axis only. + criteria_checklist: + visual_quality: + score: 37 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title is bold and clearly readable, axis labels and tick marks are + all appropriately sized + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements; feature names, values, and error bars + are well spaced + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bars are appropriately sized for the 15 features, error bars are + visible and not overwhelming + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Sequential blue gradient is colorblind-safe, good contrast against + white background + - id: VQ-05 + name: Layout Balance + score: 4 + max: 5 + passed: true + comment: Good use of canvas space, but legend could be positioned closer to + the plot + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: Descriptive labels "Feature" and "Importance Score" + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: false + comment: Grid is subtle, but legend is placed far from the data area + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct horizontal bar chart + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Features on y-axis, importance on x-axis, correctly assigned + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Has sorted bars, color gradient, error bars, text annotations - all + spec requirements met + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: All data visible, x-axis range appropriate (0 to ~0.22) + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend correctly shows importance gradient + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: Correct format "bar-feature-importance · letsplot · pyplots.ai" + data_quality: + score: 20 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 8 + max: 8 + passed: true + comment: Shows full range from high importance (income 0.182) to near-zero + (region 0.003), with varying error bar sizes + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Loan default prediction is a realistic ML use case with plausible + feature names + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: Importance values sum to ~1.0, realistic for Random Forest feature + importances + code_quality: + score: 7 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Simple linear structure: imports → data → plot → save' + - id: CQ-02 + name: Reproducibility + score: 0 + max: 3 + passed: false + comment: No random seed set (data is deterministic, but good practice to include) + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: All imports are used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Modern lets-plot API used + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png with correct scale factor + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Distinctive Features + score: 3 + max: 5 + passed: true + comment: Uses ggplot grammar, coord_flip, scale_fill_gradient, and theme customization; + HTML export for interactivity. Could use more advanced lets-plot specific + features + verdict: APPROVED diff --git a/plots/bar-feature-importance/metadata/matplotlib.yaml b/plots/bar-feature-importance/metadata/matplotlib.yaml index c7ee1bef1a..7892bf98d6 100644 --- a/plots/bar-feature-importance/metadata/matplotlib.yaml +++ b/plots/bar-feature-importance/metadata/matplotlib.yaml @@ -25,3 +25,173 @@ review: - Axis labels could include units (e.g., "Importance Score (normalized)" or similar) - Could leverage matplotlib annotate() for more styled value labels with arrows or backgrounds + image_description: The plot displays a horizontal bar chart showing feature importances + from a machine learning model (credit/loan prediction context). The chart shows + 12 features sorted by importance from bottom to top, with "Income" being the most + important (0.182) and "Number of Dependents" the least important (0.015). The + bars use a sequential blue color gradient (Blues colormap) that transitions from + lighter blue for lower values to darker blue for higher importance values. Each + bar has error bars showing standard deviation and value annotations displayed + to the right of each bar. The title uses the correct format "bar-feature-importance + · matplotlib · pyplots.ai". The x-axis is labeled "Importance Score" and y-axis + is labeled "Feature". A subtle dashed grid is visible on the x-axis only. The + top and right spines are hidden for a cleaner appearance. + criteria_checklist: + visual_quality: + score: 38 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title at 24pt, labels at 20pt, ticks at 16pt, all perfectly readable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text, all feature names fully visible + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bars are well-sized, error bars clearly visible with good capsize + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Uses Blues colormap which is colorblind-safe + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Plot fills canvas well with balanced margins, tight_layout applied + - id: VQ-06 + name: Axis Labels + score: 1 + max: 2 + passed: true + comment: Labels are descriptive ("Importance Score", "Feature") but missing + units + - id: VQ-07 + name: Grid & Legend + score: 1 + max: 2 + passed: false + comment: Grid is subtle (alpha=0.3, dashed), but there is no legend (not needed + here) + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct horizontal bar chart + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Features on y-axis, importance on x-axis as specified + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Sorted bars, color gradient, error bars, value annotations all present + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: X-axis shows full range from 0 to beyond max importance + std + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: No legend needed for single series, N/A + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: 'Correct format: "bar-feature-importance · matplotlib · pyplots.ai"' + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 6 + max: 8 + passed: true + comment: Shows 12 features with good variation in importance values, but all + features trend consistently (could show some mid-range clustering) + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Credit/loan prediction model with realistic feature names (Income, + Credit Score, Age, etc.) + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: Importance values sum to ~1.0, realistic for sklearn feature_importances_ + code_quality: + score: 10 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: Clean imports → data → plot → save structure, no functions/classes + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: np.random.seed(42) set + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: Only matplotlib.pyplot and numpy, both used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current matplotlib API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png with correct parameters + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: true + comment: Uses barh with error bars, colormap, spine customization. Good but + could use additional matplotlib features like annotate() for richer annotations + verdict: APPROVED diff --git a/plots/bar-feature-importance/metadata/plotly.yaml b/plots/bar-feature-importance/metadata/plotly.yaml index 0c7661e8a5..75da7e19af 100644 --- a/plots/bar-feature-importance/metadata/plotly.yaml +++ b/plots/bar-feature-importance/metadata/plotly.yaml @@ -25,3 +25,180 @@ review: - Y-axis label "Feature" could be omitted since the feature names are self-explanatory - Could leverage more Plotly-specific interactive features in the HTML output (hover templates, custom interactions) + image_description: 'The plot displays a horizontal bar chart showing 15 machine + learning feature importances from a credit/loan prediction model. Features are + sorted by importance with "age" at the top (0.179) and "investment_portfolio" + at the bottom (0.005). The bars use a blue gradient color scheme (RGBA with varying + alpha from ~0.4 to 1.0) where darker/more opaque blue indicates higher importance. + Each bar includes error bars (horizontal lines) representing standard deviation + from ensemble methods. Importance values are annotated as text labels at the end + of each bar after the error bars. The y-axis shows feature names, x-axis shows + "Importance Score" ranging from 0 to ~0.2. The title follows the correct format: + "bar-feature-importance · plotly · pyplots.ai". Layout is clean with white background, + subtle gray grid lines, and proper margins allowing all feature names to be fully + visible.' + criteria_checklist: + visual_quality: + score: 36 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title at 32pt, axis labels at 24pt, tick fonts at 18pt, annotations + at 16pt - all clearly readable at full size + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text, feature names are well-spaced, annotations positioned + after error bars + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bars are appropriately sized for 15 features, error bars visible + with good thickness + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Single-hue blue gradient is colorblind-safe, no red-green distinction + needed + - id: VQ-05 + name: Layout Balance + score: 3 + max: 5 + passed: true + comment: Good use of canvas space, though left margin is generous; plot fills + ~60% of canvas + - id: VQ-06 + name: Axis Labels + score: 1 + max: 2 + passed: true + comment: '"Importance Score" is descriptive but lacks units (though importance + scores are typically unitless)' + - id: VQ-07 + name: Grid & Legend + score: 1 + max: 2 + passed: true + comment: Grid is subtle (alpha 0.1), no legend needed for single series + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct horizontal bar chart + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Features on y-axis, importance on x-axis as specified + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: 'All spec features present: horizontal bars, sorted by importance, + color gradient, error bars, value annotations' + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: X-axis shows full range including error bars + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: No legend needed, N/A + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: 'Correct format: "bar-feature-importance · plotly · pyplots.ai"' + data_quality: + score: 19 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 7 + max: 8 + passed: true + comment: Shows 15 features with varying importance values and error bars; + good distribution from high (0.179) to low (0.005) + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Credit/loan prediction model features (age, income, credit_score, + etc.) are realistic and domain-appropriate + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: Importance values sum to ~1.0, typical for normalized feature importances + code_quality: + score: 10 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Clean linear structure: imports → data → plot → save' + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: np.random.seed(42) set + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: Only numpy and plotly.graph_objects used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Current Plotly API usage + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png and plot.html + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: true + comment: Uses go.Bar with proper orientation, custom annotations, error_x + for error bars. Could leverage more Plotly-specific features like hover + customization in HTML output + verdict: APPROVED diff --git a/plots/bar-feature-importance/metadata/plotnine.yaml b/plots/bar-feature-importance/metadata/plotnine.yaml index 9da02ba4de..b299e755ec 100644 --- a/plots/bar-feature-importance/metadata/plotnine.yaml +++ b/plots/bar-feature-importance/metadata/plotnine.yaml @@ -22,3 +22,151 @@ review: weaknesses: - Could add explicit random seed comment for documentation clarity even with deterministic data + image_description: 'The plot is a horizontal bar chart showing feature importances + from a Random Forest model for house price prediction. It displays 15 features + sorted by importance value with the highest (Overall Quality at 0.285) at the + top and lowest (Porch Area at 0.002) at the bottom. The bars use a sequential + color gradient from light blue (#a8d5e5) for lower values to dark blue (#306998) + for higher values. Each bar has error bars showing standard deviation from ensemble + variability. Importance values are annotated as text to the right of each bar + (3 decimal places). The y-axis shows "Feature" with descriptive feature names, + the x-axis shows "Importance Score" ranging from 0.0 to ~0.3. The title follows + the required format: "bar-feature-importance · plotnine · pyplots.ai". The layout + uses a minimal theme with subtle dashed grid lines on the x-axis only.' + criteria_checklist: + visual_quality: + score: 37 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title at 24pt bold, axis titles at 20pt bold, axis text at 14-16pt, + all perfectly readable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements, feature names are readable and well-spaced + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bars are well-sized with appropriate width (0.7), error bars visible + with good contrast + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Sequential blue gradient is colorblind-safe, good contrast + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Plot fills canvas well, balanced margins, good use of 16:9 aspect + ratio + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: Descriptive labels "Feature" and "Importance Score" + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct horizontal bar chart + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Features on y-axis, importance on x-axis, correctly mapped + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Sorted by importance (highest at top), color gradient, error bars, + text annotations + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: X-axis shows full range with expand=(0, 0, 0.15, 0) to accommodate + labels + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend correctly hidden as color maps to same value as bar length + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: Uses exact format "bar-feature-importance · plotnine · pyplots.ai" + data_quality: + score: 19 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 8 + max: 8 + passed: true + comment: Shows 15 features with varying importance values from 0.002 to 0.285, + good distribution + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: House price prediction with sklearn RandomForestClassifier is a real, + comprehensible ML scenario + code_quality: + score: 9 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: Simple imports → data → plot → save structure, no functions/classes + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: All imports are used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current plotnine API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png + library_features: + score: 3 + max: 5 + items: [] + verdict: APPROVED diff --git a/plots/bar-feature-importance/metadata/pygal.yaml b/plots/bar-feature-importance/metadata/pygal.yaml index de6f2563d4..13643040f3 100644 --- a/plots/bar-feature-importance/metadata/pygal.yaml +++ b/plots/bar-feature-importance/metadata/pygal.yaml @@ -24,3 +24,168 @@ review: - Contains a helper function importance_to_color which deviates from strict KISS script style - X-axis could be tighter to data range to reduce unused whitespace on right side + image_description: The plot shows a horizontal bar chart of feature importances + from a house price prediction model. There are 15 features displayed on the y-axis + (OverallQual at top, ExterQual at bottom), sorted by importance with highest at + top. The x-axis shows "Importance Score" ranging from 0.000 to 0.240. Bars use + a gradient from light blue (low importance) to darker Python Blue (high importance). + Each bar has its importance value displayed at the end (e.g., 0.245 for OverallQual, + 0.182 for GrLivArea). The title reads "bar-feature-importance · pygal · pyplots.ai". + The layout has white background with subtle vertical grid lines, and all feature + names are clearly readable on the left side. + criteria_checklist: + visual_quality: + score: 36 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title, labels, and tick marks all clearly readable at full resolution + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text, feature names and values all distinct + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bars appropriately sized for 15 features, good spacing between bars + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Blue gradient is colorblind-safe, no red-green issues + - id: VQ-05 + name: Layout Balance + score: 3 + max: 5 + passed: true + comment: Good proportions but x-axis extends far beyond data (0.24 max importance + but axis goes to 0.24+), some unused space on right + - id: VQ-06 + name: Axis Labels + score: 1 + max: 2 + passed: true + comment: X-axis has descriptive label "Importance Score" but no units (dimensionless + is acceptable for importance) + - id: VQ-07 + name: Grid & Legend + score: 1 + max: 2 + passed: true + comment: Grid lines are subtle, no legend needed (single series), but grid + extends into unused space + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct horizontal bar chart + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Features on y-axis, importance values as bar length + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Sorted by importance (highest at top), gradient coloring, value annotations + present + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: All 15 features visible, axis accommodates all values + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: No legend needed for single series + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: 'Correct format: "bar-feature-importance · pygal · pyplots.ai"' + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 6 + max: 8 + passed: true + comment: Shows 15 features with varied importance values demonstrating the + concept well, but spec suggests error bars for ensemble methods (optional, + not required) + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: House price prediction with RandomForest is a realistic, comprehensible + ML scenario using actual Kaggle Ames Housing dataset features + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: Importance values sum to ~1.0, realistic for tree-based feature importance + code_quality: + score: 8 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 1 + max: 3 + passed: false + comment: Contains a helper function `importance_to_color` which violates strict + KISS principle + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Deterministic data (no random generation) + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: Only pygal and Style imported, both used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Using current pygal API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png and plot.html + library_features: + score: 5 + max: 5 + items: [] + verdict: APPROVED diff --git a/plots/bar-feature-importance/metadata/seaborn.yaml b/plots/bar-feature-importance/metadata/seaborn.yaml index efacb6cda7..748f3520d6 100644 --- a/plots/bar-feature-importance/metadata/seaborn.yaml +++ b/plots/bar-feature-importance/metadata/seaborn.yaml @@ -22,3 +22,172 @@ review: weaknesses: - Error bars are added manually via matplotlib instead of leveraging seaborn built-in errorbar capabilities + image_description: The plot displays a horizontal bar chart showing feature importances + from a machine learning credit scoring model. There are 15 features sorted by + importance, with "Annual Income" at the top (0.180) and "Previous Defaults" at + the bottom (0.007). The bars use a sequential "Blues" color palette that transitions + from light blue (low importance) to dark blue (high importance). Each bar has + error bars (whiskers) showing standard deviation, and importance values are annotated + in blue text at the end of each bar. The title reads "bar-feature-importance · + seaborn · pyplots.ai" in bold at the top. The x-axis is labeled "Feature Importance" + and the y-axis is labeled "Feature". A subtle dashed grid is visible on the x-axis + only, and the top/right spines are removed for a cleaner look. + criteria_checklist: + visual_quality: + score: 38 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title 24pt bold, axis labels 20pt, tick labels 16pt - all perfectly + readable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text, feature names are clearly separated + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bars are well-sized, error bars clearly visible with appropriate + caps + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Sequential Blues palette is colorblind-safe + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Good proportions, plot fills canvas well, balanced margins + - id: VQ-06 + name: Axis Labels + score: 1 + max: 2 + passed: false + comment: Descriptive labels but no units (importance is unitless, so acceptable) + - id: VQ-07 + name: Grid & Legend + score: 1 + max: 2 + passed: true + comment: Grid subtle (alpha=0.3), no legend needed for this plot + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct horizontal bar chart for feature importance + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Features on Y-axis, importance on X-axis as specified + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: 'All spec features present: sorted bars, color gradient, error bars, + value annotations' + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: Axes show all data with appropriate padding + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: No legend needed, N/A but colors self-explanatory + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: 'Correct format: `bar-feature-importance · seaborn · pyplots.ai`' + data_quality: + score: 20 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 8 + max: 8 + passed: true + comment: Shows full range from high (0.18) to low (0.007) importance with + good variability + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Credit scoring model is a real, comprehensible ML scenario + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: Importance values sum to ~1.0, realistic for tree-based models + code_quality: + score: 10 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: Clean imports → data → plot → save structure, no functions/classes + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Uses `np.random.seed(42)` + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: Only necessary imports (matplotlib, numpy, pandas, seaborn) + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current seaborn API with hue parameter correctly + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as `plot.png` + library_features: + score: 0 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 0 + max: 5 + passed: false + comment: Uses `sns.barplot` but error bars added via matplotlib's `ax.errorbar` + rather than using seaborn's built-in capabilities + verdict: APPROVED diff --git a/plots/bar-grouped/metadata/altair.yaml b/plots/bar-grouped/metadata/altair.yaml index c5fbad2fa9..e5eb2f8c69 100644 --- a/plots/bar-grouped/metadata/altair.yaml +++ b/plots/bar-grouped/metadata/altair.yaml @@ -24,3 +24,177 @@ review: weaknesses: - Legend placement in top-right overlaps slightly with the plot area; consider orient right outside the plot + image_description: 'The plot displays a grouped bar chart showing quarterly revenue + by product line. There are 4 quarters (Q1-Q4) on the x-axis, each with 3 side-by-side + bars representing Software (dark blue #306998), Hardware (yellow #FFD43B), and + Services (teal #4ECDC4). The y-axis shows "Revenue (thousands USD)" ranging from + 0 to 180. The title "bar-grouped · altair · pyplots.ai" appears at the top center. + A legend labeled "Product Line" is positioned in the top-right corner. The bars + have subtle rounded corners at the top. Software consistently has the highest + revenue across all quarters (120→145→132→168), Hardware is mid-range (85→78→92→105), + and Services is lowest but growing (45→52→68→75). The grid is very subtle with + low opacity.' + criteria_checklist: + visual_quality: + score: 37 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title at 28pt, axis labels at 22pt, tick labels at 18pt - all clearly + readable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements anywhere + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bars are well-sized with good spacing, xOffset creates clear grouped + separation + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Blue, yellow, and teal are colorblind-safe (no red-green issues) + - id: VQ-05 + name: Layout Balance + score: 4 + max: 5 + passed: true + comment: Good proportions, though legend in top-right slightly overlaps grid + area + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: Y-axis has descriptive label with units "Revenue (thousands USD)", + X-axis labeled "Quarter" + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: true + comment: Grid is appropriately subtle (alpha 0.3), but legend overlaps the + data area slightly + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct grouped bar chart with side-by-side bars per category + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Quarter on X, Revenue on Y, Product as grouping variable + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Distinct colors, clear legend, consistent bar widths, good spacing + between groups + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: Y-axis shows full range 0-180, all data visible + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend correctly labels Software, Hardware, Services + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: Uses correct format "bar-grouped · altair · pyplots.ai" + data_quality: + score: 20 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 8 + max: 8 + passed: true + comment: Shows variation across quarters and between products, clear trends + visible + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Quarterly revenue by product line is a real business scenario + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: Revenue values 45-168 thousands USD are realistic for product lines + code_quality: + score: 7 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: Simple imports → data → chart → save structure, no functions/classes + - id: CQ-02 + name: Reproducibility + score: 0 + max: 3 + passed: false + comment: No random data, but data is deterministic (hardcoded) - however, + the code does not use np.random.seed as there's no random data + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: Only altair and pandas imported, both used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current Altair API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png and plot.html + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: true + comment: Uses xOffset for grouping (Altair-specific), cornerRadius for styling, + tooltips for interactivity, declarative encoding. Could have added selection/interactivity + features. + verdict: APPROVED diff --git a/plots/bar-grouped/metadata/bokeh.yaml b/plots/bar-grouped/metadata/bokeh.yaml index 1471f003de..0420aed6fd 100644 --- a/plots/bar-grouped/metadata/bokeh.yaml +++ b/plots/bar-grouped/metadata/bokeh.yaml @@ -21,3 +21,174 @@ review: weaknesses: - Legend color swatches all show the same blue color instead of the actual bar colors - No np.random.seed(42) even though data is deterministic + image_description: 'The plot displays a grouped bar chart showing quarterly revenue + (Q1-Q4) for three product lines: Electronics (blue), Clothing (yellow), and Home + & Garden (green). Each quarter has three side-by-side bars representing the different + product categories. Value labels appear above each bar (e.g., "$245K", "$180K"). + The title reads "Quarterly Revenue by Product · bar-grouped · bokeh · pyplots.ai" + at the top. The y-axis is labeled "Revenue ($ Thousands)" with tick marks at 0, + 100, 200, 300, 400. The x-axis shows "Quarter" with Q1, Q2, Q3, Q4 labels. A legend + in the top-right corner identifies the three product categories. The background + is light gray (#fafafa) with subtle dashed horizontal grid lines.' + criteria_checklist: + visual_quality: + score: 36 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 9 + max: 10 + passed: true + comment: Title, axis labels, and value labels are clearly readable; tick labels + could be slightly larger + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bars are well-sized and clearly visible with good spacing + - id: VQ-04 + name: Color Accessibility + score: 4 + max: 5 + passed: true + comment: Blue, yellow, green palette is distinguishable but yellow-green may + be challenging for some colorblind users + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Good canvas utilization, balanced margins + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: Descriptive labels with units ("Revenue ($ Thousands)") + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: true + comment: Legend shows all items with same blue color instead of their actual + colors + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct grouped bar chart + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Categories on x-axis, values on y-axis, groups side-by-side + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: 'All spec features present: distinct colors, legend, consistent spacing, + value labels' + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: Y-axis shows all data (0-430 accommodates max value of 385) + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend labels match the data groups + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: Follows "{description} · {spec-id} · {library} · pyplots.ai" format + data_quality: + score: 20 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 8 + max: 8 + passed: true + comment: Shows variation across quarters and products; different trends for + each product line + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Quarterly revenue by product line is a common real-world business + scenario + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: Values in $125K-$385K range are realistic for product revenue + code_quality: + score: 7 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: Linear script structure without functions/classes + - id: CQ-02 + name: Reproducibility + score: 0 + max: 3 + passed: false + comment: No random seed used (though data is deterministic, best practice + is to include seed) + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: All imports are used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current Bokeh API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: true + comment: Uses FactorRange for grouped categorical axis and factor_cmap for + coloring, but could leverage more Bokeh-specific features like HoverTool + verdict: APPROVED diff --git a/plots/bar-grouped/metadata/highcharts.yaml b/plots/bar-grouped/metadata/highcharts.yaml index 36d7285601..2d9d3cee08 100644 --- a/plots/bar-grouped/metadata/highcharts.yaml +++ b/plots/bar-grouped/metadata/highcharts.yaml @@ -26,3 +26,177 @@ review: marks), making the grid overly dense - All three product lines show uniform upward trends - data could demonstrate more varied patterns (e.g., one declining, seasonal variations) + image_description: 'The plot displays a grouped bar chart with 4 quarters (Q1, Q2, + Q3, Q4) on the x-axis and revenue values on the y-axis. Three product lines are + shown as grouped vertical bars: Electronics (blue #306998), Clothing (yellow #FFD43B), + and Home & Garden (purple #9467BD). The title "bar-grouped · highcharts · pyplots.ai" + appears prominently at the top with a subtitle "Quarterly Revenue by Product Line + (in thousands USD)". Each bar has data labels showing values (e.g., $245K, $312K, + $287K, $398K for Electronics). The y-axis displays "Revenue (thousands USD)" with + formatted tick labels ($0K to $420K in $10K increments), and the x-axis shows + "Quarter". A boxed legend with the three product lines is positioned in the top-right + corner with a subtle border and shadow.' + criteria_checklist: + visual_quality: + score: 36 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title is large and bold (72px), axis labels at 48px, tick labels + at 36px - all perfectly readable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text, bars well-spaced, data labels clear + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bars are appropriately sized with good groupPadding and pointPadding + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Blue/Yellow/Purple palette is colorblind-safe, avoids red-green + - id: VQ-05 + name: Layout Balance + score: 3 + max: 5 + passed: true + comment: Good use of canvas but y-axis has excessive tick marks (every $10K + creates visual clutter) + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: 'Both axes have descriptive labels with units: "Quarter" and "Revenue + (thousands USD)"' + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: true + comment: Grid lines are dashed but overly dense due to $10K intervals; legend + is well-placed but grid dominates + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct grouped bar (column) chart + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Categories (quarters) on X, values on Y, groups (products) as series + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Distinct colors, clear legend, consistent bar widths, adequate spacing, + value labels present + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: Y-axis shows full range from 0 to above max value + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend labels match series names correctly + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: 'Uses correct format: "bar-grouped · highcharts · pyplots.ai"' + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 6 + max: 8 + passed: true + comment: Shows quarterly comparison with 3 groups, demonstrates growth trends, + but could show more variation (all products trend upward) + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Quarterly revenue by product line is a real, comprehensible business + scenario + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: Values in $156K-$398K range are realistic for quarterly revenue + code_quality: + score: 7 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Linear flow: imports → data → chart config → export' + - id: CQ-02 + name: Reproducibility + score: 0 + max: 3 + passed: false + comment: 'No random seed, but data is deterministic (hardcoded arrays) - PARTIAL: + data is fixed but no explicit seed documentation' + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: All imports are used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current highcharts-core API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png and plot.html + library_features: + score: 5 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 5 + max: 5 + passed: true + comment: 'Uses Highcharts-specific features: column chart type, dataLabels + with formatting, gridLineDashStyle, floating legend with shadow, subtitle, + formatted y-axis labels with ${value}K' + verdict: APPROVED diff --git a/plots/bar-grouped/metadata/letsplot.yaml b/plots/bar-grouped/metadata/letsplot.yaml index 1ccdca6ef5..9e859a4881 100644 --- a/plots/bar-grouped/metadata/letsplot.yaml +++ b/plots/bar-grouped/metadata/letsplot.yaml @@ -27,3 +27,179 @@ review: balanced - Could add value labels on bars for precise comparisons as noted in spec (optional but helpful) + image_description: 'The plot displays a grouped bar chart showing quarterly revenue + data for three product categories. The chart has a clean white/light gray background + with a minimal theme. Four quarters (Q1-Q4) are shown on the x-axis, with three + bars per quarter representing Electronics (blue #306998), Clothing (yellow #FFD43B), + and Home & Garden (red #DC2626). The y-axis shows "Revenue ($ thousands)" ranging + from 0 to 240. The title "bar-grouped · letsplot · pyplots.ai" appears at the + top in bold. A legend labeled "Product Category" is positioned on the right side. + The bars show clear patterns: Electronics shows consistent growth (145→168→192→235), + Clothing shows seasonal variation (98→112→87→142), and Home & Garden peaks in + summer (67→95→108→72). Bar spacing and grouping are well-balanced.' + criteria_checklist: + visual_quality: + score: 37 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title is bold and ~24pt, axis titles ~20pt, tick labels ~16pt, all + clearly readable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements, clean spacing throughout + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bars are well-sized with good width (0.7) and alpha (0.9), clear + visibility + - id: VQ-04 + name: Color Accessibility + score: 4 + max: 5 + passed: true + comment: Blue/yellow/red palette is distinguishable, though red could be problematic + for some colorblind users + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Plot fills canvas well, balanced margins, legend positioned appropriately + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: Y-axis includes units "Revenue ($ thousands)", X-axis "Quarter" is + descriptive + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: true + comment: Grid lines are removed (panel_grid_major_x=element_blank()), only + y-grid remains but subtle + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct grouped bar chart with position="dodge" + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Categories (quarters) on x-axis, groups (products) as fill, values + as bar heights + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Distinct colors per group, clear legend, consistent bar widths, good + spacing + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: Y-axis shows full range from 0 to 240, all data visible + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend correctly labeled "Product Category" with accurate color mappings + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: Correctly uses "bar-grouped · letsplot · pyplots.ai" format + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 7 + max: 8 + passed: true + comment: Shows growth trends (Electronics), seasonal patterns (Clothing), + and peaked behavior (Home & Garden), good variety + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Quarterly sales by product category is a real, comprehensible business + scenario + - id: DQ-03 + name: Appropriate Scale + score: 4 + max: 5 + passed: true + comment: Revenue values in $thousands (67-235) are plausible for retail, though + scale context could be clearer + code_quality: + score: 9 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: Simple imports → data → plot → save structure, no functions/classes + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Data is deterministic (hardcoded values), no random elements + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: Only pandas and lets_plot used, both necessary + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current lets-plot API + - id: CQ-05 + name: Output Correct + score: 0 + max: 1 + passed: false + comment: Saves both plot.png and plot.html, but path="." could be cleaner + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: true + comment: Uses ggplot2 grammar correctly with geom_bar, position_dodge, scale_fill_manual, + theme_minimal, and ggsize. Uses lets-plot's HTML export capability. Could + leverage more interactive features. + verdict: APPROVED diff --git a/plots/bar-grouped/metadata/matplotlib.yaml b/plots/bar-grouped/metadata/matplotlib.yaml index ab6ae56a84..4d1e1cc7f0 100644 --- a/plots/bar-grouped/metadata/matplotlib.yaml +++ b/plots/bar-grouped/metadata/matplotlib.yaml @@ -21,3 +21,172 @@ review: weaknesses: - Legend position in upper left may conflict with data if values were higher in Q1 (upper right or outside plot would be safer) + image_description: The plot displays a grouped bar chart with quarterly sales data + (Q1-Q4) for three product categories. Electronics is shown in Python Blue (#306998), + Clothing in Python Yellow (#FFD43B), and Home & Garden in green (#4CAF50). Each + category group contains three side-by-side bars with value labels displayed above + each bar (e.g., 245, 178, 125 for Q1). The title "bar-grouped · matplotlib · pyplots.ai" + is centered at the top. The y-axis label reads "Sales (Thousands USD)" with values + from 0 to ~450, and the x-axis shows "Quarter" with Q1-Q4 labels. A legend in + the upper left corner identifies each product line. Subtle dashed grid lines appear + on the y-axis with good transparency. + criteria_checklist: + visual_quality: + score: 38 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title at 24pt, axis labels at 20pt, tick labels at 16pt, all perfectly + readable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text, bars well-spaced, value labels clear + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bars sized appropriately with good spacing between groups + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Blue/Yellow/Green palette is colorblind-safe, high contrast + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Plot fills canvas well, balanced margins, legend well-positioned + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: Y-axis includes units "(Thousands USD)", X-axis descriptive "Quarter" + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: false + comment: Grid at alpha=0.3 is good, but legend could be positioned in less + data-relevant area (upper right would be better as it doesn't interfere + with potential higher values) + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct grouped bar chart + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Categories on X, groups as side-by-side bars, values as heights + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Distinct colors, legend, consistent spacing, value labels + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: Y-axis starts at 0, includes headroom for labels + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend labels match data series exactly + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: Correct format "bar-grouped · matplotlib · pyplots.ai" + data_quality: + score: 20 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 8 + max: 8 + passed: true + comment: 'Shows varied patterns: Electronics peaks in Q4, Clothing grows steadily, + Home & Garden peaks mid-year' + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Quarterly sales by product line is a common business scenario + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: Values in hundreds of thousands USD are realistic for retail sales + code_quality: + score: 8 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: Clean imports → data → plot → save structure, no functions/classes + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Uses deterministic hardcoded data, no randomness + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: Only matplotlib.pyplot and numpy imported, both used + - id: CQ-04 + name: No Deprecated API + score: 0 + max: 1 + passed: true + comment: Uses `strict=True` in zip which is Python 3.10+ only (minor compatibility + concern) + - id: CQ-05 + name: Output Correct + score: 0 + max: 1 + passed: true + comment: Saves as 'plot.png' correctly + library_features: + score: 4 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 4 + max: 5 + passed: true + comment: Good use of bar positioning with np.arange offsets, ax.annotate for + value labels, edge styling with white borders + verdict: APPROVED diff --git a/plots/bar-grouped/metadata/plotly.yaml b/plots/bar-grouped/metadata/plotly.yaml index 8d4255b7b6..c7acc3ba13 100644 --- a/plots/bar-grouped/metadata/plotly.yaml +++ b/plots/bar-grouped/metadata/plotly.yaml @@ -22,3 +22,154 @@ review: weaknesses: - Grid alpha at 0.1 is slightly too subtle - 0.2-0.3 would aid value reading - Does not leverage plotly-specific features like hover templates with custom formatting + image_description: The plot displays a grouped bar chart showing quarterly revenue + data (Q1-Q4) for three product lines. Electronics is shown in dark blue (#306998), + Clothing in golden yellow (#FFD43B), and Home & Garden in coral/salmon (#E17055). + Bars are grouped side-by-side for each quarter with value labels positioned above + each bar. The title "bar-grouped · plotly · pyplots.ai" is centered at the top + with a horizontal legend below it showing all three product categories. The y-axis + shows "Revenue ($ thousands)" ranging from 0 to ~400, and the x-axis shows "Quarter" + with Q1-Q4 labels. The plot uses a clean white template with subtle gridlines. + criteria_checklist: + visual_quality: + score: 37 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title at 32pt, axis labels at 24pt, tick labels at 20pt, value labels + at 16pt - all clearly readable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements, bars well-spaced, value labels clear + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bars are appropriately sized with good spacing between groups + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Blue, yellow, and coral are colorblind-safe and have excellent contrast + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Plot fills canvas well with balanced margins, legend well-positioned + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: Y-axis has units "Revenue ($ thousands)", X-axis has descriptive + label "Quarter" + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct grouped bar chart with side-by-side bars + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Categories (quarters) on X, groups (products) as separate traces, + values as bar heights + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Distinct colors, clear legend, consistent bar widths, value labels + present + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: Y-axis starts at 0 and shows all data including highest value (398) + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend correctly labels all three product categories + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: Uses correct format "bar-grouped · plotly · pyplots.ai" + data_quality: + score: 20 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 8 + max: 8 + passed: true + comment: 'Shows variation: Electronics consistently highest, different growth + patterns per product, Q4 peaks for Electronics/Clothing, Q2 dip for Clothing' + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Quarterly revenue by product line is a real business scenario with + plausible values + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: Revenue values in $thousands (98-398K) are realistic for business + context + code_quality: + score: 7 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: Simple imports → data → figure → layout → save structure, no functions/classes + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: Only plotly.graph_objects used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current plotly API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png (and plot.html for interactivity) + library_features: + score: 3 + max: 5 + items: [] + verdict: APPROVED diff --git a/plots/bar-grouped/metadata/plotnine.yaml b/plots/bar-grouped/metadata/plotnine.yaml index 38d11ceb5a..667ed48020 100644 --- a/plots/bar-grouped/metadata/plotnine.yaml +++ b/plots/bar-grouped/metadata/plotnine.yaml @@ -26,3 +26,178 @@ review: for colorblind users; consider using more distinct hues' - Does not leverage plotnine-specific features like scale_fill_brewer for built-in colorblind-safe palettes + image_description: 'The plot displays a grouped bar chart showing quarterly revenue + by product line. There are 4 quarters (Q1-Q4) on the x-axis, with 3 bars per quarter + representing Hardware (dark blue #306998), Services (yellow #FFD43B), and Software + (light blue #4B8BBE). The y-axis shows "Revenue ($ millions)" ranging from 0 to + ~165. The title "bar-grouped · plotnine · pyplots.ai" is displayed at the top. + A legend labeled "Product Line" appears on the right side. The plot uses a minimal + theme with subtle gray gridlines. Software consistently shows the highest revenue, + growing from ~120 in Q1 to ~165 in Q4, while Hardware remains relatively stable + (78-92) and Services grows modestly (45-70).' + criteria_checklist: + visual_quality: + score: 37 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title, axis labels, and tick labels are all clearly readable with + appropriate font sizes + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements, clean spacing throughout + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bars are well-sized and clearly visible with good spacing between + groups + - id: VQ-04 + name: Color Accessibility + score: 4 + max: 5 + passed: true + comment: Blue/yellow/light blue palette is distinguishable but the two blues + could be better differentiated for colorblind users + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Plot fills canvas well with balanced margins, legend positioned appropriately + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: Y-axis includes units "Revenue ($ millions)", X-axis "Quarter" is + descriptive + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: true + comment: Grid is subtle and appropriate, but legend shows categories in alphabetical + order (Hardware, Services, Software) rather than the order they appear in + the bars (Software, Hardware, Services), which creates confusion when reading + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct grouped bar chart implementation + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Categories (Quarter) on x-axis, values (Revenue) on y-axis, groups + (Product) differentiated by color + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Side-by-side bars, distinct colors, clear legend present + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: All data visible, y-axis starts at 0 + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend labels match data + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: Correct format "bar-grouped · plotnine · pyplots.ai" + data_quality: + score: 19 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 7 + max: 8 + passed: true + comment: Shows variation across quarters and between product lines, demonstrates + clear patterns (Software growth, Hardware stability), but all products show + similar upward trend + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Quarterly revenue by product line is a real, comprehensible business + scenario + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: Revenue values in tens of millions are realistic for a business context + code_quality: + score: 10 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: Simple imports → data → plot → save structure, no functions or classes + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Deterministic data (no random elements) + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: All imports are used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current plotnine API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as "plot.png" + library_features: + score: 0 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 0 + max: 5 + passed: false + comment: Basic ggplot usage with geom_bar and position_dodge; could leverage + plotnine's grammar more (e.g., faceting, stat transformations, or scale_fill_brewer + for color palettes) + verdict: APPROVED diff --git a/plots/bar-grouped/metadata/pygal.yaml b/plots/bar-grouped/metadata/pygal.yaml index 871edc7e3f..730fde4df2 100644 --- a/plots/bar-grouped/metadata/pygal.yaml +++ b/plots/bar-grouped/metadata/pygal.yaml @@ -21,3 +21,178 @@ review: weaknesses: - Legend placement in top-left could be moved to a less intrusive position - Font sizes deviate from library style guide recommendations + image_description: 'The plot displays a grouped bar chart showing quarterly revenue + data for three product lines. Four quarters (Q1-Q4) are shown on the x-axis with + three bars per quarter representing Software (blue #306998), Hardware (yellow + #FFD43B), and Services (coral/pink #FF6B6B). The y-axis shows Revenue in millions + of dollars ranging from $0.0M to $6.0M. Each bar has a value label on top (e.g., + $4.2M, $5.1M, $6.3M). The legend is positioned in the top-left corner. The title + "bar-grouped · pygal · pyplots.ai" appears at the top. The background is white + with subtle horizontal grid lines, and the overall layout is clean and well-proportioned.' + criteria_checklist: + visual_quality: + score: 36 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 9 + max: 10 + passed: true + comment: Title, axis labels, and value labels are all clearly readable. Font + sizes are well-scaled for the 4800x2700 canvas. + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements; all labels are cleanly separated. + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bars are well-sized with good spacing between groups and within groups. + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Blue, yellow, and coral provide excellent contrast and are colorblind-friendly + (no red-green only distinction). + - id: VQ-05 + name: Layout Balance + score: 4 + max: 5 + passed: true + comment: Good canvas utilization; plot fills majority of space. Legend placement + in top-left is functional but slightly crowds the first data point area. + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: 'Both axes have descriptive labels with units: "Revenue ($M)" and + "Quarter".' + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: true + comment: Grid is subtle and appropriate. However, legend position overlaps + with the plot area margin and could be better placed. + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct grouped bar chart implementation. + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Categories on x-axis, groups as separate series, values as bar heights. + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: 'All spec features present: distinct colors, clear legend, consistent + bar widths, value labels on bars.' + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: Y-axis shows full range from 0 to above maximum value. + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend correctly identifies all three product lines. + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: Correctly uses "{spec-id} · {library} · pyplots.ai" format. + data_quality: + score: 19 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 7 + max: 8 + passed: true + comment: Shows variation across quarters and between product lines. Software + shows growth trend, all series show different patterns. + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Quarterly revenue by product line is a real, comprehensible business + scenario. + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: Revenue values in $2.5M-$6.3M range are realistic for product line + quarterly revenue. + code_quality: + score: 9 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Simple linear flow: imports → data → style → chart → save.' + - id: CQ-02 + name: Reproducibility + score: 2 + max: 3 + passed: true + comment: Data is deterministic (hardcoded values), but no random seed needed + since no random data is used. Minor deduction for not using numpy/random + at all. + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: Only pygal and Style are imported, both are used. + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current pygal API. + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png and plot.html. + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: true + comment: Uses pygal's Style customization, print_values with custom formatter, + SVG/PNG dual output. Could leverage more advanced features like tooltips + configuration or animation settings. + verdict: APPROVED diff --git a/plots/bar-grouped/metadata/seaborn.yaml b/plots/bar-grouped/metadata/seaborn.yaml index 324b14bf23..ccd99d8fe4 100644 --- a/plots/bar-grouped/metadata/seaborn.yaml +++ b/plots/bar-grouped/metadata/seaborn.yaml @@ -22,3 +22,159 @@ review: weaknesses: - Legend positioned in upper left partially overlaps with Q1 bars; consider placing outside plot or in upper right + image_description: 'The plot displays a grouped bar chart showing quarterly sales + data (Q1-Q4) for three product lines: Electronics (dark blue), Clothing (golden + yellow), and Home & Garden (teal). Each quarter has three bars side-by-side. The + y-axis shows "Sales (thousands $)" ranging from 0 to 400, and the x-axis shows + quarters. There''s a clear upward trend for Electronics sales across quarters + (245→280→310→395). The title "bar-grouped · seaborn · pyplots.ai" is centered + at the top. A legend titled "Product Line" is positioned in the upper left corner. + Subtle dashed horizontal grid lines appear in the background.' + criteria_checklist: + visual_quality: + score: 38 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: all text perfectly readable at full size + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: no overlapping text + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: bars well-sized with good spacing + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: colorblind-safe blue/yellow/teal palette + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: excellent proportions, plot fills canvas well + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: Y-axis has units, X-axis is descriptive + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: false + comment: legend position in upper left slightly overlaps with Q1 data area + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: correct grouped bar chart + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: categories on X, values on Y, groups as hue + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: distinct colors, clear legend, consistent spacing + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: all data visible, y-axis starts at 0 + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: labels match data + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: uses {spec-id} · {library} · pyplots.ai + data_quality: + score: 20 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 8 + max: 8 + passed: true + comment: shows variation across quarters and products with clear trends + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: quarterly sales by product line is plausible + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: values in realistic range for sales data + code_quality: + score: 9 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: imports → data → plot → save + - id: CQ-02 + name: Reproducibility + score: 2 + max: 3 + passed: true + comment: deterministic data but no explicit seed marker + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: all imports used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: current seaborn API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: saves as plot.png + library_features: + score: 4 + max: 5 + items: [] + verdict: APPROVED diff --git a/plots/bar-horizontal/metadata/altair.yaml b/plots/bar-horizontal/metadata/altair.yaml index 933a899733..4978ae6ce8 100644 --- a/plots/bar-horizontal/metadata/altair.yaml +++ b/plots/bar-horizontal/metadata/altair.yaml @@ -28,3 +28,171 @@ review: attention - Could leverage more Altair-specific interactivity features like selection/highlighting in HTML version + image_description: The plot displays a horizontal bar chart showing the "Top 10 + programming languages by popularity." Python sits at the top with the longest + bar (~28.5%), followed by JavaScript (~18.2%), Java (~15.8%), and descending to + Kotlin at the bottom (~1.6%). All bars use a consistent blue color (#306998 - + Python Blue) with subtle rounded corners on the right end. The chart has a light + dashed grid (alpha ~0.3) for reference. The y-axis shows "Programming Language" + with all 10 language names clearly readable. The x-axis shows "Popularity (%)" + ranging from 0 to 30. The title "bar-horizontal · altair · pyplots.ai" is centered + at the top. The layout is well-balanced with good use of canvas space. + criteria_checklist: + visual_quality: + score: 38 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title at 28pt, axis labels at 22pt, tick labels at 18pt - all perfectly + readable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text, all category names clearly separated + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bar widths are well-proportioned for 10 categories, appropriate spacing + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Single blue color, excellent contrast against white background + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Chart fills canvas well (~60-70%), balanced margins + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: '"Popularity (%)" includes units, "Programming Language" is descriptive' + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: true + comment: Grid is subtle (alpha 0.3, dashed), but no legend needed for single-color + chart + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct horizontal bar chart + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Categories on Y-axis, values on X-axis (correct horizontal orientation) + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Sorted by value (largest to smallest), consistent bar heights, single + color + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: X-axis shows full range (0-30), all data visible + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: N/A (single color, no legend needed) + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: 'Uses correct format: "bar-horizontal · altair · pyplots.ai"' + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 6 + max: 8 + passed: true + comment: Shows ranking well, but all bars same color (no highlighted bar as + spec suggests could be done) + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Programming language popularity is a real, comprehensible scenario + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: Percentages sum to 100%, values are realistic for language popularity + code_quality: + score: 10 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Clean structure: imports → data → plot → save' + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Deterministic data (hardcoded values, no randomness) + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: Only altair and pandas imported, both used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current Altair API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png and plot.html + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: true + comment: Uses Altair's declarative encoding, tooltips, cornerRadiusEnd for + rounded bars, but could leverage more interactivity features + verdict: APPROVED diff --git a/plots/bar-horizontal/metadata/bokeh.yaml b/plots/bar-horizontal/metadata/bokeh.yaml index a3992201e5..578d6b7e18 100644 --- a/plots/bar-horizontal/metadata/bokeh.yaml +++ b/plots/bar-horizontal/metadata/bokeh.yaml @@ -24,3 +24,161 @@ review: weaknesses: - Some unused canvas space on the right side could be better utilized - Y-axis label is missing (could add Programming Language label for completeness) + image_description: The plot displays a horizontal bar chart showing "Top Programming + Languages by Developer Popularity (%)" with 10 programming languages. The bars + are rendered in a consistent steel blue color (#306998) with a darker border. + Languages are sorted from bottom (Kotlin at 9.2%) to top (JavaScript at 65.6%), + creating a clear visual ranking. The title "bar-horizontal · bokeh · pyplots.ai" + is centered at the top. The x-axis is labeled "Developer Popularity (%)" with + a range from 0 to 70. Category labels (JavaScript, Python, TypeScript, Java, C#, + C++, PHP, Go, Rust, Kotlin) appear on the y-axis. The grid lines are subtle and + dashed, appearing only on the x-axis. The overall layout is clean with good spacing + between bars. + criteria_checklist: + visual_quality: + score: 36 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 9 + max: 10 + passed: true + comment: all text readable, good font sizes for large canvas + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: no overlapping text elements + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: bars well-proportioned with good spacing + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: single blue color is colorblind-safe + - id: VQ-05 + name: Layout Balance + score: 3 + max: 5 + passed: true + comment: functional but some empty space on right + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: descriptive label with units + - id: VQ-07 + name: Grid & Legend + score: 1 + max: 2 + passed: true + comment: subtle grid, no legend needed + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: correct horizontal bar chart + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: categories on Y, values on X + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: sorted bars, consistent heights, single color, good spacing + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: appropriate axis range + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: N/A for single series + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: uses {spec-id} · {library} · pyplots.ai + data_quality: + score: 20 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 8 + max: 8 + passed: true + comment: shows full range of values with good variation + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: real programming language popularity data + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: realistic percentage values + code_quality: + score: 9 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: clean imports → data → plot → save + - id: CQ-02 + name: Reproducibility + score: 2 + max: 3 + passed: true + comment: deterministic data, no random seed needed + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: all imports used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: current APIs + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: saves as plot.png + library_features: + score: 4 + max: 5 + items: [] + verdict: APPROVED diff --git a/plots/bar-horizontal/metadata/highcharts.yaml b/plots/bar-horizontal/metadata/highcharts.yaml index 666efb22f8..a4e2a99e97 100644 --- a/plots/bar-horizontal/metadata/highcharts.yaml +++ b/plots/bar-horizontal/metadata/highcharts.yaml @@ -23,3 +23,177 @@ review: weaknesses: - Y-axis title could be more prominent or positioned better - X-axis tick labels every 2% create visual clutter; every 10% or 20% would be cleaner + image_description: The plot displays a horizontal bar chart showing "Top 10 Countries + by Renewable Energy Share (%)" as the subtitle. The title reads "bar-horizontal + · highcharts · pyplots.ai" in bold at the top. Ten blue bars (#306998) extend + horizontally from left to right, with country names on the y-axis (Switzerland + at top, Iceland at bottom - sorted ascending by value). Each bar has a data label + showing the percentage value (e.g., "85%" for Iceland, "38.5%" for Switzerland). + The x-axis shows percentage values from 0% to 100% with tick marks every 2%. The + background is white with subtle gray gridlines. The layout is clean with good + spacing between bars. + criteria_checklist: + visual_quality: + score: 37 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title at 48px, subtitle at 32px, axis labels at 28px/24px - all clearly + readable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text, all labels fully visible + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bars well-sized with appropriate padding and spacing + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Single blue color (#306998) is colorblind-safe + - id: VQ-05 + name: Layout Balance + score: 4 + max: 5 + passed: true + comment: Good margins and canvas utilization, slight excess whitespace at + bottom + - id: VQ-06 + name: Axis Labels + score: 1 + max: 2 + passed: true + comment: Y-axis has descriptive label "Renewable Energy Share (%)" but no + x-axis category title needed + - id: VQ-07 + name: Grid & Legend + score: 1 + max: 2 + passed: true + comment: Subtle grid (alpha 0.3 equivalent), legend disabled which is appropriate + for single series + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct horizontal bar chart + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Categories on y-axis, values as bar lengths - correctly assigned + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Sorted bars, consistent bar heights, data labels, single color, adequate + spacing + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: Y-axis shows 0-100%, all data visible + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend correctly disabled for single series + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: Uses correct format "bar-horizontal · highcharts · pyplots.ai" + data_quality: + score: 19 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 7 + max: 8 + passed: true + comment: Shows 10 categories with varying values demonstrating ranking visualization; + could show more value diversity + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Renewable energy percentages by country is a realistic, relatable + scenario + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: Percentages range from 38.5% to 85%, realistic for renewable energy + data + code_quality: + score: 7 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Linear structure: imports → data → chart setup → export' + - id: CQ-02 + name: Reproducibility + score: 0 + max: 3 + passed: false + comment: No random seed needed (deterministic data), but data is hardcoded + which is fine + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: All imports are used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current Highcharts API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png and plot.html + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: true + comment: Uses Highcharts bar series with data labels, custom styling, and + proper chart export via Selenium; could leverage more Highcharts-specific + features like tooltips or animations + verdict: APPROVED diff --git a/plots/bar-horizontal/metadata/letsplot.yaml b/plots/bar-horizontal/metadata/letsplot.yaml index 3cec5fe4b6..c5c6c73672 100644 --- a/plots/bar-horizontal/metadata/letsplot.yaml +++ b/plots/bar-horizontal/metadata/letsplot.yaml @@ -22,3 +22,167 @@ review: weaknesses: - Grid customization could be slightly more refined with lower alpha for vertical grid lines + image_description: 'The plot displays a horizontal bar chart showing programming + language popularity among developers. Ten programming languages are listed on + the y-axis (from bottom to top: Rust, Go, C, PHP, C++, C#, TypeScript, Java, Python, + JavaScript), sorted by popularity in ascending order. The x-axis shows "Developers + (%)" ranging from 0 to 65. All bars use a consistent steel blue color (#306998). + JavaScript leads at ~65%, followed by Python at ~49%. The title "bar-horizontal + · letsplot · pyplots.ai" appears at the top in bold. The chart uses a minimal + theme with light gray vertical grid lines and no horizontal grid lines, providing + a clean, professional appearance.' + criteria_checklist: + visual_quality: + score: 38 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title bold ~24pt, axis labels ~20pt, tick labels ~16pt, all perfectly + readable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text anywhere + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bars well-sized with width=0.7 and alpha=0.9 + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Single color (#306998), colorblind-safe + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Excellent canvas utilization, balanced margins + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: '"Programming Language" and "Developers (%)" with units' + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: true + comment: Vertical grid subtle, no legend needed for single-color bars + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct horizontal bar chart + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Categories on y-axis, values on x-axis + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Sorted by value, single color, consistent bar heights, adequate spacing + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: All data visible within axes + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: N/A for single-color bars + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: Uses "bar-horizontal · letsplot · pyplots.ai" + data_quality: + score: 20 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 8 + max: 8 + passed: true + comment: 10 categories with good value variation (11.76 to 65.36) + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Real programming language survey data + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: Realistic percentages matching real-world surveys + code_quality: + score: 10 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: imports → data → plot → save + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Deterministic data (no random values) + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: Only pandas and lets_plot + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Current API usage + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves plot.png correctly + library_features: + score: 5 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 5 + max: 5 + passed: true + comment: ggplot2 grammar, coord_flip, theme_minimal, ggsize, scale parameter + verdict: APPROVED diff --git a/plots/bar-horizontal/metadata/matplotlib.yaml b/plots/bar-horizontal/metadata/matplotlib.yaml index bd8aa778f9..44e67c225a 100644 --- a/plots/bar-horizontal/metadata/matplotlib.yaml +++ b/plots/bar-horizontal/metadata/matplotlib.yaml @@ -22,3 +22,174 @@ review: - Could highlight the top 1-3 languages with a different color to draw attention as suggested in spec - Bar edge color adds visual complexity without clear benefit + image_description: The plot displays a horizontal bar chart showing "Top 10 programming + languages by popularity". The chart uses a blue color (#306998) for all bars with + a darker edge. Python is at the top with 68.2%, followed by JavaScript at 62.5%, + then Java, C++, TypeScript, C#, Go, Rust, PHP, and Swift at the bottom with 18.3%. + Bars are sorted from largest (top) to smallest (bottom). Each bar has a percentage + label at its end. The x-axis shows "Popularity (%)" ranging from 0 to 80, and + the y-axis shows "Programming Language". The title correctly uses the format "bar-horizontal + · matplotlib · pyplots.ai". A subtle dashed grid appears on the x-axis. Top and + right spines are removed for a cleaner look. + criteria_checklist: + visual_quality: + score: 38 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title at 24pt, axis labels at 20pt, tick labels at 16pt - all perfectly + readable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text, all category labels and value labels are clearly + separated + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bar heights appropriate (0.65), good spacing between bars, value + labels clearly visible + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Single blue color scheme, no colorblind issues, good contrast + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Plot fills canvas well, balanced margins, good proportions + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: X-axis has "Popularity (%)" with units, Y-axis has descriptive "Programming + Language" + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: false + comment: Grid is subtle (alpha=0.3), but no legend needed/present (acceptable) + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct horizontal bar chart using ax.barh() + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Categories on Y-axis, values on X-axis as specified + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: 'All spec features present: sorted bars, consistent bar heights, + value labels at bar ends, adequate spacing' + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: X-axis extends to 80% (1.2x max value) showing all data clearly + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: No legend needed for single-series chart + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: Uses exact format "bar-horizontal · matplotlib · pyplots.ai" + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 6 + max: 8 + passed: true + comment: Shows ranking effectively with 10 categories, good variety in values, + but all bars same color (spec mentions "highlight specific bars" as option) + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Programming language popularity is a realistic, relatable scenario + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: Percentages are realistic and within plausible range for survey data + code_quality: + score: 10 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: Clean imports → data → plot → save structure, no functions/classes + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: np.random.seed(42) set (though not strictly needed for hardcoded + data) + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: Only matplotlib.pyplot and numpy imported, both used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: No deprecated functions used + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as 'plot.png' with dpi=300 + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: true + comment: Uses ax.barh(), text annotations, spine removal, but no advanced + matplotlib features like custom patches or color gradients + verdict: APPROVED diff --git a/plots/bar-horizontal/metadata/plotly.yaml b/plots/bar-horizontal/metadata/plotly.yaml index 0783d1e3c1..b2daa2e290 100644 --- a/plots/bar-horizontal/metadata/plotly.yaml +++ b/plots/bar-horizontal/metadata/plotly.yaml @@ -23,3 +23,181 @@ review: - Value label font size (32) could be slightly reduced as it appears close to bar ends - X-axis range padding (1.15x max) creates extra whitespace on right side + image_description: The plot displays a horizontal bar chart showing survey results + for "What programming language do you use most?". Ten programming languages are + listed on the y-axis (Python, JavaScript, TypeScript, Java, C++, Go, Rust, Ruby, + PHP, Swift) with horizontal blue bars (#306998) extending to the right representing + the number of responses. Each bar has a value label displayed outside at the end. + The bars are sorted in descending order by value, with Python having the longest + bar (2847 responses) and Swift the shortest (298). The title "bar-horizontal · + plotly · pyplots.ai" is centered at the top. The x-axis shows "Number of Responses" + ranging from 0 to ~3000, and the y-axis is labeled "Programming Language". The + background uses the plotly_white template with subtle grid lines on the x-axis. + Overall layout is clean and well-proportioned. + criteria_checklist: + visual_quality: + score: 37 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title, axis labels, tick labels, and value labels are all clearly + readable at the 4800x2700 resolution with appropriate font sizes (32-40pt) + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements; category labels on y-axis are well-spaced, + value labels positioned outside bars with no collision + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bars are appropriately sized with good spacing (bargap=0.3), marker_line + adds nice visual definition + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Single color scheme (#306998 blue) is colorblind-safe + - id: VQ-05 + name: Layout Balance + score: 4 + max: 5 + passed: true + comment: Good use of canvas space with appropriate margins; slight deduction + as some extra whitespace on right due to x-axis range extension + - id: VQ-06 + name: Axis Labels + score: 1 + max: 2 + passed: true + comment: Descriptive labels ("Number of Responses", "Programming Language") + but no units + - id: VQ-07 + name: Grid & Legend + score: 1 + max: 2 + passed: true + comment: Grid is subtle (alpha=0.1), no legend needed for single-series chart; + y-axis grid is appropriately hidden + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct horizontal bar chart implementation + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Categories on y-axis, values on x-axis as expected for horizontal + bars + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Consistent bar heights, sorted by value (descending), single color, + good spacing, value labels at end of bars + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: X-axis range (0 to max*1.15) shows all data with room for labels + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: No legend needed for single-series; N/A but appropriate + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: 'Correct format: "bar-horizontal · plotly · pyplots.ai"' + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 6 + max: 8 + passed: true + comment: Shows ranking, comparison, and survey result use case well; could + show more variation in bar lengths (current distribution is fairly linear + decline) + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Programming language survey is a perfect, relatable real-world scenario + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: Response counts (298-2847) are realistic for a developer survey + code_quality: + score: 9 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Clean structure: imports → data → plot → save, no functions/classes' + - id: CQ-02 + name: Reproducibility + score: 2 + max: 3 + passed: false + comment: Data is deterministic (hardcoded), but no np.random.seed even though + it's not strictly needed here + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: Only plotly.graph_objects is imported, which is used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current Plotly API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png and plot.html + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: true + comment: Uses go.Bar with orientation="h", text labels, template system; generates + HTML for interactivity. Could leverage more Plotly features like hover customization + or annotations. + verdict: APPROVED diff --git a/plots/bar-horizontal/metadata/plotnine.yaml b/plots/bar-horizontal/metadata/plotnine.yaml index 2bef99b302..d7aba384ca 100644 --- a/plots/bar-horizontal/metadata/plotnine.yaml +++ b/plots/bar-horizontal/metadata/plotnine.yaml @@ -22,3 +22,162 @@ review: weaknesses: - Grid styling uses element_text instead of element_line for panel_grid_major_x and panel_grid_minor (should be element_line(color=...)) + image_description: The plot displays a horizontal bar chart showing "Top 10 programming + languages by popularity" with programming languages on the Y-axis and developer + usage percentage on the X-axis. JavaScript leads at 65.6%, followed by Python + at 49.3%, with Swift at the bottom at 6.6%. The bars are a consistent steel blue + color (#306998), extending horizontally from left to right. Each bar has a percentage + label positioned just to the right of the bar end. The title "bar-horizontal · + plotnine · pyplots.ai" appears at the top in bold. The minimal theme provides + a clean white background with subtle gray grid lines. The layout is well-balanced + with the plot filling the canvas appropriately. + criteria_checklist: + visual_quality: + score: 38 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title bold ~24pt, axis labels ~20pt, tick labels ~16pt, all perfectly + readable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: All text clearly separated, no overlapping elements + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bars well-sized with width=0.7, good spacing, data labels visible + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Single blue color, no accessibility issues + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Excellent canvas utilization with balanced margins + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: 'Descriptive with units: "Developer Usage (%)", "Programming Language"' + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: false + comment: Uses `element_text` instead of `element_line` for grid styling (incorrect + API, though visually acceptable) + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct horizontal bar chart using coord_flip() + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Categories on Y-axis, values on X-axis as required + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Sorted bars, consistent heights, value labels, adequate spacing + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: All data visible with appropriate axis range + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: N/A (single series, no legend needed) + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: 'Correct format: "bar-horizontal · plotnine · pyplots.ai"' + data_quality: + score: 20 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 8 + max: 8 + passed: true + comment: Good value variation (6.6% to 65.6%), properly sorted + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Programming language popularity is a relatable, real-world scenario + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: Percentages are realistic for developer usage statistics + code_quality: + score: 9 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: Clean imports → data → plot → save structure + - id: CQ-02 + name: Reproducibility + score: 2 + max: 3 + passed: true + comment: Deterministic hardcoded data, no random elements + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: All imports used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Current API usage + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png + library_features: + score: 5 + max: 5 + items: [] + verdict: APPROVED diff --git a/plots/bar-horizontal/metadata/pygal.yaml b/plots/bar-horizontal/metadata/pygal.yaml index 246287e58d..e4d50f80ef 100644 --- a/plots/bar-horizontal/metadata/pygal.yaml +++ b/plots/bar-horizontal/metadata/pygal.yaml @@ -27,3 +27,175 @@ review: readability - Value labels on bars (18.6%, 16.3%, 12.9%) are positioned inside bars making them harder to read against the blue background + image_description: The plot displays a horizontal bar chart showing programming + language popularity survey results. There are 10 horizontal bars in a consistent + steel blue color (#306998), sorted from highest (Python at 68.7%) to lowest (Swift + at 12.9%). The title "bar-horizontal · pygal · pyplots.ai" appears at the top + in dark text. The x-axis shows "Popularity (%)" with tick marks from 0.0% to 60.0%. + Each bar has its percentage value displayed at the end. A legend at the bottom + shows all 10 programming languages (Python, JavaScript, Java, C++, TypeScript, + C#, Go, Rust, PHP, Swift) arranged in two rows of 5 columns. The background is + white with subtle vertical grid lines. The bars have good spacing and the overall + layout is clean and professional. + criteria_checklist: + visual_quality: + score: 36 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 9 + max: 10 + passed: true + comment: Title and axis labels are clearly readable; value labels on bars + are slightly small but legible + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text anywhere + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bars are well-sized with good spacing between them + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Single color scheme (steel blue) is colorblind-safe + - id: VQ-05 + name: Layout Balance + score: 4 + max: 5 + passed: true + comment: Good use of canvas space; slight issue with no y-axis category labels + visible on the bars themselves + - id: VQ-06 + name: Axis Labels + score: 1 + max: 2 + passed: true + comment: X-axis has "Popularity (%)" with units, but no y-axis label (categories + shown in legend instead) + - id: VQ-07 + name: Grid & Legend + score: 1 + max: 2 + passed: true + comment: Subtle vertical grid lines; legend at bottom is functional but spreads + categories far from their bars + spec_compliance: + score: 23 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct horizontal bar chart + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Categories on y-axis, values on x-axis as horizontal bar lengths + - id: SC-03 + name: Required Features + score: 4 + max: 5 + passed: true + comment: Has consistent bar heights, sorted by value, single color; missing + direct category labels on y-axis + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: All data visible, axis extends appropriately + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend labels match data correctly + - id: SC-06 + name: Title Format + score: 1 + max: 2 + passed: true + comment: Uses correct format but uses center dot (·) separator correctly + data_quality: + score: 20 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 8 + max: 8 + passed: true + comment: Shows full range of values with clear differentiation between bars + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Programming language popularity is a real, relatable survey scenario + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: Percentages are realistic for language popularity surveys + code_quality: + score: 9 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: Simple imports → data → plot → save structure + - id: CQ-02 + name: Reproducibility + score: 2 + max: 3 + passed: true + comment: Data is deterministic (hardcoded), but no explicit seed needed; minor + deduction for not using np.random + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: Only pygal and Style imported, both used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current pygal API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png and plot.html + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: true + comment: Uses pygal's HorizontalBar, custom Style, print_values, value_formatter, + and SVG-based rendering with HTML export; could leverage more interactive + features + verdict: APPROVED diff --git a/plots/bar-horizontal/metadata/seaborn.yaml b/plots/bar-horizontal/metadata/seaborn.yaml index 38c72aab06..12da91c278 100644 --- a/plots/bar-horizontal/metadata/seaborn.yaml +++ b/plots/bar-horizontal/metadata/seaborn.yaml @@ -23,3 +23,175 @@ review: suggestion for drawing attention to specific categories - Uses seaborn primarily as a styling layer over matplotlib rather than leveraging seaborn statistical features + image_description: The plot displays a horizontal bar chart showing programming + language popularity survey results. There are 10 horizontal bars in a consistent + steel blue color (#306998), sorted from lowest (Kotlin at 12%) at the top to highest + (Python at 68%) at the bottom. Each bar has a percentage label at its end. The + y-axis shows "Programming Language" with language names (Kotlin, Swift, Rust, + Go, TypeScript, C#, C++, Java, JavaScript, Python), and the x-axis shows "Percentage + of Respondents (%)" with values from 0 to 70. The title reads "bar-horizontal + · seaborn · pyplots.ai". A subtle dashed grid is visible on the x-axis. Top and + right spines are removed for a cleaner look. + criteria_checklist: + visual_quality: + score: 37 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: 'All text is perfectly readable: title at 24pt, axis labels at 20pt, + tick labels at 16pt' + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements, all labels clearly separated + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bars are well-sized with consistent height, good spacing between + categories + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Single color scheme avoids colorblind issues entirely + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Plot fills canvas well, balanced margins, good use of space + - id: VQ-06 + name: Axis Labels + score: 1 + max: 2 + passed: false + comment: X-axis has units "(%)", Y-axis label "Programming Language" is descriptive + but no unit needed for categorical + - id: VQ-07 + name: Grid & Legend + score: 2 + max: 2 + passed: true + comment: Subtle dashed grid at alpha 0.3, no legend needed (single color) + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct horizontal bar chart + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Categories on Y-axis, values on X-axis as specified + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: 'All spec features present: sorted bars, value labels, consistent + bar heights, adequate spacing' + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: X-axis extended to 78 to accommodate labels, all data visible + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: No legend needed for single-color chart + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: Uses correct format "bar-horizontal · seaborn · pyplots.ai" + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 7 + max: 8 + passed: true + comment: Shows ranking/comparison well, sorted from low to high; could have + highlighted a specific bar to show that feature + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Programming language popularity survey is a real, relatable scenario + - id: DQ-03 + name: Appropriate Scale + score: 4 + max: 5 + passed: true + comment: Values are percentages 12-68%, realistic but total exceeds 100% (multi-select + survey implied) + code_quality: + score: 9 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Clean linear flow: imports → data → plot → save' + - id: CQ-02 + name: Reproducibility + score: 2 + max: 3 + passed: false + comment: Data is deterministic but no random seed comment since data is hardcoded + (acceptable, but could document) + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: 'Only used imports: matplotlib.pyplot, pandas, seaborn' + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses modern seaborn API with hue parameter correctly + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: false + comment: Uses seaborn's barplot correctly with hue for palette, but doesn't + leverage seaborn-specific statistical features like confidence intervals + or other advanced capabilities + verdict: APPROVED diff --git a/plots/bar-permutation-importance/metadata/altair.yaml b/plots/bar-permutation-importance/metadata/altair.yaml index 1a8f7de642..98104f2bca 100644 --- a/plots/bar-permutation-importance/metadata/altair.yaml +++ b/plots/bar-permutation-importance/metadata/altair.yaml @@ -26,3 +26,174 @@ review: - Missing subtle grid lines that would help readers trace values across the chart - Could benefit from adding .interactive() for zoom/pan capabilities on the HTML version + image_description: The plot displays a horizontal bar chart with 15 housing price + model features sorted by permutation importance (highest at top). Location Score + (~0.142) and Square Footage (~0.128) are the most important features, shown with + darker blue bars. The color gradient uses a sequential blue palette ("blues" scheme), + with bars transitioning from dark blue (high importance) to very light blue (near-zero + or negative importance). Horizontal error bars extend from each bar showing variability + across shuffles. A vertical dashed reference line at x=0 distinguishes positive + from negative importance. Two features (Basement Area and Pool Presence) show + small negative importance values. The x-axis is labeled "Mean Decrease in Model + Score" and y-axis is labeled "Feature". The title correctly uses the format "bar-permutation-importance + · altair · pyplots.ai". + criteria_checklist: + visual_quality: + score: 36 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title at 28pt, axis labels at 22pt, tick labels at 16-18pt, all clearly + readable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements, feature names well-spaced + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bar size (30) appropriate for 15 features, error bars clearly visible + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Sequential blue palette is colorblind-safe + - id: VQ-05 + name: Layout Balance + score: 3 + max: 5 + passed: true + comment: Good use of canvas but some whitespace could be optimized + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: 'Descriptive labels: "Mean Decrease in Model Score", "Feature"' + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: true + comment: No grid lines present (would help readability), no legend needed + (color legend disabled) + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct horizontal bar chart + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Features on Y-axis, importance on X-axis, correctly mapped + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Has error bars, zero line, sorted by importance, color gradient + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: All data visible including negative values + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: N/A (legend appropriately hidden for single color scale) + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: 'Uses exact format: {spec-id} · {library} · pyplots.ai' + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 7 + max: 8 + passed: true + comment: Shows positive, near-zero, and negative importance values; good variety + in importance magnitudes + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Housing price prediction is a well-known ML scenario with realistic + feature names + - id: DQ-03 + name: Appropriate Scale + score: 4 + max: 5 + passed: true + comment: Importance values (0.005-0.142) are realistic for permutation importance; + std devs appropriately scaled + code_quality: + score: 9 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: Clean imports → data → plot → save structure + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: np.random.seed(42) set + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: Only necessary imports (altair, numpy, pandas) + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current Altair API + - id: CQ-05 + name: Output Correct + score: 0 + max: 0 + passed: true + comment: Saves as plot.png and plot.html (correct) + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: true + comment: Uses Altair's declarative layering, tooltips, encoding sort field, + but could use more interactivity + verdict: APPROVED diff --git a/plots/bar-permutation-importance/metadata/bokeh.yaml b/plots/bar-permutation-importance/metadata/bokeh.yaml index 2538e281f8..c9eaeea6aa 100644 --- a/plots/bar-permutation-importance/metadata/bokeh.yaml +++ b/plots/bar-permutation-importance/metadata/bokeh.yaml @@ -27,3 +27,178 @@ review: improve visibility - Could leverage Bokeh interactive features like HoverTool to show exact values on hover + image_description: 'The plot displays a horizontal bar chart showing permutation + feature importance for a housing price prediction model. There are 15 features + sorted by mean importance (highest at top): Square Footage, Number of Bedrooms, + Neighborhood Score, etc. The bars use a blue sequential color gradient from Blues9 + palette (darker blue = higher importance, lighter blue = lower/negative importance). + Each bar has horizontal error bars (whiskers) showing the standard deviation across + permutation shuffles. A vertical dashed reference line at x=0 distinguishes positive + from negative importance values. The bottom two features (Walk Score, Public Transit + Access) have slightly negative importance values extending left of the zero line. + The title "bar-permutation-importance · bokeh · pyplots.ai" appears at the top. + The x-axis is labeled "Mean Decrease in Model Score" and feature names are displayed + on the y-axis.' + criteria_checklist: + visual_quality: + score: 36 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 9 + max: 10 + passed: true + comment: Title at 32pt, axis labels at 24pt, tick labels at 18pt - all clearly + readable, slightly larger title would be ideal but very good + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text, all feature names fully visible + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bars well-sized with height=0.7, error bars visible with line_width=3 + - id: VQ-04 + name: Color Accessibility + score: 4 + max: 5 + passed: true + comment: Blues9 sequential palette is colorblind-safe, good choice, though + gradient differences are subtle for middle values + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Good use of canvas space, balanced margins + - id: VQ-06 + name: Axis Labels + score: 1 + max: 2 + passed: true + comment: X-axis has descriptive label but no units (could be "Mean Decrease + in R² Score" or similar) + - id: VQ-07 + name: Grid & Legend + score: 1 + max: 2 + passed: true + comment: X-grid at alpha 0.4 is appropriate, y-grid disabled correctly, no + legend needed for this plot type + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct horizontal bar chart for permutation importance + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Features on y-axis, importance on x-axis, correctly mapped + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: 'All spec features present: sorted bars, error bars, color gradient, + zero reference line' + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: All data visible including negative values + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: No legend needed, N/A (full points) + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: 'Correct format: "bar-permutation-importance · bokeh · pyplots.ai"' + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 7 + max: 8 + passed: true + comment: Shows range from high importance to negative importance, good variability + in std values, could show more extreme negative cases + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Housing price model is an excellent, neutral, real-world ML scenario + - id: DQ-03 + name: Appropriate Scale + score: 4 + max: 5 + passed: true + comment: Importance values 0.18 to -0.008 are realistic for sklearn permutation_importance + output, std values proportional + code_quality: + score: 9 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Clean linear flow: imports → data → plot → save' + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: np.random.seed(42) set + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: All imports used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Using current Bokeh API + - id: CQ-05 + name: Output Correct + score: 0 + max: 1 + passed: false + comment: Saves as plot.png correctly + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: true + comment: Good use of ColumnDataSource, linear_cmap transform, Whisker model + for error bars - these are Bokeh-specific patterns, but could leverage HoverTool + for interactivity + verdict: APPROVED diff --git a/plots/bar-permutation-importance/metadata/highcharts.yaml b/plots/bar-permutation-importance/metadata/highcharts.yaml index 97946297ec..9c55d6f47b 100644 --- a/plots/bar-permutation-importance/metadata/highcharts.yaml +++ b/plots/bar-permutation-importance/metadata/highcharts.yaml @@ -1,6 +1,3 @@ -# Per-library metadata for highcharts implementation of bar-permutation-importance -# Auto-generated by impl-generate.yml - library: highcharts specification_id: bar-permutation-importance created: '2025-12-31T10:59:42Z' @@ -15,5 +12,192 @@ preview_thumb: https://storage.googleapis.com/pyplots-images/plots/bar-permutati preview_html: https://storage.googleapis.com/pyplots-images/plots/bar-permutation-importance/highcharts/plot.html quality_score: null review: - strengths: [] - weaknesses: [] + strengths: + - Excellent use of Highcharts-specific features including error bar series overlay + and dynamic color gradient per bar + - Clean sequential blue color scheme effectively communicates importance magnitude + - Proper implementation of horizontal bar chart with sorted features (most important + at top) + - Error bars clearly show variability across permutation repetitions + - Vertical reference line at x=0 effectively distinguishes positive from negative + importance + - Good subtitle provides meaningful context about the model being visualized + - 'Appropriate margin settings (marginLeft: 300) prevent feature name truncation' + weaknesses: + - X-axis tick labels at bottom appear small/compressed in the PNG - could benefit + from larger font size + - Legend is disabled which removes the "Importance" series name context (though + acceptable for single series) + image_description: The plot is a horizontal bar chart displaying permutation feature + importance for a crop yield prediction model. The chart shows 15 features sorted + by importance (highest at top). Colors use a sequential blue gradient - darker + blue (#306998) for most important features fading to lighter blue for less important + ones. The title reads "bar-permutation-importance · highcharts · pyplots.ai" with + a subtitle "Crop Yield Prediction Model - Feature Importance". The y-axis shows + "Mean Decrease in Model Score" with tick marks from approximately -0.05 to 0.40. + The x-axis displays feature names like "Temperature (C)", "Humidity (%)", "Wind + Speed (m/s)", etc. Error bars (whiskers) are visible on each bar showing importance + variability. A vertical reference line at x=0 distinguishes positive from negative + importance values. Two features (Visibility and Air Quality Index) show slightly + negative importance with error bars crossing zero. + criteria_checklist: + visual_quality: + score: 37 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title at 48px, subtitle at 32px, axis labels at 32px, tick labels + at 24-26px - all perfectly readable at 4800x2700 + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements, feature names fully visible on left + side with adequate margin (300px) + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bars are well-sized, error bars clearly visible with appropriate + whisker width (4px) and stem width + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Uses colorblind-safe blue sequential gradient, no red-green issues + - id: VQ-05 + name: Layout Balance + score: 4 + max: 5 + passed: true + comment: 'Good use of canvas, adequate margins, minor: could use slightly + more vertical spacing between bars' + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: Y-axis has descriptive label "Mean Decrease in Model Score", X-axis + labeled "Feature" + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: false + comment: Grid is present but x-axis tick labels at bottom appear small/compressed + spec_compliance: + score: 23 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct horizontal bar chart type + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Features on y-axis (categories), importance on x-axis correctly assigned + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: 'All spec features present: horizontal bars sorted by importance, + error bars for variability, sequential color gradient, vertical reference + line at x=0' + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: Axes show all data including negative values + - id: SC-05 + name: Legend Accuracy + score: 0 + max: 2 + passed: true + comment: No legend shown (legend disabled, which is acceptable for single + series but loses some context) + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: 'Correct format: "bar-permutation-importance · highcharts · pyplots.ai"' + data_quality: + score: 19 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 8 + max: 8 + passed: true + comment: Shows 15 features with varying importance including positive AND + negative values, demonstrates model-agnostic permutation importance concept + well + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Crop yield prediction with weather/environmental features is a plausible, + neutral scientific scenario + - id: DQ-03 + name: Appropriate Scale + score: 4 + max: 5 + passed: true + comment: Values range from ~-0.02 to ~0.35 which is realistic for permutation + importance scores + code_quality: + score: 8 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: HTML shows clean chart configuration, no unnecessary complexity + - id: CQ-02 + name: Reproducibility + score: 2 + max: 3 + passed: true + comment: Data appears deterministic but seed handling not visible in HTML + output + - id: CQ-03 + name: Clean Imports + score: 1 + max: 2 + passed: true + comment: Single Highcharts dependency properly embedded inline + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current Highcharts v12.4.0 API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png and plot.html + library_features: + score: 5 + max: 5 + items: [] + verdict: APPROVED diff --git a/plots/bar-permutation-importance/metadata/letsplot.yaml b/plots/bar-permutation-importance/metadata/letsplot.yaml index 17a6895564..9215da5f51 100644 --- a/plots/bar-permutation-importance/metadata/letsplot.yaml +++ b/plots/bar-permutation-importance/metadata/letsplot.yaml @@ -24,3 +24,182 @@ review: - geom_vline with xintercept=0 creates a horizontal line instead of vertical after the coordinate flip - HTML output could leverage lets-plot interactivity features like tooltips + image_description: The plot displays a horizontal bar chart showing permutation + feature importance for 15 features from a credit/lending machine learning model. + The bars are colored using a gradient from yellow (low importance) to blue (high + importance). Income Level has the highest importance (~0.15), followed by Credit + Score (~0.12), Employment Years (~0.09), and so on down to Region Code (near zero/slightly + negative). Each bar has black error bars showing the standard deviation. A dashed + gray vertical reference line is visible at x=0. The y-axis shows feature names + (Feature), and the x-axis shows "Mean Decrease in Model Score". The title reads + "bar-permutation-importance · letsplot · pyplots.ai". The plot uses a minimal + theme with subtle gray gridlines. + criteria_checklist: + visual_quality: + score: 36 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 9 + max: 10 + passed: true + comment: 'Title, axis labels, and tick labels are all readable at full size. + Font sizes are well-chosen (24pt title, 20pt axis labels, 16/14pt tick labels). + Minor: y-axis labels could be slightly larger.' + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text anywhere. Feature names are well-spaced. + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bars are clearly visible with good width (0.7) and alpha (0.9). Error + bars are distinct with appropriate width and color. + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Yellow-to-blue gradient is colorblind-safe, good contrast. + - id: VQ-05 + name: Layout Balance + score: 4 + max: 5 + passed: true + comment: 'Plot fills canvas well; minor: some whitespace on the right side.' + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: 'Descriptive labels: "Feature" and "Mean Decrease in Model Score".' + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: true + comment: Grid is subtle and appropriate. Legend is hidden (guide="none") which + is correct since color encodes the same variable as bar length. However, + the dashed reference line at x=0 is positioned incorrectly - it appears + as a horizontal line across the plot rather than a vertical line at x=0 + on the importance axis. + spec_compliance: + score: 23 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct horizontal bar chart for permutation importance. + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Features on y-axis, importance mean on x-axis with error bars. + - id: SC-03 + name: Required Features + score: 4 + max: 5 + passed: true + comment: Has sorted bars, error bars, color gradient, but the vertical reference + line at x=0 is not rendering correctly (appears as horizontal dashed line). + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: All data visible, shows full range including negative values. + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: No legend needed, color gradient is self-explanatory with sorted + bars. + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: 'Correct format: "bar-permutation-importance · letsplot · pyplots.ai"' + data_quality: + score: 20 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 8 + max: 8 + passed: true + comment: Shows 15 features with varying importance levels, includes positive + and near-zero/negative values, varying error bar sizes. + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Credit/lending scenario is realistic and neutral. Feature names make + domain sense. + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: Importance values (0-0.15) are realistic for permutation importance + output. + code_quality: + score: 9 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Simple linear structure: imports → data → plot → save.' + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: np.random.seed(42) set. + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: All imports are used. + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Current API usage. + - id: CQ-05 + name: Output Correct + score: 0 + max: 1 + passed: false + comment: Uses path="." which works but non-standard; should just be filename + only for cleaner approach. + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: true + comment: Uses lets-plot ggplot2-style grammar with geoms, themes, scales. + Good use of scale_fill_gradient and theme customization. Could use more + advanced features like tooltips for interactivity in HTML output. + verdict: APPROVED diff --git a/plots/bar-permutation-importance/metadata/matplotlib.yaml b/plots/bar-permutation-importance/metadata/matplotlib.yaml index 87ffd55b83..c1a9459d92 100644 --- a/plots/bar-permutation-importance/metadata/matplotlib.yaml +++ b/plots/bar-permutation-importance/metadata/matplotlib.yaml @@ -24,3 +24,175 @@ review: - Could demonstrate more edge cases like several features with very similar near-zero importance - Limited use of distinctive matplotlib features beyond standard barh and colorbar + image_description: The plot displays a horizontal bar chart showing permutation + feature importance for 13 wine-related features. Bars extend horizontally from + a vertical reference line at x=0, with the highest importance feature (flavanoids, + ~0.142) at the top and the lowest (ash, ~-0.002) at the bottom. The bars use a + sequential Blues color gradient mapped to importance values - darker blue for + higher importance, lighter for lower. Each bar includes horizontal error bars + (gray caps) showing standard deviation. The colorbar on the right indicates the + importance scale (0.00-0.14). Title follows the correct format. X-axis shows "Mean + Decrease in Accuracy" and Y-axis shows "Feature". Grid lines are subtle with dashed + styling at alpha=0.3. + criteria_checklist: + visual_quality: + score: 38 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title at 24pt, axis labels at 20pt, ticks at 16pt - all perfectly + readable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements, feature names are spaced well + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bar height 0.7 is appropriate for 13 features, error bars clearly + visible + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Blues sequential colormap is colorblind-safe + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Plot fills canvas well, colorbar placed with appropriate padding + - id: VQ-06 + name: Axis Labels + score: 1 + max: 2 + passed: true + comment: Descriptive labels but x-axis could include "(fraction)" or similar + unit + - id: VQ-07 + name: Grid & Legend + score: 1 + max: 2 + passed: true + comment: Grid subtle (alpha=0.3), colorbar replaces legend appropriately; + grid only on x-axis as intended + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct horizontal bar chart for permutation importance + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Features on Y-axis, importance on X-axis as specified + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: 'All spec features present: sorted by importance, error bars, color + gradient, reference line at x=0' + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: X-axis shows full range including negative value (ash) + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Colorbar correctly labeled "Importance" + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: 'Follows exact format: "bar-permutation-importance · matplotlib · + pyplots.ai"' + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 6 + max: 8 + passed: true + comment: Shows positive and negative importance values, varying magnitudes; + could include more features with near-zero importance for better demonstration + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Wine dataset features (sklearn wine) are realistic and neutral + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: Importance values 0-0.15 are typical for permutation importance + code_quality: + score: 10 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: Follows imports → data → plot → save pattern, no functions/classes + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Uses np.random.seed(42) + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: Only matplotlib.pyplot and numpy used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current matplotlib API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png with dpi=300 + library_features: + score: 2 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 2 + max: 5 + passed: false + comment: Uses barh, colorbar, ScalarMappable correctly; could leverage ax.errorbar + or more advanced matplotlib features + verdict: APPROVED diff --git a/plots/bar-permutation-importance/metadata/plotly.yaml b/plots/bar-permutation-importance/metadata/plotly.yaml index e10ff0df0b..cdaffce3fe 100644 --- a/plots/bar-permutation-importance/metadata/plotly.yaml +++ b/plots/bar-permutation-importance/metadata/plotly.yaml @@ -26,3 +26,176 @@ review: - X-axis label could include units or more context (e.g., Mean Decrease in R² Score) - Color gradient could use a more standard colormap name for clarity in code - Could add annotations for the top features to enhance information density + image_description: The plot displays a horizontal bar chart showing permutation + feature importance for 15 weather/environmental features. The bars are sorted + by importance with "Temperature" at the top (highest importance ~0.245) down to + "Time of Day" at the bottom (negative importance ~-0.008). A sequential color + gradient transitions from dark teal/blue (low importance) to yellow (high importance). + Each bar has horizontal error bars showing standard deviation. A dashed vertical + reference line at x=0 distinguishes positive from negative importance values. + The title reads "bar-permutation-importance · plotly · pyplots.ai" centered at + the top. X-axis is labeled "Mean Decrease in Model Score" and Y-axis is labeled + "Feature". The background is clean white with subtle gridlines. + criteria_checklist: + visual_quality: + score: 37 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title, axis labels, and tick labels are all clearly readable at full + resolution + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text; feature names are well-spaced on y-axis + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bars are appropriately sized, error bars visible and proportional + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Sequential blue-to-yellow gradient is colorblind-safe (viridis-like) + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Good use of canvas space, balanced margins, plot fills appropriate + area + - id: VQ-06 + name: Axis Labels + score: 1 + max: 2 + passed: true + comment: Descriptive labels but x-axis lacks units (could specify "score decrease" + units) + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: true + comment: Grid is subtle and appropriate; no legend needed for single-series + plot + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct horizontal bar chart for permutation importance + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Features on y-axis, importance values on x-axis as specified + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Has error bars, color gradient, vertical reference line at x=0, sorted + by importance + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: All data visible, axes show full range including negative values + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: N/A (single series, no legend needed) + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: Correctly uses `{spec-id} · {library} · pyplots.ai` format + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 7 + max: 8 + passed: true + comment: Shows positive AND negative importance values, varying error bar + sizes; could show more extreme negative values + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Weather/environmental ML model is a plausible, neutral scenario + - id: DQ-03 + name: Appropriate Scale + score: 4 + max: 5 + passed: true + comment: Values are realistic for permutation importance (0-0.25 range typical); + some features have nearly identical low values + code_quality: + score: 10 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Clean linear structure: imports → data → plot → save' + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Uses `np.random.seed(42)` + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: Only numpy, pandas, and plotly.graph_objects (all used) + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current Plotly API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as `plot.png` and `plot.html` + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: true + comment: Uses `go.Bar` with `error_x`, `add_vline`, custom hover template; + could leverage more Plotly-specific features like annotations or subplot + capabilities + verdict: APPROVED diff --git a/plots/bar-permutation-importance/metadata/plotnine.yaml b/plots/bar-permutation-importance/metadata/plotnine.yaml index 392012e0fb..148be40310 100644 --- a/plots/bar-permutation-importance/metadata/plotnine.yaml +++ b/plots/bar-permutation-importance/metadata/plotnine.yaml @@ -24,3 +24,175 @@ review: - Library features score is modest - could leverage more plotnine-specific features - Horizontal grid lines (panel_grid_major_y) show through bars which adds visual noise for a horizontal bar chart + image_description: The plot displays a horizontal bar chart showing permutation + feature importance for a customer churn prediction model. The title "bar-permutation-importance + · plotnine · pyplots.ai" appears at the top in bold. Features are listed on the + y-axis (Contract Length at top down to Multiple Lines at bottom), sorted by importance. + The x-axis shows "Mean Decrease in Model Score" ranging from 0.00 to approximately + 0.15. Bars are colored with a sequential gradient from yellow (low importance) + to blue (high importance). Each bar has horizontal error bars showing variability. + A vertical dashed gray reference line at x=0 distinguishes positive from negative + importance values. The legend on the right shows the "Importance" color scale. + The layout is clean with a minimal theme, subtle grid lines, and well-spaced elements. + criteria_checklist: + visual_quality: + score: 38 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title is bold at 24pt, axis labels at 20pt, tick labels at 16pt - + all perfectly readable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text, feature names fully visible + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bars are clearly visible, error bars appropriately sized + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Yellow-to-blue gradient is colorblind-safe, good contrast + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Good proportions, legend well-placed, plot fills canvas appropriately + - id: VQ-06 + name: Axis Labels + score: 1 + max: 2 + passed: true + comment: Descriptive labels ("Feature", "Mean Decrease in Model Score") but + no units + - id: VQ-07 + name: Grid & Legend + score: 1 + max: 2 + passed: true + comment: Grid subtle (alpha 0.3), but minor y-grid visible when not needed + for horizontal bars + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct horizontal bar chart + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Features on y-axis, importance on x-axis correctly mapped + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Has error bars, color gradient, reference line at x=0, sorted by + importance + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: All data visible including negative value for Multiple Lines + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Importance legend correctly labeled + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: 'Uses correct format: bar-permutation-importance · plotnine · pyplots.ai' + data_quality: + score: 19 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 7 + max: 8 + passed: true + comment: Shows 15 features with varying importance including one negative + value, good range but could show more variation in error bar sizes + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Customer churn prediction is a real, neutral ML scenario with plausible + feature names + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: Importance values 0-0.15 are realistic for permutation importance + code_quality: + score: 10 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: Follows imports → data → plot → save structure, no functions/classes + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Uses np.random.seed(42) + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: All imports used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current plotnine API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png + library_features: + score: 2 + max: 5 + items: + - id: LF-01 + name: Distinctive Features + score: 2 + max: 5 + passed: false + comment: Uses plotnine grammar (ggplot, geom_col, coord_flip, scale_fill_gradient, + theme_minimal) correctly but doesn't showcase advanced features like faceting + or statistical transformations + verdict: APPROVED diff --git a/plots/bar-permutation-importance/metadata/seaborn.yaml b/plots/bar-permutation-importance/metadata/seaborn.yaml index 038d46496a..a47936fe67 100644 --- a/plots/bar-permutation-importance/metadata/seaborn.yaml +++ b/plots/bar-permutation-importance/metadata/seaborn.yaml @@ -24,3 +24,160 @@ review: error bar capabilities in barplot - Grid uses dashed style which is slightly more visually distracting than solid with low alpha + image_description: 'The plot is a horizontal bar chart displaying permutation feature + importance for 13 wine dataset features. The chart uses a viridis color palette + ranging from bright yellow-green (highest importance: proline at ~0.05) to dark + teal/green (lower importance features). Features are sorted by importance with + "proline" at the top, followed by "color_intensity", "flavanoids", and "alcohol" + showing visible bars with importance values. The remaining 9 features (od280/od315_of_diluted_wines + through malic_acid) show effectively zero importance with no visible bars. Each + bar has horizontal error bars (black with caps) showing variability. There''s + a subtle vertical reference line at x=0 and dashed grid lines on the x-axis. The + title reads "bar-permutation-importance · seaborn · pyplots.ai" in large font. + Axis labels are clear: "Mean Importance (Decrease in Accuracy)" on x-axis and + "Feature" on y-axis.' + criteria_checklist: + visual_quality: + score: 36 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title 24pt, labels 20pt, ticks 16pt, all perfectly readable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text, all feature names fully visible + - id: VQ-03 + name: Element Visibility + score: 7 + max: 8 + passed: true + comment: Bars well-sized, error bars visible with good caps + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Viridis palette is colorblind-safe + - id: VQ-05 + name: Layout Balance + score: 4 + max: 5 + passed: true + comment: Good use of canvas, though lower features with zero importance create + visual imbalance + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: Descriptive labels with context ("Mean Importance (Decrease in Accuracy)") + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct horizontal bar chart for permutation importance + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Features on Y-axis, importance on X-axis correctly + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Has error bars, sorted by importance, color gradient, reference line + at x=0 + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: All data visible, axes show full range + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: No legend needed, color mapping is self-explanatory + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: 'Uses correct format: bar-permutation-importance · seaborn · pyplots.ai' + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 6 + max: 8 + passed: true + comment: Shows variation in importance but many features at zero creates less + interesting visual + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Wine dataset is a real, neutral, scikit-learn standard dataset + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: Importance values (0-0.06) are realistic for permutation importance + code_quality: + score: 10 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Linear structure: imports → data → model → plot → save' + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Uses np.random.seed(42) and random_state=42 + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: All imports are used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current seaborn API with hue parameter + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png + library_features: + score: 2 + max: 5 + items: [] + verdict: APPROVED diff --git a/plots/bar-sorted/metadata/altair.yaml b/plots/bar-sorted/metadata/altair.yaml index c16d166b26..f93fe8f007 100644 --- a/plots/bar-sorted/metadata/altair.yaml +++ b/plots/bar-sorted/metadata/altair.yaml @@ -22,3 +22,171 @@ review: weaknesses: - Grid styling (dashed lines) is slightly more prominent than ideal; solid lines with lower opacity might be cleaner + image_description: The plot shows a horizontal bar chart with 10 product categories + sorted by sales in descending order. The bars are colored in Python Blue (#306998). + The y-axis displays product names (Laptop, Smartphone, Tablet, Headphones, Smartwatch, + Camera, Keyboard, Monitor, Speaker, Mouse from top to bottom). The x-axis shows + "Sales (Units)" ranging from 0 to about 4,800. The title "bar-sorted · altair + · pyplots.ai" appears at the top center. A subtle dashed grid (light blue/gray) + is visible behind the bars. The bars have rounded right edges. The layout is clean + with good use of space. + criteria_checklist: + visual_quality: + score: 37 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title is large and clear (~28pt), axis labels are well-sized (~22pt), + tick labels readable (~18pt) + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: Horizontal orientation prevents label overlap, all text fully readable + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bars are appropriately sized, good spacing between categories + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Single color scheme (Python Blue), no colorblind issues + - id: VQ-05 + name: Layout Balance + score: 4 + max: 5 + passed: true + comment: 'Good proportions, plot fills canvas well, minor: slight asymmetry + in margins' + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: '"Sales (Units)" includes units, "Product" is descriptive' + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: true + comment: Grid is subtle with good opacity (0.3), but no legend needed for + single-series; however grid dashes could be less prominent + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct sorted bar chart + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Categories on Y, values on X correctly assigned + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Sorted descending, horizontal orientation for readability (as spec + recommends) + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: All data visible, axis starts at 0 + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: No legend needed for single series + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: 'Uses exact format: "bar-sorted · altair · pyplots.ai"' + data_quality: + score: 19 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 7 + max: 8 + passed: true + comment: 'Shows clear ranking with good value distribution, minor: could show + more variation in middle values' + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Product sales is a realistic business scenario, neutral topic + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: Sales values (720-4850 units) are plausible for product sales + code_quality: + score: 10 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: Simple imports → data → plot → save structure, no functions/classes + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Deterministic data (hardcoded values), no random elements + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: Only altair and pandas imported, both used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current Altair API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png and plot.html + library_features: + score: 5 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 5 + max: 5 + passed: true + comment: Declarative encoding with sort="-x", tooltip encoding, cornerRadiusEnd + styling, configure_axis/configure_view, HTML export for interactivity + verdict: APPROVED diff --git a/plots/bar-sorted/metadata/bokeh.yaml b/plots/bar-sorted/metadata/bokeh.yaml index 187439e20f..57d651379f 100644 --- a/plots/bar-sorted/metadata/bokeh.yaml +++ b/plots/bar-sorted/metadata/bokeh.yaml @@ -22,3 +22,175 @@ review: - No value labels on bars (spec mentions value labels can improve readability) - Does not leverage Bokeh interactive capabilities (hover tooltips would enhance the plot) + image_description: The plot displays a sorted bar chart with 10 vertical bars arranged + in descending order from left to right. The bars are colored in a muted blue (#306998 + - Python blue) with darker blue outlines. The title "bar-sorted · bokeh · pyplots.ai" + appears in the top-left corner. The x-axis is labeled "Product" with category + labels (Product A through Product J) rotated at a slight angle. The y-axis is + labeled "Sales (Units)" with values ranging from 0 to approximately 450. The bars + show a clear descending pattern from Product A (highest ~450) to Product J (lowest + ~85). The background is clean white with subtle dashed horizontal grid lines. + criteria_checklist: + visual_quality: + score: 36 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 9 + max: 10 + passed: true + comment: Title, axis labels, and tick labels are readable. Font sizes are + appropriate for the 4800x2700 canvas, though title could be slightly larger. + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text. X-axis labels are rotated to prevent overlap. + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bars are well-sized with good width (0.7), appropriate spacing, and + clear visibility. + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Single color scheme with good contrast. No colorblind issues with + monochromatic design. + - id: VQ-05 + name: Layout Balance + score: 4 + max: 5 + passed: true + comment: Good use of canvas space. Plot fills adequate area, though there's + slightly more whitespace on the right. + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: 'Both axes have descriptive labels with units: "Product" and "Sales + (Units)".' + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: true + comment: Subtle dashed grid lines with alpha 0.3, but no legend present (though + not strictly needed for single-color bars). + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct sorted bar chart implementation. + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Categories on X-axis, values on Y-axis, correctly mapped. + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Descending sort order, clear visual hierarchy, ranking visualization. + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: Y-axis starts at 0, all data visible. + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: No legend needed for single-series bar chart. + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: 'Correct format: "bar-sorted · bokeh · pyplots.ai".' + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 7 + max: 8 + passed: true + comment: Shows descending sort clearly with good value spread. Could benefit + from more varied gaps between values. + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Sales performance by product is a realistic, neutral business scenario. + - id: DQ-03 + name: Appropriate Scale + score: 4 + max: 5 + passed: true + comment: Values (85-450 units) are plausible for sales data, though specific + product context is generic. + code_quality: + score: 10 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: Clean imports → data → plot → save structure, no functions/classes. + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Uses np.random.seed(42), though data is actually hardcoded. + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: All imports are used (numpy, bokeh.io, bokeh.models, bokeh.plotting). + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current Bokeh API. + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as "plot.png". + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: true + comment: Uses ColumnDataSource properly, figure with categorical x_range, + vbar method, and Bokeh-specific styling. Could leverage more interactive + features or hover tools. + verdict: APPROVED diff --git a/plots/bar-sorted/metadata/highcharts.yaml b/plots/bar-sorted/metadata/highcharts.yaml index 614d90e969..9fe710f76c 100644 --- a/plots/bar-sorted/metadata/highcharts.yaml +++ b/plots/bar-sorted/metadata/highcharts.yaml @@ -25,3 +25,175 @@ review: making it harder to estimate intermediate values - Data labels show K suffix but the axis title says thousands USD - minor redundancy in unit notation + image_description: The plot shows a horizontal bar chart with 10 product categories + sorted by sales values in ascending order (smallest at top, largest at bottom). + The bars are displayed in a consistent blue color (#306998). At the top is the + title "bar-sorted · highcharts · pyplots.ai" in bold black text, with the subtitle + "Monthly Sales by Product Category" in gray below it. Category labels appear on + the left y-axis (Pet Supplies at top with 25K, down to Electronics at bottom with + 145K). Each bar has a data label showing the value with "K" suffix positioned + just to the right of the bar. The layout uses clean white background with no visible + gridlines on the x-axis (though the y-axis has dashed grid lines). The chart fills + the canvas well with good margins. + criteria_checklist: + visual_quality: + score: 36 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title at 48px, labels at 28px, axis text at 24-32px - all highly + readable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements, clean spacing + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bars well-sized with appropriate spacing + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Single blue color (#306998), colorblind-safe + - id: VQ-05 + name: Layout Balance + score: 3 + max: 5 + passed: true + comment: Good use of canvas, but y-axis (value axis) lacks visible tick labels/gridlines + at bottom + - id: VQ-06 + name: Axis Labels + score: 1 + max: 2 + passed: true + comment: Y-axis has "Sales (thousands USD)" with units, but not visible in + rendered output (no x-axis gridlines/ticks shown) + - id: VQ-07 + name: Grid & Legend + score: 1 + max: 2 + passed: true + comment: Grid is subtle dashed style, legend correctly disabled for single + series + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct sorted bar chart (horizontal) + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Categories on y-axis, values on x-axis correctly + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Sorted order, value labels on bars, horizontal orientation for readability + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: All data visible (25K to 145K) + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend appropriately disabled for single series + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: Uses correct format "bar-sorted · highcharts · pyplots.ai" + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 6 + max: 8 + passed: true + comment: Shows clear sorting and value variation, but all positive values + without dramatic differences + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Monthly sales by product category is a real, neutral business scenario + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: Values from 25K to 145K are realistic sales figures + code_quality: + score: 9 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Linear flow: imports → data → chart setup → export' + - id: CQ-02 + name: Reproducibility + score: 2 + max: 3 + passed: false + comment: Data is deterministic (hardcoded), but no random seed comment needed + since no randomness + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: All imports are used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current highcharts-core API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: true + comment: Uses Highcharts bar chart with dataLabels, borderRadius, subtitle, + proper options structure, but could leverage more interactive features like + tooltip customization + verdict: APPROVED diff --git a/plots/bar-sorted/metadata/letsplot.yaml b/plots/bar-sorted/metadata/letsplot.yaml index 791998013f..ad47f40913 100644 --- a/plots/bar-sorted/metadata/letsplot.yaml +++ b/plots/bar-sorted/metadata/letsplot.yaml @@ -30,3 +30,177 @@ review: HTML export - 'Grid styling: minor grid is blanked but could keep subtle major grid for value reference' + image_description: The plot displays a horizontal sorted bar chart showing monthly + revenue by product category. The bars are arranged in descending order from top + (Electronics at ~$425K) to bottom (Health at ~$62K). All bars use a consistent + blue color (#306998). The title "bar-sorted · lets-plot · pyplots.ai" appears + at the top in bold. The y-axis is labeled "Product Category" with 10 categories + listed, and the x-axis shows "Monthly Revenue" with currency formatting ($0.0K + to $400.0K+). The chart uses a minimal theme with subtle dashed horizontal grid + lines and clean white background. The layout is well-balanced with the plot utilizing + most of the canvas area. + criteria_checklist: + visual_quality: + score: 37 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title is large and bold (~26pt), axis titles at ~22pt, tick labels + at ~18pt - all perfectly readable at full resolution + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: Horizontal orientation prevents any label overlap, all category names + clearly visible + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bar widths (0.7) are well-proportioned for 10 categories, good spacing + between bars + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Single blue color scheme, no color differentiation needed, high contrast + against white + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Plot fills canvas well, balanced margins, good use of horizontal + space + - id: VQ-06 + name: Axis Labels + score: 1 + max: 2 + passed: true + comment: Y-axis label "Product Category" and X-axis "Monthly Revenue" are + descriptive but X-axis lacks explicit unit in label (though shown in tick + format) + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: true + comment: Grid is subtle with dashed lines and appropriate alpha, no legend + needed (single series) + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct sorted bar chart implementation + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Categories on Y-axis, values on X-axis (correct for horizontal bars) + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Sorted descending (largest at top), horizontal orientation for readability + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: All data visible, axis range appropriate ($0K-$425K+) + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: No legend needed for single-series chart + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: Correctly formatted as "bar-sorted · lets-plot · pyplots.ai" + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 7 + max: 8 + passed: true + comment: Shows clear descending sort with good value variation, but could + include more dramatic range differences + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Monthly revenue by product category is a realistic business scenario + - id: DQ-03 + name: Appropriate Scale + score: 4 + max: 5 + passed: true + comment: Revenue values in $62K-$425K range are plausible for monthly category + revenue + code_quality: + score: 9 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Clean linear flow: imports → data → sort → plot → save' + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Deterministic data (no random values) + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: All imports are used appropriately + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current lets-plot API + - id: CQ-05 + name: Output Correct + score: 0 + max: 0 + passed: true + comment: Saves as plot.png and plot.html + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: true + comment: Uses ggplot2 grammar (ggplot, geom_bar, coord_flip), theme_minimal, + scale_y_continuous with currency formatting, proper categorical ordering + verdict: APPROVED diff --git a/plots/bar-sorted/metadata/matplotlib.yaml b/plots/bar-sorted/metadata/matplotlib.yaml index 4b8ccf6b9e..8eb9506426 100644 --- a/plots/bar-sorted/metadata/matplotlib.yaml +++ b/plots/bar-sorted/metadata/matplotlib.yaml @@ -24,3 +24,170 @@ review: - Data scenario is somewhat generic (product categories with random values); could use a more specific real-world dataset - Does not demonstrate any advanced matplotlib features beyond basic bar chart functionality + image_description: The plot shows a horizontal bar chart with 8 product categories + sorted in descending order by sales revenue. The largest bar (Storage) is at the + top with $764K, followed by Furniture ($585K), Office Supplies ($420K), Printing + ($271K), Software ($256K), Electronics ($252K), Accessories ($221K), and Networking + ($170K) at the bottom. The bars are colored in a consistent blue shade (#306998). + Each bar has a value label positioned to its right. The title reads "bar-sorted + · matplotlib · pyplots.ai" at the top. The x-axis shows "Sales Revenue ($ thousands)" + and the y-axis shows "Product Category". A subtle dashed grid is visible on the + x-axis. The top and right spines are removed for a cleaner look. + criteria_checklist: + visual_quality: + score: 38 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title 24pt, labels 20pt, ticks 16pt - all perfectly readable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text, value labels positioned outside bars + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bars are well-sized and clearly visible + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Single color scheme, good contrast, colorblind-safe + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Plot fills canvas well, balanced margins, good use of space + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: 'Descriptive labels with units: "Sales Revenue ($ thousands)", "Product + Category"' + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: false + comment: Grid is subtle and appropriate (alpha 0.3), but no legend needed; + deducting for minor inconsistency in value label positioning + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct sorted bar chart + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Categories on Y-axis, values on X-axis, correctly sorted descending + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Sorted descending, horizontal orientation, value labels on bars + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: X-axis extends to show all values with labels + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: No legend needed for single-series data + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: 'Uses exact format: "bar-sorted · matplotlib · pyplots.ai"' + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 8 + max: 8 + passed: true + comment: Shows clear hierarchy from largest to smallest, good range of values + demonstrating sorting + - id: DQ-02 + name: Realistic Context + score: 5 + max: 7 + passed: true + comment: Sales by product category is plausible, though generic business scenario + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: Values in $150K-$800K range are realistic for business revenue + code_quality: + score: 10 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: Clean imports → data → plot → save structure, no functions/classes + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: np.random.seed(42) set + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: Only matplotlib.pyplot and numpy imported + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current matplotlib API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: true + comment: Good use of Axes methods (barh, text, spines), but no advanced matplotlib-specific + features like annotations with arrows or colorbar + verdict: APPROVED diff --git a/plots/bar-sorted/metadata/plotly.yaml b/plots/bar-sorted/metadata/plotly.yaml index 201c6d47dc..49ecf87710 100644 --- a/plots/bar-sorted/metadata/plotly.yaml +++ b/plots/bar-sorted/metadata/plotly.yaml @@ -23,3 +23,177 @@ review: weaknesses: - 'Minor: Grid lines could be slightly more subtle (current alpha 0.1 is good but gridwidth=1 makes them slightly prominent)' + image_description: The plot displays a horizontal sorted bar chart showing "Monthly + sales by product category" with 10 product categories arranged in descending order + from top to bottom. Electronics leads with 450 (thousands USD), followed by Clothing + (380), Home & Garden (320), Sports (280), Books (250), Toys (220), Beauty (195), + Food & Grocery (170), Automotive (140), and Office Supplies (95) at the bottom. + All bars are rendered in a consistent Python Blue (#306998) color with darker + border lines. Value labels appear outside each bar to the right. The title "bar-sorted + · plotly · pyplots.ai" is centered at the top. The x-axis shows "Sales (thousands + USD)" ranging from 0 to ~500, and the y-axis shows "Product Category". The background + uses Plotly's white template with subtle gridlines. + criteria_checklist: + visual_quality: + score: 37 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title at 32pt, axis labels at 24pt, tick labels at 18pt - all perfectly + readable at full resolution + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text; horizontal orientation prevents label collision + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bars are well-sized with good spacing (bargap=0.25), value labels + clearly visible + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Single color scheme with good contrast, no colorblind issues + - id: VQ-05 + name: Layout Balance + score: 4 + max: 5 + passed: true + comment: Good use of canvas with adequate margins; slight excess whitespace + on right side + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: '"Sales (thousands USD)" and "Product Category" are descriptive with + units' + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: false + comment: Grid is subtle and appropriate, but no legend needed for single-series + data (deducting 0 points - N/A for single series) + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct sorted bar chart type + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Categories on Y-axis, values on X-axis, correctly sorted descending + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Sorted descending, horizontal orientation (spec recommended for long + labels), value labels on bars + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: X-axis range [0, max*1.15] shows all data with room for labels + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: N/A for single series, no legend needed + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: Uses exact format "bar-sorted · plotly · pyplots.ai" + data_quality: + score: 20 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 8 + max: 8 + passed: true + comment: Shows clear ranking with varied values spanning wide range (95-450), + demonstrating the sorting concept well + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Monthly sales by product category is a plausible, neutral business + scenario + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: Values in thousands USD are realistic for retail sales data + code_quality: + score: 10 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Simple linear flow: imports → data → plot → save' + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Uses np.random.seed(42) for reproducibility + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: Only numpy and plotly.graph_objects, both used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current Plotly API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png and plot.html + library_features: + score: 5 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 5 + max: 5 + passed: true + comment: Uses go.Bar with proper configuration, plotly_white template, text + positioning, interactive HTML export, proper scaling (width=1600, height=900, + scale=3) + verdict: APPROVED diff --git a/plots/bar-sorted/metadata/plotnine.yaml b/plots/bar-sorted/metadata/plotnine.yaml index ed890cd025..688431095d 100644 --- a/plots/bar-sorted/metadata/plotnine.yaml +++ b/plots/bar-sorted/metadata/plotnine.yaml @@ -21,3 +21,172 @@ review: weaknesses: - Could highlight top category with different color as spec suggests - No random seed comment (data is deterministic but convention not followed) + image_description: 'The plot displays a sorted bar chart showing "Monthly sales + by product category" with 8 vertical bars arranged in descending order from left + to right. The bars use a consistent blue color (#306998). Categories from highest + to lowest: Electronics (4850), Furniture (3720), Clothing (3150), Food & Beverage + (2890), Home & Garden (2340), Sports (1980), Books (1450), and Toys (920). Each + bar has a value label above it. The title "bar-sorted · plotnine · pyplots.ai" + appears at the top. X-axis labels are rotated 30 degrees for readability. Y-axis + shows "Sales ($ thousands)" and X-axis shows "Product Category". Horizontal grid + lines are subtle. The overall layout is clean with good use of canvas space.' + criteria_checklist: + visual_quality: + score: 37 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title at 24pt, axis titles at 20pt, tick labels at 16pt, all perfectly + readable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: X-axis labels rotated to prevent overlap, value labels clear above + bars + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bar widths appropriate (0.7), good spacing between bars + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Single blue color, no colorblind issues + - id: VQ-05 + name: Layout Balance + score: 4 + max: 5 + passed: true + comment: Good canvas utilization, minor extra space at top + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: 'Descriptive with units: "Sales ($ thousands)", "Product Category"' + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: true + comment: No legend needed, but grid only on Y-axis which is good; however + grid alpha=0.3 is acceptable + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct sorted bar chart + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Categories on X, values on Y, correctly sorted descending + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Sorted bars, value labels on bars as spec suggests + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: All data visible, Y-axis starts at 0 + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: No legend needed for single series + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: 'Correct format: "bar-sorted · plotnine · pyplots.ai"' + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 6 + max: 8 + passed: true + comment: Shows descending sort clearly, good variation in values, but no highlight + of specific categories as spec mentioned + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Sales by product category is a real business scenario, neutral topic + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: Values in thousands are realistic for retail sales + code_quality: + score: 9 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: Simple imports → data → plot → save structure + - id: CQ-02 + name: Reproducibility + score: 2 + max: 3 + passed: false + comment: Deterministic data (no random), but no explicit seed comment + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: All imports are used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Current plotnine API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: true + comment: Uses ggplot grammar with geom_bar, geom_text, pd.Categorical for + ordering, theme customization. Good use of plotnine idioms but could use + scale_* functions for more distinctive styling + verdict: APPROVED diff --git a/plots/bar-sorted/metadata/pygal.yaml b/plots/bar-sorted/metadata/pygal.yaml index c0014b3ddf..3000259881 100644 --- a/plots/bar-sorted/metadata/pygal.yaml +++ b/plots/bar-sorted/metadata/pygal.yaml @@ -23,3 +23,181 @@ review: weaknesses: - Missing y-axis title to label the categories dimension - Data values could show more variation to better demonstrate sorting benefit + image_description: 'The plot displays a horizontal bar chart showing monthly sales + by product category, sorted in descending order from top to bottom. The title + "bar-sorted · pygal · pyplots.ai" appears at the top. Eight categories are shown: + Electronics ($4,850) at the top, followed by Clothing ($3,720), Home & Garden + ($2,980), Sports ($2,450), Books ($1,890), Toys ($1,560), Beauty ($1,240), and + Food ($980) at the bottom. All bars are rendered in Python Blue (#306998). The + x-axis is labeled "Sales (USD)" with tick marks at $0, $1,000, $2,000, $3,000, + and $4,000. Value labels are displayed centered within each bar with dollar formatting. + Subtle vertical grid lines help with value reading. The layout is clean with good + use of whitespace.' + criteria_checklist: + visual_quality: + score: 36 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 9 + max: 10 + passed: true + comment: Title, category labels, and value labels are all clearly readable. + Font sizes are well-scaled for the 4800x2700 canvas. + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text anywhere. Category labels on left, values centered + in bars, all cleanly separated. + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bars are well-sized with good spacing between them. The visual hierarchy + is clear. + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Single color scheme (Python Blue) is colorblind-safe. Good contrast + against white background. + - id: VQ-05 + name: Layout Balance + score: 4 + max: 5 + passed: true + comment: Good layout overall, but slight margin asymmetry with more empty + space on the right. + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: X-axis labeled "Sales (USD)" with units clearly indicated. + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: false + comment: Grid lines are visible and subtle, but no y-axis title labeling the + categories dimension. + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct horizontal bar chart type, appropriate for sorted data with + category labels. + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Categories correctly on Y-axis, values on X-axis. + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Sorted descending (largest first), horizontal orientation for readability, + value labels on bars. + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: Axes show all data appropriately, from $0 to beyond $4,850. + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend disabled appropriately since categories are labeled on Y-axis. + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: 'Uses correct format: "bar-sorted · pygal · pyplots.ai"' + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 7 + max: 8 + passed: true + comment: Shows clear ranking with varied values demonstrating the sorting + concept well. Could show more extreme value differences. + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Monthly sales by product category is a plausible, neutral business + scenario. + - id: DQ-03 + name: Appropriate Scale + score: 4 + max: 5 + passed: true + comment: Values are realistic for monthly sales, though all values being in + similar thousands range is slightly uniform. + code_quality: + score: 9 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Simple script: imports → data → style → chart → save. No functions + or classes.' + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Deterministic data (hardcoded values), no random generation needed. + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: Only pygal and Style imported, both used. + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current pygal API. + - id: CQ-05 + name: Output Correct + score: 0 + max: 1 + passed: false + comment: Saves to both plot.png and plot.html correctly. + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: true + comment: Uses HorizontalBar, custom Style, print_values with value_formatter, + truncate_label. Good use of pygal-specific features but could leverage more + interactive SVG capabilities. + verdict: APPROVED diff --git a/plots/bar-sorted/metadata/seaborn.yaml b/plots/bar-sorted/metadata/seaborn.yaml index db634c1f7e..8d1c0f8f4a 100644 --- a/plots/bar-sorted/metadata/seaborn.yaml +++ b/plots/bar-sorted/metadata/seaborn.yaml @@ -24,3 +24,169 @@ review: - Uses monochromatic palette instead of seaborn built-in color palettes like colorblind or Blues which could add visual interest - Grid uses dashed linestyle which is slightly more prominent than recommended + image_description: The plot shows a horizontal bar chart displaying 10 product categories + sorted by sales in descending order. Electronics leads at $450k, followed by Clothing + ($380k), Home & Garden ($320k), Sports ($275k), Books ($240k), Toys ($210k), Beauty + ($185k), Automotive ($150k), Food & Grocery ($120k), and Pet Supplies ($95k). + All bars are a consistent steel blue color (#306998). The title "bar-sorted · + seaborn · pyplots.ai" appears at the top. The y-axis shows "Product Category" + and x-axis shows "Sales (thousands $)". Value labels are positioned at the end + of each bar. A subtle dashed grid appears on the x-axis with alpha=0.3. The layout + is clean with good proportions - the plot fills the canvas well. + criteria_checklist: + visual_quality: + score: 38 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title at 24pt, labels at 20pt, ticks at 16pt - all perfectly readable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text; horizontal orientation prevents label collision + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bars are well-sized, clear visual hierarchy + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Single color scheme, no color distinction issues + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Plot fills canvas appropriately, balanced margins + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: 'Descriptive labels with units: "Sales (thousands $)"' + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: false + comment: Grid alpha 0.3 is good, but no legend needed; however, grid lines + could be slightly more subtle + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct sorted bar chart type + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Categories on Y-axis, values on X-axis correctly + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Sorted descending, horizontal orientation, value labels present + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: X-axis extended to 115% to fit value labels + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: No legend needed for single-series data + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: 'Correct format: "bar-sorted · seaborn · pyplots.ai"' + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 6 + max: 8 + passed: true + comment: Shows sorted bars with clear ranking; could demonstrate more variation + in values to highlight the sorting benefit + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Realistic product sales scenario, neutral business context + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: Values from $95k to $450k are realistic for business sales + code_quality: + score: 10 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Clean linear flow: imports → data → plot → save' + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: np.random.seed(42) set + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: Only necessary imports used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses modern seaborn API with hue parameter + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png + library_features: + score: 2 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 2 + max: 5 + passed: false + comment: Uses sns.barplot correctly with hue parameter for API compatibility, + but doesn't leverage seaborn's statistical features or built-in palettes + verdict: APPROVED diff --git a/plots/bar-stacked-percent/metadata/altair.yaml b/plots/bar-stacked-percent/metadata/altair.yaml index ab23f3758b..63d3d5ade9 100644 --- a/plots/bar-stacked-percent/metadata/altair.yaml +++ b/plots/bar-stacked-percent/metadata/altair.yaml @@ -24,3 +24,169 @@ review: weaknesses: - Y-axis label "Share of Energy Mix" could include explicit unit notation like "(%)" even though format shows percentages + image_description: 'The plot displays a 100% stacked bar chart showing energy mix + composition by country (Brazil, China, Germany, India, USA). Each bar is normalized + to 100% and divided into four colored segments: Fossil Fuels (dark blue #306998), + Nuclear (yellow #FFD43B), Renewables (green #2ca02c), and Hydro (cyan #17becf). + The x-axis shows country names with horizontal labels, the y-axis shows percentage + from 0% to 100% labeled "Share of Energy Mix". The title "bar-stacked-percent + · altair · pyplots.ai" appears at the top center. A legend on the right identifies + each energy source. White strokes separate bar segments. Brazil notably shows + ~70% hydro (cyan), while India shows ~72% fossil fuels (blue). Germany shows the + highest renewables share (~38%).' + criteria_checklist: + visual_quality: + score: 38 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: all text perfectly readable, title 28pt, axis labels 18-22pt + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: no overlapping text, horizontal x-axis labels well-spaced + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: bar segments clearly visible with white stroke separation + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: 'colorblind-safe palette: blue, yellow, green, cyan' + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: excellent canvas utilization, balanced margins + - id: VQ-06 + name: Axis Labels + score: 1 + max: 2 + passed: true + comment: descriptive labels but y-axis could include explicit units + - id: VQ-07 + name: Grid & Legend + score: 1 + max: 2 + passed: true + comment: subtle grid (alpha 0.3), legend well placed + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: correct 100% stacked bar chart with stack="normalize" + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: category on x-axis, components as stacked segments + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: distinct colors, clear legend, consistent ordering, tooltips + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: y-axis shows full 0-100% range + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: legend clearly identifies all four energy sources + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: 'uses exact format: bar-stacked-percent · altair · pyplots.ai' + data_quality: + score: 20 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 8 + max: 8 + passed: true + comment: shows varied proportions across countries demonstrating different + energy profiles + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: real-world energy mix scenario from spec examples + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: realistic energy mix percentages for each country + code_quality: + score: 10 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: imports → data → chart → save + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: deterministic hardcoded data + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: only altair and pandas + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: current Altair API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: saves as plot.png and plot.html + library_features: + score: 5 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 5 + max: 5 + passed: true + comment: declarative encoding types, stack="normalize", alt.Order(), tooltips, + alt.Scale(), configure methods + verdict: APPROVED diff --git a/plots/bar-stacked-percent/metadata/bokeh.yaml b/plots/bar-stacked-percent/metadata/bokeh.yaml index 66937bfd33..e64a5a46cb 100644 --- a/plots/bar-stacked-percent/metadata/bokeh.yaml +++ b/plots/bar-stacked-percent/metadata/bokeh.yaml @@ -22,3 +22,161 @@ review: - Dual output (PNG + HTML) leveraging Bokeh interactive capabilities weaknesses: - Blue and cyan colors could be slightly more distinct for better colorblind accessibility + image_description: 'The plot displays a 100% stacked bar chart showing smartphone + market share by quarter (Q1 2024 through Q1 2025). Five vertical bars represent + each quarter, with four colored segments stacked to 100%: Apple (Python blue #306998) + at the bottom, Samsung (golden yellow #FFD43B), Xiaomi (cyan #4ECDC4), and Others + (gray #95A5A6) at the top. Each segment displays its percentage value (e.g., 28%, + 23%, 14%, 35% for Q1 2024). The title "bar-stacked-percent · bokeh · pyplots.ai" + appears at top-left, with a legend in the top-right corner. X-axis shows "Quarter" + and Y-axis shows "Market Share (%)". White borders separate segments. The layout + fills the canvas well with balanced proportions.' + criteria_checklist: + visual_quality: + score: 38 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: all text perfectly readable at 36pt title, 28pt labels, 22pt ticks, + 24pt segment labels + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: no overlapping text anywhere + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: bars and segments perfectly sized + - id: VQ-04 + name: Color Accessibility + score: 4 + max: 5 + passed: true + comment: distinguishable colors, minor concern with blue/cyan proximity + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: excellent canvas utilization + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: descriptive with context ("Quarter", "Market Share (%)") + - id: VQ-07 + name: Grid & Legend + score: 1 + max: 2 + passed: true + comment: subtle dashed grid, legend well-placed but could be outside plot + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: correct 100% stacked bar chart + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: categories on X, percentages on Y + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: percentage labels, consistent ordering, clear legend + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: Y-axis 0-100%, all data visible + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: labels match data series + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: uses correct "{spec-id} · {library} · pyplots.ai" format + data_quality: + score: 20 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 8 + max: 8 + passed: true + comment: shows variation across time, different proportions per quarter + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: smartphone market share is realistic and comprehensible + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: realistic market share percentages + code_quality: + score: 10 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: clean imports → data → plot → save flow + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: deterministic hardcoded data + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: all imports used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: modern Bokeh API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: saves plot.png and plot.html + library_features: + score: 5 + max: 5 + items: [] + verdict: APPROVED diff --git a/plots/bar-stacked-percent/metadata/highcharts.yaml b/plots/bar-stacked-percent/metadata/highcharts.yaml index 44941c4843..5d0293d7c8 100644 --- a/plots/bar-stacked-percent/metadata/highcharts.yaml +++ b/plots/bar-stacked-percent/metadata/highcharts.yaml @@ -23,3 +23,179 @@ review: - Y-axis has too many tick marks (every 2%) creating visual clutter; consider using 10% or 20% intervals - Grid could be more subtle with wider spacing for cleaner appearance + image_description: 'The plot displays a 100% stacked column chart showing market + share distribution across 5 quarters (Q1 2024 through Q1 2025) for 5 companies. + Each bar reaches 100% and is divided into colored segments: TechCorp (blue) at + the top showing declining share from 35% to 26%, DataFlow (yellow) growing from + 25% to 32%, CloudPeak (purple) steadily increasing from 20% to 25%, NetBase (cyan) + declining slightly from 12% to 10%, and Others (brown) stable at 7-8%. The title + "bar-stacked-percent · highcharts · pyplots.ai" appears at the top with a subtitle + "Market Share by Quarter". The y-axis shows percentage values from 0% to 100%, + and the x-axis shows quarters. A horizontal legend at the bottom identifies all + five companies. Each segment displays its percentage value as a white label.' + criteria_checklist: + visual_quality: + score: 37 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title, subtitle, axis labels, tick marks, and data labels are all + clearly readable at full resolution + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements; data labels fit within their segments + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bar segments are well-sized and clearly visible; stacked proportions + easy to distinguish + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Uses colorblind-safe palette (blue, yellow, purple, cyan, brown) + - no red-green conflicts + - id: VQ-05 + name: Layout Balance + score: 4 + max: 5 + passed: true + comment: Good use of canvas space; slight deduction for dense y-axis tick + labels (every 2%) + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: Y-axis has "Market Share (%)" with units, X-axis has "Quarter" + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: false + comment: Grid lines visible but y-axis has excessive tick marks (every 2% + creates visual clutter) + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct 100% stacked column chart + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Categories on X-axis, percentage composition on Y-axis + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Percentage labels within segments, clear legend, consistent component + ordering + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: All data visible, 0-100% range appropriate + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend correctly identifies all five companies + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: Correctly uses "bar-stacked-percent · highcharts · pyplots.ai" + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 7 + max: 8 + passed: true + comment: Shows proportion changes over time, multiple components, varying + segment sizes; slight deduction as all segments are similar size (no very + small or dominant segments to test edge cases) + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Market share analysis is a real-world scenario matching spec's application + examples + - id: DQ-03 + name: Appropriate Scale + score: 4 + max: 5 + passed: true + comment: Values sum to 100% per category as expected; percentages are realistic + for market share + code_quality: + score: 9 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Linear flow: imports → data → chart config → export' + - id: CQ-02 + name: Reproducibility + score: 2 + max: 3 + passed: false + comment: Data is hardcoded (deterministic) but no explicit seed comment; minor + deduction + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: All imports are used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current highcharts-core API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png and plot.html + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: true + comment: Uses Highcharts stacking:percent, tooltips, and data labels; could + leverage more interactive features but solid implementation + verdict: APPROVED diff --git a/plots/bar-stacked-percent/metadata/letsplot.yaml b/plots/bar-stacked-percent/metadata/letsplot.yaml index 7a2d3f3279..847a9fec26 100644 --- a/plots/bar-stacked-percent/metadata/letsplot.yaml +++ b/plots/bar-stacked-percent/metadata/letsplot.yaml @@ -23,3 +23,177 @@ review: weaknesses: - Grid lines could be more subtle (current default may be slightly prominent) - Could add percentage labels inside segments for larger portions to enhance readability + image_description: 'The plot displays a 100% stacked bar chart showing the energy + source mix across six European countries (Germany, France, UK, Spain, Italy, Poland). + Each bar reaches 100% and is divided into five colored segments representing different + energy sources: Coal (dark gray), Natural Gas (blue), Nuclear (purple), Renewables + (green), and Other (light gray). The y-axis shows "Share of Energy Mix" with percentage + labels from 0% to 100%. The x-axis shows "Country" with the six country names. + A legend on the right side clearly identifies each energy source. The title reads + "bar-stacked-percent · letsplot · pyplots.ai" in bold at the top. The chart uses + a minimal theme with subtle horizontal grid lines.' + criteria_checklist: + visual_quality: + score: 37 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title is large and bold (~28pt), axis labels are ~22pt, tick labels + ~18pt - all perfectly readable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements, country names well-spaced + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bar segments are clearly visible with good width (0.75) and alpha + (0.9) + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Colorblind-safe palette with distinct colors (gray, blue, purple, + green, light gray) + - id: VQ-05 + name: Layout Balance + score: 4 + max: 5 + passed: true + comment: Good layout but slight extra whitespace on left margin + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: Descriptive labels "Country" and "Share of Energy Mix" + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: false + comment: Horizontal grid lines visible but y-axis percentages formatted correctly; + however vertical grid removed appropriately + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct 100% stacked bar chart using position="fill" + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Categories (countries) on x-axis, components (energy sources) as + stacked segments + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: 'All features present: normalized bars, clear legend, consistent + component ordering' + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: Y-axis shows 0-100% range correctly + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend correctly identifies all five energy sources + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: 'Correct format: "bar-stacked-percent · letsplot · pyplots.ai"' + data_quality: + score: 20 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 8 + max: 8 + passed: true + comment: 'Shows excellent variation: France heavy nuclear, Poland heavy coal, + Spain/Germany high renewables' + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Real-world scenario with plausible European energy mix data + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: Percentages are realistic and reflect actual energy distribution + patterns + code_quality: + score: 7 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Simple linear script: imports → data → plot → save' + - id: CQ-02 + name: Reproducibility + score: 0 + max: 3 + passed: false + comment: No random seed needed (deterministic data), but data is hardcoded + which is fine + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: All imports are used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current lets-plot API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png and plot.html + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: true + comment: Uses ggplot grammar with position="fill", scale_y_continuous with + format, theme_minimal, but could leverage more lets-plot specific interactivity + features + verdict: APPROVED diff --git a/plots/bar-stacked-percent/metadata/matplotlib.yaml b/plots/bar-stacked-percent/metadata/matplotlib.yaml index 61d7cb5537..e9e825cc06 100644 --- a/plots/bar-stacked-percent/metadata/matplotlib.yaml +++ b/plots/bar-stacked-percent/metadata/matplotlib.yaml @@ -23,3 +23,179 @@ review: - No distinctive matplotlib features used (hatching, custom annotations, or advanced styling could enhance) - Legend frame adds slight visual weight that could be removed for cleaner look + image_description: 'The plot displays a 100% stacked bar chart showing the European + energy mix for 6 countries (Germany, France, UK, Spain, Italy, Poland). Each bar + is divided into 5 colored segments representing energy sources: Renewables (Python + blue #306998), Nuclear (golden yellow #FFD43B), Natural Gas (green #50C878), Coal + (crimson red #DC143C), and Other (purple #9370DB). Percentage labels appear within + segments that are ≥8%, using white text on dark backgrounds and black text on + light backgrounds. The title reads "European Energy Mix · bar-stacked-percent + · matplotlib · pyplots.ai" at the top. The legend is positioned outside the plot + area to the upper right. A subtle horizontal grid at y=0, 25, 50, 75, 100 aids + reading. The country names appear below each bar on the x-axis, with "Country" + as the axis label and "Percentage (%)" on the y-axis.' + criteria_checklist: + visual_quality: + score: 37 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title at 24pt, axis labels at 20pt, tick labels at 16pt, percentage + labels at 14pt bold - all clearly readable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text, percentage labels only shown when segment ≥8% + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bar segments are well-sized with white edge separators, clearly visible + - id: VQ-04 + name: Color Accessibility + score: 4 + max: 5 + passed: true + comment: Good palette avoiding pure red-green conflict, though red/green segments + adjacent could be slightly improved + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Plot fills canvas well, legend outside doesn't waste space, good + proportions + - id: VQ-06 + name: Axis Labels + score: 1 + max: 2 + passed: true + comment: '"Country" and "Percentage (%)" are descriptive; "Percentage (%)" + has unit but "Country" is generic' + - id: VQ-07 + name: Grid & Legend + score: 1 + max: 2 + passed: true + comment: Grid subtle at alpha=0.3, legend well-placed but frameon=True adds + visual weight + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct 100% stacked bar chart + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Categories on x-axis, components as stacked segments, values normalized + to 100% + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Percentage labels in segments, distinct colors, clear legend, consistent + component order + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: All bars show 0-100%, all data visible + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend correctly identifies all 5 energy sources + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: Uses "{context} · {spec-id} · {library} · pyplots.ai" format correctly + data_quality: + score: 20 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 8 + max: 8 + passed: true + comment: 'Shows diverse proportions: France dominated by Nuclear (66%), Poland + by Coal (68%), Germany more balanced mix, Italy with zero Nuclear - demonstrates + the visualization''s ability to show both dominated and mixed compositions' + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: European energy mix is a real, comprehensible scenario with plausible + country-specific patterns (France nuclear-heavy, Poland coal-dependent) + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: TWh values are realistic for European electricity generation + code_quality: + score: 10 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: Simple imports → data → plot → save structure, no functions/classes + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Deterministic data (hardcoded numpy array), no random elements + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: Only matplotlib.pyplot and numpy, both used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current matplotlib API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as 'plot.png' + library_features: + score: 0 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 0 + max: 5 + passed: false + comment: Standard matplotlib bar stacking, no distinctive features like custom + annotations, hatching, or advanced styling + verdict: APPROVED diff --git a/plots/bar-stacked-percent/metadata/plotly.yaml b/plots/bar-stacked-percent/metadata/plotly.yaml index b8a6077b17..8c941eacd0 100644 --- a/plots/bar-stacked-percent/metadata/plotly.yaml +++ b/plots/bar-stacked-percent/metadata/plotly.yaml @@ -21,3 +21,178 @@ review: - Colorblind-safe palette with Python blue (#306998) as primary color weaknesses: - Missing subtle gridlines on y-axis would help readers estimate exact percentages + image_description: 'The plot displays a 100% stacked bar chart showing the energy + mix across six European countries (Germany, France, UK, Spain, Italy, Poland). + Each bar is divided into five colored segments representing different energy sources: + Renewables (dark blue #306998), Nuclear (yellow #FFD43B), Natural Gas (teal #45B39D), + Coal (coral/red #E74C3C), and Other (purple #9B59B6). All bars are normalized + to 100% with percentage labels displayed inside each segment in white text. The + title "bar-stacked-percent · plotly · pyplots.ai" is centered at the top. A horizontal + legend sits below the title identifying all five energy components. The y-axis + is labeled "Energy Share (%)" ranging from 0-100%, and the x-axis is labeled "Country". + The chart uses a clean plotly_white template with balanced margins.' + criteria_checklist: + visual_quality: + score: 38 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title at 32pt, axis labels at 24pt, tick fonts at 20pt, percentage + labels at 16pt - all clearly readable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements, all labels fit within segments + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bar segments are well-sized and clearly visible, percentage labels + readable + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Uses colorblind-safe palette with good contrast between adjacent + segments + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Chart fills canvas well, balanced margins, legend positioned appropriately + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: Y-axis has "Energy Share (%)" with units, X-axis has "Country" + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: false + comment: No grid visible (while clean, subtle gridlines would help read percentages) + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct 100% stacked bar chart + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Categories on X-axis, components as stacked segments, values normalized + correctly + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Has percentage labels, clear legend, distinct colors, consistent + component ordering + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: Y-axis shows 0-100% range, all data visible + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend correctly identifies all five energy components + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: Uses correct format "bar-stacked-percent · plotly · pyplots.ai" + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 8 + max: 8 + passed: true + comment: 'Shows varied distributions: France dominated by nuclear, Poland + by coal, others by renewables/gas mix - excellent diversity' + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Energy mix by European country is a real, comprehensible scenario + with plausible proportions + - id: DQ-03 + name: Appropriate Scale + score: 3 + max: 5 + passed: false + comment: Values are generally plausible but some minor inaccuracies (e.g., + France nuclear at 63% vs actual ~70%, Poland coal at ~61% vs actual ~70%) + code_quality: + score: 8 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: Clean imports → data → plot → save structure, no functions/classes + - id: CQ-02 + name: Reproducibility + score: 0 + max: 3 + passed: false + comment: No random seed needed as data is deterministic, but data is hardcoded + (acceptable for this use case) - deducting as there's no seed even though + randomization isn't used + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: Only pandas and plotly.graph_objects imported, both used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current Plotly API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png and plot.html + library_features: + score: 5 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 5 + max: 5 + passed: true + comment: Uses go.Figure with go.Bar traces, proper barmode="stack", text positioning, + plotly_white template, horizontal legend, and HTML export for interactivity + verdict: APPROVED diff --git a/plots/bar-stacked-percent/metadata/plotnine.yaml b/plots/bar-stacked-percent/metadata/plotnine.yaml index 8ef7db8e22..2010c31ce3 100644 --- a/plots/bar-stacked-percent/metadata/plotnine.yaml +++ b/plots/bar-stacked-percent/metadata/plotnine.yaml @@ -22,3 +22,178 @@ review: weaknesses: - Y-axis scale shows 0.00-1.00 (proportions) while label says Market Share (%) - minor inconsistency but not misleading since percentages are labeled in bars + image_description: 'The plot displays a 100% stacked bar chart showing smartphone + market share by quarter from Q1 2023 to Q2 2024. Six vertical bars represent each + quarter, with each bar normalized to 100% (shown as 0.00-1.00 on y-axis). Four + segments per bar represent: Apple (Python Blue), Samsung (Python Yellow), Xiaomi + (Green), and Others (Gray). Each segment displays a percentage label in white + bold text (e.g., 23%, 22%, 12%, 43% for Q1 2023). The y-axis is labeled "Market + Share (%)", x-axis shows "Quarter" with clear quarterly labels. A legend on the + right identifies all four companies. The title correctly follows the format "bar-stacked-percent + · plotnine · pyplots.ai".' + criteria_checklist: + visual_quality: + score: 37 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title is large and bold (24pt), axis labels (20pt), tick labels (16pt) + all clearly readable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text, all labels clearly separated + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bar segments well-sized with appropriate width (0.7), percentage + labels visible + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: 'Colors are distinguishable: blue, yellow, green, gray - good contrast + and colorblind-safe' + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Good proportions, plot fills canvas well, legend well-positioned + on right + - id: VQ-06 + name: Axis Labels + score: 1 + max: 2 + passed: false + comment: Y-axis says "Market Share (%)" but shows 0.00-1.00 (proportions, + not actual percentages) + - id: VQ-07 + name: Grid & Legend + score: 2 + max: 2 + passed: true + comment: Vertical grid removed, horizontal grid subtle, legend clear and well-placed + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct 100% stacked bar chart + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: X=quarters (categorical), Y=share values normalized, fill=company + segments + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: 'All spec features present: distinct colors, percentage labels, legend, + consistent component ordering' + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: All data visible, bars span 0-100% + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend labels match data correctly + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: Uses exact format `bar-stacked-percent · plotnine · pyplots.ai` + data_quality: + score: 19 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 8 + max: 8 + passed: true + comment: Shows proportional variation across quarters (Xiaomi growing, Samsung + declining slightly), demonstrates the comparison use case well + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Smartphone market share is a real, comprehensible scenario with plausible + company names + - id: DQ-03 + name: Appropriate Scale + score: 4 + max: 5 + passed: false + comment: Values are realistic market shares, but "Others" consistently ~43-46% + feels slightly high for a real market analysis + code_quality: + score: 10 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Clean linear flow: imports → data → plot → save, no functions/classes' + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Uses deterministic hardcoded data (no random generation needed) + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: All imports are used, well-organized from plotnine + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current plotnine API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as `plot.png` + library_features: + score: 5 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 5 + max: 5 + passed: true + comment: 'Excellent use of plotnine''s grammar of graphics: `ggplot()` + `geom_bar()` + with `position_fill()`, `geom_text()` with position matching, `scale_fill_manual()`, + and comprehensive `theme()` customization' + verdict: APPROVED diff --git a/plots/bar-stacked-percent/metadata/pygal.yaml b/plots/bar-stacked-percent/metadata/pygal.yaml index 493c845eaa..22795ccba8 100644 --- a/plots/bar-stacked-percent/metadata/pygal.yaml +++ b/plots/bar-stacked-percent/metadata/pygal.yaml @@ -26,3 +26,182 @@ review: would better demonstrate the chart type - Font sizes in the library rules suggest smaller values (title_font_size=28) but implementation uses much larger (60) - while readable, it deviates from guidelines + image_description: 'The plot displays a 100% stacked bar chart showing energy mix + by country. Six countries are shown on the x-axis (USA, Germany, China, Brazil, + Japan, India). Each bar is divided into three colored segments: blue (Fossil Fuels), + yellow (Nuclear), and green (Renewable). All bars reach 100% height, with percentage + labels displayed within each segment. The title "bar-stacked-percent · pygal · + pyplots.ai" appears at the top. The y-axis shows "Percentage (%)" from 0% to 100%, + and the x-axis shows "Country". A legend at the bottom identifies the three energy + sources. The chart clearly shows varying energy compositions - Brazil has the + highest renewable share (81%), while Japan has the highest fossil fuel dependency + (88%).' + criteria_checklist: + visual_quality: + score: 36 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 9 + max: 10 + passed: true + comment: Title, axis labels, and percentage values are clearly readable. Font + sizes are well-scaled for the canvas. + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements; all labels and values are distinct + and readable. + - id: VQ-03 + name: Element Visibility + score: 7 + max: 8 + passed: true + comment: Bars are well-sized and clearly visible. Segment proportions are + easy to distinguish. + - id: VQ-04 + name: Color Accessibility + score: 4 + max: 5 + passed: true + comment: Blue, yellow, and green provide good contrast. Not pure red-green, + but yellow-green distinction could be slightly better. + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Excellent use of canvas space; plot fills appropriate area with balanced + margins. + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: Y-axis has "Percentage (%)" with units, X-axis has "Country" - both + descriptive. + - id: VQ-07 + name: Grid & Legend + score: 1 + max: 2 + passed: true + comment: Legend at bottom is clear and well-placed. Y-axis guides visible + but no subtle grid styling. + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct 100% stacked bar chart implementation. + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Categories on X-axis, components as stacked segments, values normalized + to percentages. + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: 'All features present: percentage labels within segments, clear legend, + consistent component ordering.' + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: Y-axis correctly shows 0-100% range, all data visible. + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend correctly identifies Fossil Fuels, Nuclear, and Renewable. + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: 'Title follows exact format: "bar-stacked-percent · pygal · pyplots.ai"' + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 7 + max: 8 + passed: true + comment: Shows variety in proportions across countries. Brazil's high renewable + vs Japan's high fossil creates good contrast. Nuclear segment is consistently + small, could show more variation. + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Energy mix by country is a perfect real-world application. Values + are plausible and match general knowledge of energy profiles. + - id: DQ-03 + name: Appropriate Scale + score: 4 + max: 5 + passed: true + comment: 'Values are realistic. Minor: percentages already sum to 100 in raw + data, so normalization is redundant (though code handles it correctly).' + code_quality: + score: 9 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Clean linear structure: imports → data → style → chart → save.' + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Deterministic data (no random generation needed). + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: Only pygal and Style imported, both used. + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current pygal API. + - id: CQ-05 + name: Output Correct + score: 0 + max: 1 + passed: false + comment: Saves to "plot.png" but also "plot.html" (extra file, though acceptable + for pygal). + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: true + comment: Uses pygal's StackedBar, custom Style, value_formatter, print_values. + Could leverage more pygal-specific features like tooltips or interpolation. + verdict: APPROVED diff --git a/plots/bar-stacked-percent/metadata/seaborn.yaml b/plots/bar-stacked-percent/metadata/seaborn.yaml index 985d7beede..8ce40cb741 100644 --- a/plots/bar-stacked-percent/metadata/seaborn.yaml +++ b/plots/bar-stacked-percent/metadata/seaborn.yaml @@ -24,3 +24,171 @@ review: used for sns.despine() styling - should leverage seaborn native bar plotting functions more - Legend placement outside the plot creates additional whitespace on the right side + image_description: |- + The plot shows a 100% stacked bar chart displaying market share data across 6 quarters (Q1 2023 to Q2 2024) for 4 companies. Each bar reaches exactly 100% and is divided into 4 colored segments: + - **Company A** (dark blue, #306998) - at the bottom, declining from 35% to 24% + - **Company B** (yellow, #FFD43B) - second from bottom, growing from 25% to 34% + - **Company C** (teal, #4ECDC4) - third segment, growing slightly from 22% to 27% + - **Company D** (coral/salmon, #E76F51) - top segment, declining from 18% to 15% + + The title reads "bar-stacked-percent · seaborn · pyplots.ai" at the top. X-axis shows "Quarter" with 6 quarter labels, Y-axis shows "Market Share (%)" from 0-100. Percentage labels are displayed inside each segment (white text on dark colors, dark text on yellow). The legend is positioned outside the plot on the upper right. A subtle horizontal grid is visible. The layout is clean and professional. + criteria_checklist: + visual_quality: + score: 36 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title at 24pt, labels at 20pt, ticks at 16pt, all perfectly readable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text, percentage labels fit within segments + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bar segments clearly visible with good proportions + - id: VQ-04 + name: Color Accessibility + score: 4 + max: 5 + passed: true + comment: Good colorblind-safe palette (blue, yellow, teal, coral), though + could use a more established colorblind palette + - id: VQ-05 + name: Layout Balance + score: 4 + max: 5 + passed: true + comment: Good layout but legend takes extra space on right side + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: 'Descriptive labels with units: "Market Share (%)", "Quarter"' + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: false + comment: Legend placement outside plot causes extra whitespace; grid is appropriately + subtle + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct 100% stacked bar chart + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Categories (quarters) on X, components (companies) stacked + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: 'All spec features present: percentage labels, clear legend, consistent + ordering' + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: Y-axis shows 0-100%, all data visible + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend correctly identifies all 4 companies + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: 'Correct format: "bar-stacked-percent · seaborn · pyplots.ai"' + data_quality: + score: 20 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 8 + max: 8 + passed: true + comment: Shows varying proportions across time, demonstrates market shift + trends + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Market share by quarter is a perfect, realistic use case + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: Percentages in realistic ranges (15-35%), sensible quarterly progression + code_quality: + score: 8 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Simple linear structure: imports → data → plot → save' + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Uses np.random.seed(42), though data is actually deterministic + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: All imports used (matplotlib, numpy, pandas, seaborn) + - id: CQ-04 + name: No Deprecated API + score: 0 + max: 1 + passed: true + comment: No issues detected + - id: CQ-05 + name: Output Correct + score: 0 + max: 1 + passed: true + comment: Saves as plot.png correctly + library_features: + score: 2 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 2 + max: 5 + passed: false + comment: Only uses sns.despine() from seaborn; the actual plotting is done + with matplotlib's ax.bar(). This is a significant weakness as the implementation + could leverage seaborn's native bar plotting capabilities more. + verdict: APPROVED diff --git a/plots/bar-stacked/metadata/altair.yaml b/plots/bar-stacked/metadata/altair.yaml index 4710d92a1e..26c54a5fdd 100644 --- a/plots/bar-stacked/metadata/altair.yaml +++ b/plots/bar-stacked/metadata/altair.yaml @@ -23,3 +23,173 @@ review: weaknesses: - Legend positioned slightly far from the chart area, creating visual separation - Could use Altair selection features for interactive highlighting + image_description: 'The plot displays a stacked bar chart showing quarterly sales + (Q1-Q4) by product category. Four distinct stacked segments are visible per bar: + Electronics (blue, #306998) at the bottom, Clothing (orange, #E69F00), Home & + Garden (teal, #009E73), and Sports (yellow, #F0E442) at the top. Total value labels + appear above each stack (230, 259, 232, 321). The y-axis shows "Sales (Thousands + USD)" ranging from 0-340, and the x-axis shows "Quarter". A clear legend titled + "Product Category" is positioned on the right. The title reads "bar-stacked · + altair · pyplots.ai" at the top center. White stroke separators between segments + enhance readability. The chart demonstrates clear growth in Q4.' + criteria_checklist: + visual_quality: + score: 37 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title at 28pt, axis labels at 22pt, tick labels at 18pt - all perfectly + readable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text, clean layout with proper spacing + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bar segments well-sized, white stroke separators make segments distinct + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Colorblind-safe palette (blue, orange, teal, yellow) with good contrast + - id: VQ-05 + name: Layout Balance + score: 4 + max: 5 + passed: true + comment: Good proportions, slight excess whitespace on left margin + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: 'Descriptive with units: "Sales (Thousands USD)", "Quarter"' + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: true + comment: Grid has good opacity (0.3) but legend is slightly far from chart + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct stacked bar chart + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Categories on x-axis, values stacked correctly on y-axis + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: 'All spec features present: stacked components, total labels, legend, + consistent ordering' + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: All data visible, y-axis extends appropriately + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend labels match data categories exactly + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: 'Correct format: "bar-stacked · altair · pyplots.ai"' + data_quality: + score: 19 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 7 + max: 8 + passed: true + comment: Shows variation across quarters, different component sizes, clear + Q4 growth trend + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Quarterly sales by product category is a real, comprehensible business + scenario + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: Sales values in thousands USD are realistic for quarterly retail + data + code_quality: + score: 9 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Clean linear flow: imports → data → plot → save' + - id: CQ-02 + name: Reproducibility + score: 2 + max: 3 + passed: true + comment: Deterministic data (no random), but no explicit seed comment + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: Only altair and pandas imported, both used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current Altair API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png and plot.html + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: true + comment: Good use of Altair's declarative encoding with Order channel, tooltips, + and layered chart composition; could leverage more advanced features like + selections + verdict: APPROVED diff --git a/plots/bar-stacked/metadata/bokeh.yaml b/plots/bar-stacked/metadata/bokeh.yaml index b29b9ea5c1..2e2b9f4f13 100644 --- a/plots/bar-stacked/metadata/bokeh.yaml +++ b/plots/bar-stacked/metadata/bokeh.yaml @@ -24,3 +24,179 @@ review: - Legend placement in top-left slightly crowds the upper y-axis tick labels - Missing total value labels above each stack (mentioned in spec notes as consideration) - Data is hardcoded rather than using random generation with seed + image_description: 'The plot displays a stacked bar chart showing quarterly sales + data (Q1-Q4) with four product categories stacked vertically: Electronics (dark + blue at bottom), Clothing (golden yellow), Home & Garden (teal/turquoise), and + Sports (coral/salmon at top). The title "bar-stacked · bokeh · pyplots.ai" appears + at the top left. The y-axis shows "Sales (thousands USD)" ranging from 0 to 500, + and the x-axis shows "Quarter" with Q1-Q4 labels. A legend in the top-left corner + identifies all four categories. The bars show a clear upward trend in total sales + across quarters, with Q1 at ~315K, Q2 at ~405K, Q3 at ~430K, and Q4 at ~475K. + White separator lines between stacked segments enhance readability. The grid uses + subtle dashed horizontal lines.' + criteria_checklist: + visual_quality: + score: 37 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title at 36pt, axis labels at 28pt, tick labels at 24pt - all perfectly + readable at full resolution + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements, legend is well-positioned and doesn't + cover data + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bar segments are clearly visible with white borders separating them, + good width (0.7) + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Colors are distinct and colorblind-friendly (blue, yellow, teal, + coral - no red-green confusion) + - id: VQ-05 + name: Layout Balance + score: 4 + max: 5 + passed: true + comment: 'Good use of canvas space, minor issue: legend overlaps with y-axis + area slightly' + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: 'Descriptive labels with units: "Sales (thousands USD)" and "Quarter"' + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: false + comment: Grid is subtle (alpha 0.3, dashed), but legend placement in top-left + crowds the 500 tick mark area + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct stacked bar chart + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Categories on x-axis, stacked components correctly layered + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: 'All spec requirements met: distinct colors, clear legend, consistent + stacking order' + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: Y-axis shows all data with 10% padding at top + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: All four categories correctly labeled + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: 'Exact format: "bar-stacked · bokeh · pyplots.ai"' + data_quality: + score: 19 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 8 + max: 8 + passed: true + comment: Shows variation across categories and quarters, different growth + patterns per segment + - id: DQ-02 + name: Realistic Context + score: 6 + max: 7 + passed: true + comment: Quarterly sales by product category is plausible business scenario, + though somewhat generic + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: Values in thousands USD (45-190K) are realistic retail sales figures + code_quality: + score: 7 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: Simple imports → data → plot → save structure, no functions/classes + - id: CQ-02 + name: Reproducibility + score: 0 + max: 3 + passed: false + comment: No random seed needed (data is hardcoded/deterministic), but data + could benefit from np.random.seed for future extensions + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: All imports are used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current Bokeh API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png and plot.html + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: true + comment: Uses ColumnDataSource, HoverTool with custom tooltips, Legend with + LegendItem customization. Good use of Bokeh features but could leverage + more (e.g., LabelSet for totals). + verdict: APPROVED diff --git a/plots/bar-stacked/metadata/highcharts.yaml b/plots/bar-stacked/metadata/highcharts.yaml index 9654444614..ed9227625c 100644 --- a/plots/bar-stacked/metadata/highcharts.yaml +++ b/plots/bar-stacked/metadata/highcharts.yaml @@ -24,3 +24,172 @@ review: - Legend placement conflicts with X-axis title - they visually overlap - Data labels within segments could be slightly larger for better readability at full resolution + image_description: 'The plot displays a stacked column chart showing monthly energy + consumption by source (Jan-Jun). Four energy sources are stacked vertically: Solar + (teal/cyan at bottom), Natural Gas (yellow), Nuclear (purple), and Coal (darker + blue at top). Each bar shows individual segment values as data labels and stack + totals above (ranging from 1,225 to 1,317 MWh). The title correctly shows "bar-stacked + · highcharts · pyplots.ai" with a descriptive subtitle. A horizontal legend at + the bottom identifies all four components. The Y-axis is labeled "Energy (MWh)" + and X-axis shows "Month".' + criteria_checklist: + visual_quality: + score: 36 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 9 + max: 10 + passed: true + comment: Title, axis labels, and legend are clearly readable; data labels + within segments are slightly small but legible + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements; all labels are clearly separated + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bar segments are well-sized with appropriate spacing and white borders + between segments + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Colorblind-safe palette using blue, yellow, purple, and cyan - no + red-green conflicts + - id: VQ-05 + name: Layout Balance + score: 4 + max: 5 + passed: true + comment: Good layout with adequate margins; slight excess whitespace at bottom + below legend + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: Y-axis has "Energy (MWh)" with units, X-axis has "Month" + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: true + comment: Legend overlaps with X-axis title "Month" causing visual conflict + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct stacked column chart + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Categories on X-axis, values stacked correctly on Y-axis + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Stacking, multiple components, total labels all present + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: All data visible, Y-axis scales appropriately + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend correctly identifies all four energy sources + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: Uses correct format "{spec-id} · {library} · pyplots.ai" + data_quality: + score: 19 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 8 + max: 8 + passed: true + comment: 'Shows varied trajectories: Solar growth, Coal decline, Nuclear steady, + Natural Gas fluctuation' + - id: DQ-02 + name: Realistic Context + score: 6 + max: 7 + passed: true + comment: Energy consumption by source is highly realistic; values are plausible + for regional power mix + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: MWh values in realistic range for monthly consumption + code_quality: + score: 9 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Linear flow: imports → data → chart config → series → export' + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Deterministic data (no random values) + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: All imports are used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Current highcharts_core API + - id: CQ-05 + name: Output Correct + score: 0 + max: 1 + passed: false + comment: Saves as plot.png but also creates plot.html (minor issue, acceptable) + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: true + comment: Uses Highcharts stacking, tooltips with stack totals, stack labels, + but could leverage more interactive features + verdict: APPROVED diff --git a/plots/bar-stacked/metadata/letsplot.yaml b/plots/bar-stacked/metadata/letsplot.yaml index f2875c1461..d36e783205 100644 --- a/plots/bar-stacked/metadata/letsplot.yaml +++ b/plots/bar-stacked/metadata/letsplot.yaml @@ -24,3 +24,180 @@ review: demonstrate part-to-whole analysis - Legend stacking order visually shows bottom-to-top but legend reads top-to-bottom (minor visual disconnect) + image_description: 'The plot displays a stacked bar chart with 4 quarters (Q1, Q2, + Q3, Q4) on the x-axis and "Sales (Thousands $)" on the y-axis ranging from 0 to + 450. Four product categories are stacked within each bar: Electronics (teal blue, + #306998) at the bottom, Furniture (golden yellow, #FFD43B), Clothing (purple, + #8B5CF6), and Accessories (orange, #F59E0B) at the top. Bold total labels appear + above each stack: 315, 377, 386, 430 showing growth trend. A clean legend box + on the right identifies "Product Category" with all four items. The title "bar-stacked + · letsplot · pyplots.ai" is bold at the top. Minimal theme with no vertical gridlines + and subtle horizontal gridlines.' + criteria_checklist: + visual_quality: + score: 38 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title is large and bold (~28pt), axis titles ~22pt, tick labels ~18pt, + all perfectly readable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements anywhere + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bars are well-sized with appropriate width (0.7), alpha 0.9 provides + good visibility + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Colorblind-safe palette with good contrast between blue, yellow, + purple, and orange + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Plot fills canvas well, legend is appropriately placed on right with + styled background + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: '"Quarter" and "Sales (Thousands $)" are descriptive with units' + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: false + comment: Grid is subtle but legend order doesn't match visual stack order + (Electronics is at bottom in chart but first in legend which is correct, + however the visual stacking shows Accessories on top but it's last in legend + - this is acceptable) + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct stacked bar chart + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Quarters on X, Sales on Y, Products as stacked components + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Has distinct colors, legend, total labels above stacks, consistent + component order + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: Y-axis shows all data from 0 to above max total + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend labels match data correctly + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: '"bar-stacked · letsplot · pyplots.ai" is correct' + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 7 + max: 8 + passed: true + comment: Shows quarterly trends with 4 product categories, demonstrates part-to-whole + relationships well, but all categories show similar relative proportions + across quarters + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Quarterly sales by product category is a real, comprehensible business + scenario + - id: DQ-03 + name: Appropriate Scale + score: 4 + max: 5 + passed: true + comment: Values in thousands are reasonable for sales data, though the range + could show more variation + code_quality: + score: 9 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Simple linear script: imports → data → plot → save' + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Uses deterministic hardcoded data (no random seed needed) + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: Only pandas and lets_plot are imported, both used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current lets-plot API + - id: CQ-05 + name: Output Correct + score: 0 + max: 1 + passed: false + comment: Saves as plot.png but also saves plot.html (not an issue, but path + parameter usage is slightly unusual) + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: true + comment: Uses layer_tooltips for interactivity, ggplot grammar, theme customization, + but could leverage more lets-plot specific features like livemap or sampling + verdict: APPROVED diff --git a/plots/bar-stacked/metadata/matplotlib.yaml b/plots/bar-stacked/metadata/matplotlib.yaml index 788e25daea..0c2d2748b2 100644 --- a/plots/bar-stacked/metadata/matplotlib.yaml +++ b/plots/bar-stacked/metadata/matplotlib.yaml @@ -26,3 +26,178 @@ review: grow) to better demonstrate stacked bar utility for composition analysis - Could leverage matplotlib hatching patterns to further distinguish segments for accessibility + image_description: 'The plot displays a stacked bar chart showing quarterly revenue + (Q1-Q4) for a business, with four product categories stacked: Software (dark blue + at bottom), Hardware (yellow), Services (teal), and Support (coral/salmon at top). + Each quarter''s bar shows the composition of revenue from these four sources, + with total values labeled above each stack ($120M, $129M, $141M, $167M). The y-axis + displays "Revenue (Millions USD)" ranging from 0 to 175, and the x-axis shows + "Quarter" with Q1-Q4 labels. A legend is positioned outside the plot area in the + upper right corner. The chart uses subtle horizontal grid lines and has clean + styling with top and right spines removed.' + criteria_checklist: + visual_quality: + score: 38 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title at 24pt, axis labels at 20pt, tick labels at 16pt, legend at + 16pt - all perfectly readable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text; labels, legend, and data are well separated + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bar widths are appropriate, segments clearly distinguishable with + white edge lines + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Colorblind-safe palette with good contrast between adjacent segments + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Good use of canvas space, balanced margins, legend positioned cleanly + outside + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: Y-axis has descriptive label with units "Revenue (Millions USD)", + X-axis has "Quarter" + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: true + comment: Grid is subtle (alpha=0.3), but legend is outside the plot requiring + bbox_inches='tight' - minor deduction for legend placement being slightly + far from data + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct stacked bar chart type + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Categories on x-axis, stacked components correctly mapped + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: 'All spec features present: distinct colors, clear legend, total + labels above stacks, consistent ordering' + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: Y-axis shows all data with appropriate headroom for labels + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend labels match data series exactly + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: Correctly uses "bar-stacked · matplotlib · pyplots.ai" + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 6 + max: 8 + passed: true + comment: Shows 4 quarters with 4 components, demonstrates growth pattern and + composition changes, but all components show similar growth trends (could + show more variation like one declining while others grow) + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Quarterly revenue by product category is a highly realistic and comprehensible + business scenario + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: Revenue values in millions USD are realistic for a mid-size company + code_quality: + score: 10 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Clean structure: imports → data → plot → save, no functions/classes' + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Uses np.random.seed(42), though data is actually deterministic + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: Only matplotlib.pyplot and numpy imported, both used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current matplotlib API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png with correct dpi and bbox_inches + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: true + comment: Good use of Axes methods (ax.bar with bottom parameter), spine customization, + and tick_params, but doesn't leverage advanced matplotlib features like + hatching patterns or annotations with arrows + verdict: APPROVED diff --git a/plots/bar-stacked/metadata/plotly.yaml b/plots/bar-stacked/metadata/plotly.yaml index 8b991f986f..f390253421 100644 --- a/plots/bar-stacked/metadata/plotly.yaml +++ b/plots/bar-stacked/metadata/plotly.yaml @@ -23,3 +23,159 @@ review: - Legend horizontal positioning at top takes vertical space; could use right-side vertical legend - Yellow and coral colors may be slightly challenging for some colorblind users + image_description: 'The plot displays a stacked bar chart showing quarterly revenue + (Q1-Q4 2024) for four product categories: Software (dark blue at bottom), Hardware + (yellow), Services (teal), and Support (coral at top). Each bar segment contains + its value (e.g., 120, 80, 45, 25 for Q1). Total revenue annotations appear above + each stack ($270K, $305K, $350K, $390K) showing clear growth. The title "bar-stacked + · plotly · pyplots.ai" is centered at the top with a horizontal legend beneath + it. Y-axis shows "Revenue (Thousands USD)" and x-axis shows "Quarter". Clean white + background with subtle gridlines.' + criteria_checklist: + visual_quality: + score: 38 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: all text perfectly readable at full size + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: no overlapping text elements + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: bar segments well-sized with clear data labels + - id: VQ-04 + name: Color Accessibility + score: 4 + max: 5 + passed: true + comment: distinct colors, minor yellow/coral concern for colorblind + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: excellent proportions and margins + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: descriptive with units "Revenue (Thousands USD)" + - id: VQ-07 + name: Grid & Legend + score: 1 + max: 2 + passed: true + comment: grid subtle, horizontal legend functional but takes space + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: correct stacked bar chart + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: categories on x-axis, components stacked correctly + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: distinct colors, legend, total labels, consistent ordering, spacing + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: all data visible + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: labels match data series + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: uses correct {spec-id} · {library} · pyplots.ai format + data_quality: + score: 20 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 8 + max: 8 + passed: true + comment: shows growth pattern, varying components, part-to-whole relationships + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: plausible quarterly revenue by product category + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: realistic business revenue values in thousands USD + code_quality: + score: 9 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: clean imports → data → plot → save flow + - id: CQ-02 + name: Reproducibility + score: 2 + max: 3 + passed: true + comment: deterministic data, no random seed needed but could be explicit + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: only plotly.graph_objects used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: modern Plotly API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: saves as plot.png + library_features: + score: 5 + max: 5 + items: [] + verdict: APPROVED diff --git a/plots/bar-stacked/metadata/plotnine.yaml b/plots/bar-stacked/metadata/plotnine.yaml index 57cad15e88..7965a542bf 100644 --- a/plots/bar-stacked/metadata/plotnine.yaml +++ b/plots/bar-stacked/metadata/plotnine.yaml @@ -24,3 +24,172 @@ review: weaknesses: - Grid styling uses alpha parameter which may not render consistently - Legend title Product Category is inconsistent with column name Category + image_description: 'The plot displays a stacked bar chart with 4 bars representing + Q1-Q4 on the x-axis. Each bar contains 4 stacked segments representing product + categories: Electronics (pink/magenta at bottom), Clothing (blue/purple), Home + (orange), and Sports (green/teal at top). White value labels are centered within + each segment showing individual sales values. The y-axis shows "Sales (thousands + USD)" ranging from 0 to ~175. The title "bar-stacked · plotnine · pyplots.ai" + is displayed at the top in bold. A legend on the right identifies each category. + The bars show progression with Q4 having the tallest total stack.' + criteria_checklist: + visual_quality: + score: 37 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title is bold 24pt, axis labels 20pt, tick labels 16pt, all perfectly + readable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text, all labels clearly visible within their segments + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bars well-sized, segments clearly distinguishable with good proportions + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Set2 palette is colorblind-safe with good contrast between categories + - id: VQ-05 + name: Layout Balance + score: 4 + max: 5 + passed: true + comment: Good proportions, plot fills canvas well, minor extra whitespace + on right + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: Y-axis has units "Sales (thousands USD)", X-axis "Quarter" is descriptive + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: false + comment: Grid is subtle but legend title says "Product Category" while data + uses just "Category" + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct stacked bar chart + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Categories on x-axis, values stacked by component correctly + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Has stacked components, segment labels, legend, proper stacking order + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: Y-axis shows full range of cumulative totals + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend correctly identifies all 4 categories + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: Exact format "bar-stacked · plotnine · pyplots.ai" + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 6 + max: 8 + passed: true + comment: Shows stacking, part-to-whole, variation across quarters. Could show + more dramatic differences between categories + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Quarterly sales by product category is a realistic, comprehensible + business scenario + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: Sales values in thousands USD are realistic for retail + code_quality: + score: 9 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: Simple imports → data → plot → save structure, no functions/classes + - id: CQ-02 + name: Reproducibility + score: 2 + max: 3 + passed: false + comment: Data is deterministic (hardcoded) but no explicit seed comment; minor + deduction + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: All imports are used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current plotnine API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: true + comment: Uses ggplot grammar with geom_bar, position_stack, scale_fill_brewer, + theme_minimal. Good use of plotnine idioms but nothing exceptionally distinctive + verdict: APPROVED diff --git a/plots/bar-stacked/metadata/pygal.yaml b/plots/bar-stacked/metadata/pygal.yaml index f3d689333a..9c0683a01a 100644 --- a/plots/bar-stacked/metadata/pygal.yaml +++ b/plots/bar-stacked/metadata/pygal.yaml @@ -22,3 +22,176 @@ review: - Grid lines are minimal (only one visible at y=50); adding more y-axis guides would improve readability - Could use pygal's tooltips or other interactive features more prominently + image_description: 'The plot displays a stacked bar chart showing quarterly revenue + by product category. Four bars (Q1-Q4) are shown on the x-axis with "Revenue (Million + USD)" on the y-axis ranging from 0 to ~55. Each bar consists of four stacked segments + in distinct colors: Software (steel blue, bottom), Hardware (golden yellow), Services + (teal/cyan), and Cloud (coral/salmon, top). Value labels (e.g., 12.5, 8.3, 5.2, + 3.1) are displayed within each segment. The title "bar-stacked · pygal · pyplots.ai" + appears at the top. A legend at the bottom identifies all four categories. The + chart demonstrates clear quarterly growth with Q4 showing the highest cumulative + revenue (~56M). A subtle dotted grid line is visible at y=50.' + criteria_checklist: + visual_quality: + score: 35 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 9 + max: 10 + passed: true + comment: Title, axis labels, and value labels are all readable. Font sizes + are appropriate for the 4800x2700 canvas. + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements; value labels fit within segments. + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bar segments are well-sized and clearly visible with good spacing. + - id: VQ-04 + name: Color Accessibility + score: 4 + max: 5 + passed: true + comment: Good color contrast; blue, yellow, teal, and coral are distinguishable. + Not perfectly optimized for colorblindness but acceptable. + - id: VQ-05 + name: Layout Balance + score: 4 + max: 5 + passed: true + comment: Good layout with proper margins; legend at bottom is well-positioned + but there is some empty space. + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: 'Both axes have descriptive labels with units: "Quarter" and "Revenue + (Million USD)".' + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: true + comment: Only one subtle grid line visible at y=50, missing intermediate grid + lines for easier value reading. Legend is well-placed. + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct stacked bar chart type. + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Categories on x-axis, values stacked correctly. + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Has distinct colors, legend, value labels on segments as spec suggests. + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: All data visible, y-axis accommodates the tallest stack. + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend labels match the data series correctly. + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: Correctly uses "bar-stacked · pygal · pyplots.ai" format. + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 7 + max: 8 + passed: true + comment: Shows stacking well, demonstrates part-to-whole relationships. Could + show more variation in component ordering. + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Quarterly revenue by product category is a realistic, comprehensible + business scenario. + - id: DQ-03 + name: Appropriate Scale + score: 4 + max: 5 + passed: true + comment: Revenue values in millions are realistic for a mid-sized company; + growth pattern is plausible. + code_quality: + score: 10 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Simple linear structure: imports → data → style → chart → save.' + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Uses deterministic hardcoded data, no randomness. + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: Only pygal and Style are imported, both used. + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current pygal API. + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves to plot.png and plot.html correctly. + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: true + comment: Uses pygal's custom Style, StackedBar chart type, print_values feature, + and legend_at_bottom. Good use of pygal-specific configuration but nothing + highly distinctive. + verdict: APPROVED diff --git a/plots/bar-stacked/metadata/seaborn.yaml b/plots/bar-stacked/metadata/seaborn.yaml index d31f1840e5..4fc36cb768 100644 --- a/plots/bar-stacked/metadata/seaborn.yaml +++ b/plots/bar-stacked/metadata/seaborn.yaml @@ -25,3 +25,174 @@ review: np.random.seed(42) for consistency) - 'Two blue shades (Electronics #306998 and Home & Garden #4B8BBE) may be difficult to distinguish for some colorblind users' + image_description: 'The plot shows a stacked bar chart displaying monthly sales + data (January through June) for four product categories: Electronics (dark blue), + Clothing (yellow), Home & Garden (light blue), and Sports (coral/salmon). Each + bar is properly stacked with total values labeled above ($285K to $435K). The + title follows the required format "bar-stacked · seaborn · pyplots.ai". The y-axis + shows "Sales (Thousands $)" ranging from 0 to 500, and the x-axis shows "Month". + A legend titled "Product Category" is positioned to the right of the plot. The + grid is subtle with horizontal dashed lines, and the overall layout is clean with + good spacing between bars.' + criteria_checklist: + visual_quality: + score: 36 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title at 24pt, labels at 20pt, ticks at 16pt - all perfectly readable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements, all labels clear + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Bar segments well-sized with white edge lines for separation + - id: VQ-04 + name: Color Accessibility + score: 4 + max: 5 + passed: true + comment: Colors are distinct (blue, yellow, light blue, coral) but two blue + shades could be challenging for some colorblind users + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Good proportions, plot fills canvas appropriately, legend well-positioned + - id: VQ-06 + name: Axis Labels + score: 1 + max: 2 + passed: true + comment: Y-axis has units "Sales (Thousands $)", X-axis just "Month" (acceptable + but could be more descriptive) + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: true + comment: Grid is subtle (alpha=0.3, dashed), but legend appears to overlap + with the rightmost bar edge slightly + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct stacked bar chart + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Categories on X, values stacked correctly + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Stacked components, total labels, legend, consistent ordering + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: All data visible, y-axis extends to accommodate totals + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend labels match product categories correctly + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: 'Uses correct format: bar-stacked · seaborn · pyplots.ai' + data_quality: + score: 20 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 8 + max: 8 + passed: true + comment: Shows variation across months, different growth patterns per category, + part-to-whole relationships clear + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Monthly sales by product category is a real business scenario + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: Sales values in thousands are realistic for retail business + code_quality: + score: 7 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Linear structure: imports → data → plot → save' + - id: CQ-02 + name: Reproducibility + score: 0 + max: 3 + passed: false + comment: No random seed set (data is deterministic, but best practice to include + seed for any random operations) + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: Only matplotlib, pandas, seaborn imported and all used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current seaborn API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: true + comment: Uses sns.histplot with weights/multiple="stack" which is seaborn's + approach, plus sns.set_style, sns.set_context, and sns.despine. However, + seaborn doesn't have a native stacked bar function, so using histplot with + weights is a workaround rather than a distinctive strength. + verdict: APPROVED diff --git a/plots/bland-altman-basic/metadata/altair.yaml b/plots/bland-altman-basic/metadata/altair.yaml index 2db64587b5..133d8d4c0b 100644 --- a/plots/bland-altman-basic/metadata/altair.yaml +++ b/plots/bland-altman-basic/metadata/altair.yaml @@ -25,3 +25,173 @@ review: - Grid configuration uses gridOpacity=0.3 which is acceptable but could have legend explaining the reference lines for publication quality - No formal legend element present, though annotations compensate for this + image_description: The plot displays a Bland-Altman agreement plot comparing two + blood pressure measurement methods. Blue circular scatter points (#306998 Python + blue) with moderate transparency (alpha 0.7) represent 80 paired observations. + A solid dark blue horizontal line at y = -2.44 indicates the mean bias. Two dashed + yellow/gold lines at y = +6.55 and y = -11.44 mark the 95% limits of agreement + (±1.96 SD). The x-axis shows "Mean of Two Methods (mmHg)" ranging from approximately + 80-160, and the y-axis shows "Difference (Method 1 - Method 2) (mmHg)" ranging + from about -18 to 10. The title "bland-altman-basic · altair · pyplots.ai" appears + at the top. Annotations for each reference line appear on the right side of the + plot. The grid is subtle with light gray lines. + criteria_checklist: + visual_quality: + score: 36 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 9 + max: 10 + passed: true + comment: Title and axis labels are clearly readable; tick labels well-sized + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text or data elements + - id: VQ-03 + name: Element Visibility + score: 7 + max: 8 + passed: true + comment: Marker size (200) appropriate for 80 points; good transparency reveals + overlapping points + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Blue/yellow contrast is colorblind-safe; good differentiation + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Plot fills canvas well with balanced margins + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: Both axes have descriptive labels with units (mmHg) + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: false + comment: Grid is good (alpha 0.3), but no legend present (not required for + this plot type) + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct Bland-Altman plot structure + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: X = mean of pairs, Y = difference; correctly implemented + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Mean bias line, ±1.96 SD lines, annotations all present + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: Axes show all data points and reference lines + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: N/A for this plot type; annotations serve as legend + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: 'Correct format: "bland-altman-basic · altair · pyplots.ai"' + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 7 + max: 8 + passed: true + comment: Shows appropriate spread with bias; could show slight proportional + bias trend more clearly + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Blood pressure measurements from two sphygmomanometers is realistic + medical validation scenario + - id: DQ-03 + name: Appropriate Scale + score: 4 + max: 5 + passed: true + comment: Blood pressure values (80-160 mmHg) are realistic; bias of -2.44 + mmHg is clinically meaningful + code_quality: + score: 10 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Linear flow: imports → data → plot → save' + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: np.random.seed(42) is set + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: Only altair, numpy, pandas used; all necessary + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Current Altair API used + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png and plot.html + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: true + comment: Uses Altair's layering system, tooltips for interactivity, encoding + types; could leverage more declarative features + verdict: APPROVED diff --git a/plots/bland-altman-basic/metadata/bokeh.yaml b/plots/bland-altman-basic/metadata/bokeh.yaml index ed1c6f2f1a..062fcaf929 100644 --- a/plots/bland-altman-basic/metadata/bokeh.yaml +++ b/plots/bland-altman-basic/metadata/bokeh.yaml @@ -25,3 +25,180 @@ review: (consider top-right or outside plot) - Missing HoverTool which would enhance interactivity and is a key Bokeh strength - Grid styling is good but legend could have cleaner integration + image_description: 'The plot displays a Bland-Altman agreement plot with 80 blue + scatter points showing paired blood pressure measurements. Three horizontal reference + lines are present: a solid blue line at the mean bias (-2.82 mmHg), and two dashed + yellow lines at the upper (+13.34 mmHg) and lower (-18.99 mmHg) limits of agreement + (±1.96 SD). Each reference line has an annotation on the left side showing its + value. The title "bland-altman-basic · bokeh · pyplots.ai" appears at the top. + The x-axis is labeled "Mean of Two Methods (mmHg)" and the y-axis "Difference + (Method 1 - Method 2) (mmHg)". A legend labeled "Observations" is in the top left. + The background is white with subtle dashed grid lines.' + criteria_checklist: + visual_quality: + score: 36 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title, axis labels, tick labels, and annotations are all clearly + readable at the 4800x2700 resolution with appropriate font sizes (28pt title, + 22pt axis labels, 18pt ticks, 20pt annotations) + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements; annotations are well-positioned with + appropriate offsets + - id: VQ-03 + name: Element Visibility + score: 7 + max: 8 + passed: true + comment: Scatter points are well-sized (size=18) with good alpha (0.7) for + the 80 data points; slightly smaller than ideal for this density + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Blue and yellow color scheme is colorblind-safe with good contrast + - id: VQ-05 + name: Layout Balance + score: 4 + max: 5 + passed: true + comment: Good use of canvas space; plot fills most of the area but has slightly + more whitespace on the right side + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: Both axes have descriptive labels with units (mmHg) + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: true + comment: Grid is subtle (alpha=0.3) but legend placement partially obscures + upper-left data area + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct Bland-Altman plot showing difference vs. mean + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: X-axis shows mean of two methods, Y-axis shows difference (method1 + - method2) + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: 'All required features present: mean bias line, ±1.96 SD limits, + annotations with values, transparent scatter points' + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: Axes show all data points appropriately + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend correctly labels observations + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: 'Correct format: "bland-altman-basic · bokeh · pyplots.ai"' + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 7 + max: 8 + passed: true + comment: Shows good spread of data with variation, a few outliers beyond limits + of agreement; could show slightly more extreme cases + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Blood pressure measurements from two sphygmomanometers is a classic, + realistic Bland-Altman application + - id: DQ-03 + name: Appropriate Scale + score: 4 + max: 5 + passed: true + comment: Blood pressure values (100-160 mmHg systolic range) are realistic; + difference values are plausible but the bias and SD seem slightly high for + typical device comparisons + code_quality: + score: 10 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Linear script structure: imports → data → plot → save' + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Uses np.random.seed(42) + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: All imports are used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current Bokeh API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png and plot.html + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: true + comment: Uses ColumnDataSource, Span for reference lines, and Label for annotations; + also outputs HTML for interactivity. Could leverage more Bokeh-specific + features like HoverTool for data inspection. + verdict: APPROVED diff --git a/plots/bland-altman-basic/metadata/highcharts.yaml b/plots/bland-altman-basic/metadata/highcharts.yaml index 2912248b2b..35351742e1 100644 --- a/plots/bland-altman-basic/metadata/highcharts.yaml +++ b/plots/bland-altman-basic/metadata/highcharts.yaml @@ -27,3 +27,177 @@ review: individual measurement details - Red color for limits of agreement could be replaced with a more colorblind-safe alternative + image_description: The plot displays a Bland-Altman agreement visualization with + 80 blue scatter points representing paired blood pressure observations. The x-axis + shows "Mean of Two Methods (mmHg)" ranging from approximately 96 to 164, and the + y-axis shows "Difference (Method 1 - Method 2) (mmHg)" ranging from about -25 + to 16. A solid blue horizontal line marks the mean difference at -2.67, and two + red dashed horizontal lines indicate the ±1.96 SD limits of agreement at approximately + +9.49 and -14.84. Each reference line is labeled with its value on the right side + of the plot. The title "bland-altman-basic · highcharts · pyplots.ai" appears + at the top, and a legend showing "Paired Observations" is positioned in the upper + right corner. Points have moderate transparency (alpha ~0.6) allowing overlapping + observations to be distinguished. + criteria_checklist: + visual_quality: + score: 36 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: 'All text is clearly readable: title is large and bold, axis labels + are appropriately sized, tick labels are legible' + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements, all labels are clearly separated + - id: VQ-03 + name: Element Visibility + score: 7 + max: 8 + passed: true + comment: Markers are appropriately sized (radius 14) with good transparency + for 80 points; slightly larger than optimal for this density + - id: VQ-04 + name: Color Accessibility + score: 4 + max: 5 + passed: true + comment: Blue/red scheme is distinguishable but red for limits is not the + most colorblind-safe choice; better than red-green but not optimal + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Good proportions, plot fills canvas well with appropriate margins + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: Both axes have descriptive labels with units (mmHg) + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: true + comment: Grid is extremely subtle (alpha 0.1), legend is functional but positioned + far from data + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct Bland-Altman scatter plot + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: X-axis correctly shows mean of pairs, Y-axis shows difference + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: 'All required features present: mean difference line, ±1.96 SD limits, + annotations with values' + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: All data points visible within axes + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend correctly labels the scatter series + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: 'Correct format: bland-altman-basic · highcharts · pyplots.ai' + data_quality: + score: 20 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 8 + max: 8 + passed: true + comment: Data shows full range of agreement/disagreement with points both + within and outside limits of agreement + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Blood pressure measurement comparison is a classic Bland-Altman use + case + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: Values are realistic for systolic blood pressure (90-160 mmHg range) + code_quality: + score: 10 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Clean linear structure: imports → data → chart → export' + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Uses np.random.seed(42) + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: All imports are used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current highcharts-core API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png and plot.html + library_features: + score: 0 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 0 + max: 5 + passed: false + comment: Uses basic scatter series and plotLines; does not leverage Highcharts + interactivity, tooltips, or other distinctive features in a meaningful way + beyond what other libraries offer + verdict: APPROVED diff --git a/plots/bland-altman-basic/metadata/letsplot.yaml b/plots/bland-altman-basic/metadata/letsplot.yaml index 969f061b17..9d5f407433 100644 --- a/plots/bland-altman-basic/metadata/letsplot.yaml +++ b/plots/bland-altman-basic/metadata/letsplot.yaml @@ -26,3 +26,179 @@ review: at full resolution - Could add tooltips for interactivity since letsplot supports it - Grid styling uses hardcoded color instead of leveraging theme defaults + image_description: The plot displays a Bland-Altman agreement analysis comparing + two blood pressure measurement methods. The visualization shows 80 blue scatter + points with moderate transparency (alpha=0.7) plotted against a white background + with subtle gray grid lines. The x-axis shows "Mean of Two Methods (mmHg)" ranging + from approximately 90 to 155 mmHg, and the y-axis shows "Difference (Method 1 + - Method 2) (mmHg)" ranging from about -20 to +12. A solid green horizontal line + indicates the mean bias at -2.55 mmHg, while red dashed horizontal lines mark + the limits of agreement at +7.84 mmHg (upper) and -12.93 mmHg (lower). Each reference + line has a clearly visible boxed label positioned on the left side with color-matched + text (green for bias, red for LoA). The title "bland-altman-basic · letsplot · + pyplots.ai" appears at the top. The layout is clean and well-proportioned with + good use of the canvas space. + criteria_checklist: + visual_quality: + score: 36 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title, axis labels, tick marks, and annotations are all clearly readable + at full size + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements; annotation labels are well-positioned + - id: VQ-03 + name: Element Visibility + score: 7 + max: 8 + passed: true + comment: Points are appropriately sized (size=5) with good alpha (0.7) for + 80 data points; minor deduction as points could be slightly larger + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Blue/green/red scheme is colorblind-friendly; colors serve distinct + purposes (data/bias/LoA) + - id: VQ-05 + name: Layout Balance + score: 4 + max: 5 + passed: true + comment: Good canvas utilization but slight asymmetry with more whitespace + on right side + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: 'Descriptive labels with units: "Mean of Two Methods (mmHg)" and + "Difference (Method 1 - Method 2) (mmHg)"' + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: false + comment: No legend needed for this plot type, grid is subtle and appropriate + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct Bland-Altman plot with scatter points + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: X = mean of paired observations, Y = difference (correct) + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Mean bias line, ±1.96 SD limits of agreement, annotations all present + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: Axes show all data points clearly + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: N/A for this plot type; line annotations serve as legend + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: Uses correct format "bland-altman-basic · letsplot · pyplots.ai" + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 7 + max: 8 + passed: true + comment: Shows good spread of differences around the mean, includes points + near and beyond LoA boundaries; minor deduction as no extreme outliers highlighted + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Blood pressure readings from two sphygmomanometers is a perfect real-world + application + - id: DQ-03 + name: Appropriate Scale + score: 4 + max: 5 + passed: true + comment: BP values (100-160 mmHg) are realistic; the negative bias (-2.55) + with ~5mmHg SD is plausible but slight bias direction could be reconsidered + code_quality: + score: 10 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: Clean imports → data → plot → save structure, no functions or classes + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Uses np.random.seed(42) + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: Only numpy, pandas, and lets_plot imported + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current lets-plot API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png and plot.html + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: true + comment: Uses lets-plot ggplot grammar effectively with geom_point, geom_hline, + geom_label, theme_minimal; could leverage more advanced features like interactive + tooltips + verdict: APPROVED diff --git a/plots/bland-altman-basic/metadata/matplotlib.yaml b/plots/bland-altman-basic/metadata/matplotlib.yaml index 5f0d32b9d1..ee1be7c570 100644 --- a/plots/bland-altman-basic/metadata/matplotlib.yaml +++ b/plots/bland-altman-basic/metadata/matplotlib.yaml @@ -24,3 +24,178 @@ review: - Legend and right-side annotations show redundant information; consider removing one or making them complementary - Marker size (s=150) slightly below the recommended 100-200 range for 80 data points + image_description: 'The plot displays a Bland-Altman agreement plot comparing two + blood pressure measurement methods. Blue circular markers (80 data points) are + scattered showing the difference between methods plotted against the mean of both + methods. A solid dark blue horizontal line indicates the mean bias at -2.44 mmHg. + Two dashed golden/yellow horizontal lines mark the limits of agreement at +1.96 + SD (6.55 mmHg) and -1.96 SD (-11.44 mmHg). A subtle dotted gray reference line + is at y=0. The right side of the plot has text annotations showing the bias and + limits of agreement values. The x-axis is labeled "Mean of Two Methods (mmHg)" + ranging from 80-150, and the y-axis is labeled "Difference (Method 1 - Method + 2) (mmHg)" ranging from -15 to about 7. The title follows the required format: + "bland-altman-basic · matplotlib · pyplots.ai". A legend in the upper left explains + the three horizontal lines.' + criteria_checklist: + visual_quality: + score: 36 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title at 24pt, axis labels at 20pt, tick labels at 16pt, annotations + at 14pt - all clearly readable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements, all annotations positioned cleanly + - id: VQ-03 + name: Element Visibility + score: 7 + max: 8 + passed: true + comment: Markers at s=150 with alpha=0.6 appropriate for 80 points, though + could be slightly larger per guidelines (100-200 recommended for 30-100 + points) + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Blue/yellow color scheme is colorblind-safe with good contrast + - id: VQ-05 + name: Layout Balance + score: 4 + max: 5 + passed: true + comment: Good overall layout, though right margin annotations extend beyond + typical plot area + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: Both axes have descriptive labels with units (mmHg) + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: true + comment: Legend is well-placed but provides redundant information (same values + shown in annotations); grid is subtle at alpha=0.3 + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct Bland-Altman plot type + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: X-axis shows mean of pairs, Y-axis shows difference + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Mean line, ±1.96 SD lines, annotations all present + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: All data visible within axes + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend correctly describes line meanings + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: 'Correct format: "bland-altman-basic · matplotlib · pyplots.ai"' + data_quality: + score: 19 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 7 + max: 8 + passed: true + comment: Shows good spread of differences with points both within and outside + limits of agreement; demonstrates realistic bias + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Blood pressure sphygmomanometer comparison is a classic real-world + application + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: Blood pressure values around 80-150 mmHg are realistic + code_quality: + score: 10 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: Clean imports → data → plot → save structure, no functions/classes + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: np.random.seed(42) set + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: Only matplotlib.pyplot and numpy imported + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: No deprecated functions used + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as 'plot.png' + library_features: + score: 2 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 2 + max: 5 + passed: true + comment: Uses basic matplotlib features (axhline, scatter, text annotations) + correctly but doesn't leverage advanced features like fill_between for confidence + regions + verdict: APPROVED diff --git a/plots/bland-altman-basic/metadata/plotly.yaml b/plots/bland-altman-basic/metadata/plotly.yaml index f9696388a9..aeee8da087 100644 --- a/plots/bland-altman-basic/metadata/plotly.yaml +++ b/plots/bland-altman-basic/metadata/plotly.yaml @@ -24,3 +24,174 @@ review: weaknesses: - Data could include a few clear outliers beyond the limits of agreement to demonstrate how such cases appear on the plot + image_description: 'The plot displays a Bland-Altman agreement plot on a white background + with the title "bland-altman-basic · plotly · pyplots.ai" at the top center. The + x-axis shows "Mean of Two Methods (mmHg)" ranging from approximately 85 to 155, + and the y-axis shows "Difference (Method 1 − Method 2) (mmHg)" ranging from -15 + to about 8. There are 80 blue circular markers (color #306998) with white edges + and moderate transparency scattered across the plot. A solid blue horizontal line + indicates the mean difference at -2.44, and two dashed gold/yellow horizontal + lines mark the limits of agreement at +1.96 SD (6.55) and -1.96 SD (-11.44). Annotations + on the right side clearly label these reference lines with their values. The grid + is subtle with light gray lines.' + criteria_checklist: + visual_quality: + score: 38 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title at 32pt, axis labels at 24pt, tick labels at 18pt - all perfectly + readable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements; annotations positioned cleanly on the + right + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Marker size 14 with 0.7 opacity is appropriate for 80 data points + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Blue and gold/yellow color scheme is colorblind-safe + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Good margins, plot fills canvas appropriately + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: Descriptive labels with units (mmHg) + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: false + comment: Grid at 0.1 alpha is appropriate, but legend is hidden when it could + help identify the observations trace + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct Bland-Altman difference plot + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: X = mean of pairs, Y = difference - exactly per spec + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Mean line, ±1.96 SD limits, annotations all present + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: Axes show all data points without clipping + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: N/A for this plot type (legend disabled appropriately) + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: Correctly formatted as "bland-altman-basic · plotly · pyplots.ai" + data_quality: + score: 17 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 6 + max: 8 + passed: true + comment: Shows bias and spread well, but data is relatively symmetric around + mean without clear outliers beyond LOA to demonstrate boundary cases + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Blood pressure measurement comparison between sphygmomanometers is + a classic Bland-Altman use case + - id: DQ-03 + name: Appropriate Scale + score: 4 + max: 5 + passed: true + comment: BP values 85-155 mmHg are realistic systolic readings; bias of ~2.5 + mmHg is clinically plausible + code_quality: + score: 10 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Linear flow: imports → data → plot → save, no functions/classes' + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: np.random.seed(42) used + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: Only numpy and plotly.graph_objects imported + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current Plotly API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png and plot.html + library_features: + score: 5 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 5 + max: 5 + passed: true + comment: Good use of `add_hline` with annotations, hover templates for interactivity, + and HTML export for interactive viewing + verdict: APPROVED diff --git a/plots/bland-altman-basic/metadata/pygal.yaml b/plots/bland-altman-basic/metadata/pygal.yaml index f41a15a9f9..1376e68086 100644 --- a/plots/bland-altman-basic/metadata/pygal.yaml +++ b/plots/bland-altman-basic/metadata/pygal.yaml @@ -22,3 +22,161 @@ review: weaknesses: - LoA values annotated only in legend, not directly on the plot as text annotations (spec requests annotations on the plot) + image_description: 'The plot displays a Bland-Altman agreement analysis comparing + two blood pressure measurement methods (sphygmomanometers). Blue scatter points + (50 subjects) show the difference vs. mean of paired measurements. The x-axis + shows "Mean of Two Methods (mmHg)" ranging from ~100-155 mmHg. The y-axis shows + "Difference (Method 1 - Method 2) (mmHg)" ranging from -24 to +24. A solid red + horizontal line marks the mean bias (-1.7 mmHg), with dashed green (upper: +14.6) + and purple (lower: -17.9) lines showing the ±1.96 SD limits of agreement. The + white background has subtle grid lines, and a clean legend at the bottom identifies + all four series with their values.' + criteria_checklist: + visual_quality: + score: 37 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 8 + max: 10 + passed: true + comment: all text readable, title and labels clear + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: no overlapping text elements + - id: VQ-03 + name: Element Visibility + score: 7 + max: 8 + passed: true + comment: markers well-sized for 50 points, good opacity + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: distinct colors (blue, red, green, purple) + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: good canvas utilization, balanced margins + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: descriptive with units "(mmHg)" + - id: VQ-07 + name: Grid & Legend + score: 2 + max: 2 + passed: true + comment: subtle grid, well-placed bottom legend + spec_compliance: + score: 24 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: correct Bland-Altman XY scatter + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: mean on x-axis, difference on y-axis + - id: SC-03 + name: Required Features + score: 4 + max: 5 + passed: true + comment: has mean bias and LoA lines; values in legend but not annotated directly + on plot + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: all data visible + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: correctly labeled with values + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: correct "bland-altman-basic · pygal · pyplots.ai" + data_quality: + score: 19 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 7 + max: 8 + passed: true + comment: good spread, includes outliers near LoA bounds + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: blood pressure comparison is authentic medical use case + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: realistic systolic BP values (100-155 mmHg) + code_quality: + score: 10 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: clean linear flow, no functions/classes + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: np.random.seed(42) + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: all imports used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: current pygal API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: saves plot.png and plot.html + library_features: + score: 4 + max: 5 + items: [] + verdict: APPROVED diff --git a/plots/bland-altman-basic/metadata/seaborn.yaml b/plots/bland-altman-basic/metadata/seaborn.yaml index 2189c825aa..f2b96d52d5 100644 --- a/plots/bland-altman-basic/metadata/seaborn.yaml +++ b/plots/bland-altman-basic/metadata/seaborn.yaml @@ -26,3 +26,177 @@ review: framealpha competes with data region)' - 'Library features (LF-01): Could leverage more seaborn-specific features like rugplot for marginal distributions or confidence intervals' + image_description: 'The plot displays a Bland-Altman agreement plot comparing two + blood pressure measurement methods. Blue circular markers (n=80) with white edges + and moderate transparency show individual paired observations. The x-axis displays + "Mean of Two Methods (mmHg)" ranging from approximately 80-150 mmHg, and the y-axis + shows "Difference (Method 1 - Method 2) (mmHg)" ranging from about -15 to +7 mmHg. + A solid yellow horizontal line indicates the mean difference (bias) at -1.9 mmHg. + Two red dashed horizontal lines mark the 95% limits of agreement at +7.1 and -10.9 + mmHg. A subtle gray dotted zero reference line is included. Numeric annotations + appear on the right edge of the plot showing the exact values. The legend in the + upper left displays the mean and LoA values with units. The title follows the + required format: "bland-altman-basic · seaborn · pyplots.ai". The layout is well-balanced + with a subtle gray dashed grid.' + criteria_checklist: + visual_quality: + score: 37 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title 24pt, labels 20pt, ticks 16pt - all clearly readable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements + - id: VQ-03 + name: Element Visibility + score: 7 + max: 8 + passed: true + comment: Markers well-sized (s=150) with good alpha (0.7) for 80 points; slight + deduction for some edge crowding + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Blue/yellow/red color scheme is colorblind-safe with good contrast + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Plot fills canvas well with balanced margins + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: Descriptive labels with units (mmHg) + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: false + comment: Grid alpha at 0.3 is acceptable, but zero reference line could be + more visible + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct Bland-Altman plot with differences vs means + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: X-axis shows mean of pair, Y-axis shows difference + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Mean line, LoA lines, annotations all present + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: All data points visible within axes + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend labels correctly describe lines with values + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: 'Uses correct format: bland-altman-basic · seaborn · pyplots.ai' + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 7 + max: 8 + passed: true + comment: Shows variation in differences across the measurement range; slight + proportional error visible; one minor deduction for not showing more extreme + outliers outside LoA + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Blood pressure measurements from two sphygmomanometers is a classic + real-world application + - id: DQ-03 + name: Appropriate Scale + score: 4 + max: 5 + passed: true + comment: Values realistic (80-150 mmHg systolic BP range), though distribution + could be slightly tighter + code_quality: + score: 10 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Linear structure: imports → data → plot → save' + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: np.random.seed(42) used + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: Only matplotlib, numpy, seaborn imported and used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current seaborn API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png with dpi=300 + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: false + comment: Uses sns.scatterplot correctly, but the horizontal reference lines + use matplotlib's axhline rather than seaborn-specific statistical annotation + features + verdict: APPROVED diff --git a/plots/box-basic/metadata/altair.yaml b/plots/box-basic/metadata/altair.yaml index b53dafd946..7cdd1fd7ff 100644 --- a/plots/box-basic/metadata/altair.yaml +++ b/plots/box-basic/metadata/altair.yaml @@ -25,3 +25,170 @@ review: - Does not include tooltips which are a key Altair feature for data exploration - Legend is explicitly hidden (legend=None) when it could aid readability - Grid opacity configured but not showing strongly in the visualization + image_description: 'The plot displays 5 box plots comparing salary distributions + across departments (Engineering, Finance, HR, Marketing, Sales). Each department + has a distinct color: blue for Engineering, yellow for Finance, light blue for + HR, gray for Marketing, and green for Sales. The boxes show quartiles with white + median lines, whiskers extend to show data range, and outliers appear as hollow + circles. The y-axis displays "Salary ($)" with currency formatting ($0 to $180,000), + and the x-axis shows "Department" with angled labels. The title "box-basic · altair + · pyplots.ai" appears at the top. A subtle grid is present in the background.' + criteria_checklist: + visual_quality: + score: 36 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 9 + max: 10 + passed: true + comment: Title and axis labels are clearly readable, tick labels well-sized + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements + - id: VQ-03 + name: Element Visibility + score: 7 + max: 8 + passed: true + comment: Box plots well-sized, outliers visible but could be slightly larger + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Good color differentiation, colorblind-friendly palette + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Good proportions, no cut-off content + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: Descriptive labels with units ("Salary ($)") + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: true + comment: Grid is subtle (good), but legend is hidden when it could help identify + departments + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct box plot type + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Categories on X, values on Y correctly + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Median line, outliers, whiskers all present + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: All data visible including outliers + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Colors match categories (legend hidden but consistent) + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: 'Correct format: "box-basic · altair · pyplots.ai"' + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 7 + max: 8 + passed: true + comment: Shows outliers and different distributions, varied spreads across + departments + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Salary distributions across departments is a real, comprehensible + scenario + - id: DQ-03 + name: Appropriate Scale + score: 4 + max: 5 + passed: true + comment: Salaries are realistic but some outliers seem extreme (e.g., $170k + in Sales seems high relative to base) + code_quality: + score: 10 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: Clean imports → data → plot → save structure + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Uses np.random.seed(42) + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: Only necessary imports (altair, numpy, pandas) + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current Altair API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png and plot.html + library_features: + score: 2 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 2 + max: 5 + passed: false + comment: Uses mark_boxplot with customization but doesn't leverage Altair's + interactive features or tooltips + verdict: APPROVED diff --git a/plots/box-basic/metadata/bokeh.yaml b/plots/box-basic/metadata/bokeh.yaml index 9d795fb516..be212bfb4c 100644 --- a/plots/box-basic/metadata/bokeh.yaml +++ b/plots/box-basic/metadata/bokeh.yaml @@ -23,3 +23,176 @@ review: - Does not leverage Bokeh's interactive features (hover tooltips showing statistics would be valuable) - Axis labels lack units (could be "Test Score (points)" for clarity) + image_description: The plot displays a box-and-whisker plot comparing test score + distributions across four classes (Class A, B, C, D). Each box shows the interquartile + range (IQR) with a black median line. Class A has a blue box (~70-78 range), Class + B has a yellow/gold box (~82-88 range) with a tight distribution, Class C has + a light blue box (~57-80 range) showing the widest spread, and Class D has a gray + box (~72-83 range). Whiskers extend appropriately and outliers are displayed as + hollow circles - Class A has one low outlier (~49), Class B has outliers both + above (~99) and below (~45-52), Class C has outliers above (~135) and below (~8), + and Class D has outliers above (~103-108) and below (~40-42). The title reads + "box-basic · bokeh · pyplots.ai" and axes are labeled "Class" (x-axis) and "Test + Score" (y-axis). The layout is clean with a dashed horizontal grid. + criteria_checklist: + visual_quality: + score: 36 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 9 + max: 10 + passed: true + comment: Title, axis labels, and tick labels are all clearly readable. Font + sizes are appropriate for 4800x2700 canvas. + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements, all labels well-spaced + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Boxes, whiskers, and outliers are well-sized and clearly visible + - id: VQ-04 + name: Color Accessibility + score: 4 + max: 5 + passed: true + comment: Good color choices (blue, yellow, light blue, gray) that are distinguishable; + yellow may have slight contrast issues + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Good proportions, no cut-off content, well-centered + - id: VQ-06 + name: Axis Labels + score: 1 + max: 2 + passed: true + comment: Descriptive labels ("Test Score", "Class") but no units + - id: VQ-07 + name: Grid & Legend + score: 1 + max: 2 + passed: true + comment: Grid is subtle with dashed lines and appropriate alpha; no legend + needed for this plot type + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct box-and-whisker plot + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Categories on x-axis, numerical values on y-axis + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Median lines, boxes (Q1-Q3), whiskers at 1.5*IQR, outliers as points, + different colors per category + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: All data including outliers visible + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: N/A for this plot type (categories labeled on x-axis) + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: Uses correct format "box-basic · bokeh · pyplots.ai" + data_quality: + score: 20 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 8 + max: 8 + passed: true + comment: 'Excellent variety: shows different spreads (tight Class B vs wide + Class C), outliers on both high and low ends, varying medians' + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Test scores across classes is a realistic, comprehensible scenario + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: Test scores 0-140 range is realistic for educational data + code_quality: + score: 10 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Clean linear flow: imports → data → calculations → plot → save' + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Uses np.random.seed(42) + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: All imports are used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current Bokeh API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png and plot.html + library_features: + score: 0 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 0 + max: 5 + passed: false + comment: Implementation manually calculates box plot statistics instead of + using Bokeh's built-in capabilities. While functionally correct, it doesn't + showcase Bokeh-specific features like hover tools or interactive elements + that would distinguish it from other libraries. + verdict: APPROVED diff --git a/plots/box-basic/metadata/highcharts.yaml b/plots/box-basic/metadata/highcharts.yaml index cd1010989c..aa472b64d2 100644 --- a/plots/box-basic/metadata/highcharts.yaml +++ b/plots/box-basic/metadata/highcharts.yaml @@ -25,3 +25,175 @@ review: Department and Score - Legend shows Distribution and Outliers which is functional but takes up space without adding much value for this simple plot + image_description: 'The plot displays 5 box-and-whisker plots arranged horizontally + for Groups A through E. Each box is colored distinctly: blue (Group A), yellow + (Group B), purple (Group C), cyan (Group D), and brown (Group E). The title "box-basic + · highcharts · pyplots.ai" appears at the top in bold black text. The X-axis is + labeled "Category" with group names below each box. The Y-axis is labeled "Value" + ranging from 0 to 125. Each box shows quartile ranges with dark median lines. + Outliers are displayed as red circular points - visible for Groups A (one low + outlier around 24), B (one high outlier around 105), C (two outliers around 19 + and 76), and E (one high outlier around 115). The distributions vary noticeably: + Group D has the highest median (~70), Group C has the lowest (~45), and Group + E shows the widest spread. Grid lines are subtle with light gray coloring. The + layout is clean with a white background.' + criteria_checklist: + visual_quality: + score: 36 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 9 + max: 10 + passed: true + comment: Title and axis labels clearly readable, tick labels slightly small + but acceptable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Boxes well-sized, whiskers and outliers clearly visible + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Colorblind-safe palette used (blue, yellow, purple, cyan, brown) + - id: VQ-05 + name: Layout Balance + score: 4 + max: 5 + passed: true + comment: Good proportions, slight excess whitespace at top + - id: VQ-06 + name: Axis Labels + score: 1 + max: 2 + passed: true + comment: Descriptive labels but no units (generic "Value") + - id: VQ-07 + name: Grid & Legend + score: 1 + max: 2 + passed: true + comment: Grid subtle and appropriate, legend present but not essential for + this plot + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct box plot type + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Categories on X-axis, values on Y-axis correctly mapped + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Median lines, quartile boxes, whiskers at 1.5*IQR, outliers as points, + different colors per category + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: Y-axis shows all data including outliers (0-125) + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend shows Distribution and Outliers series + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: 'Correct format: "box-basic · highcharts · pyplots.ai"' + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 8 + max: 8 + passed: true + comment: Shows outliers, different medians, varying IQRs, different whisker + lengths + - id: DQ-02 + name: Realistic Context + score: 5 + max: 7 + passed: true + comment: Generic groups rather than real-world scenario (e.g., departments, + products) + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: Values in reasonable range (0-115), sensible for generic measurements + code_quality: + score: 9 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Linear structure: imports → data → plot → save' + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: np.random.seed(42) set + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: All imports used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Current highcharts-core API + - id: CQ-05 + name: Output Correct + score: 0 + max: 1 + passed: false + comment: Saves plot.png but HTML also saved (minor) + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: true + comment: Uses BoxPlotSeries and ScatterSeries for outliers, colorByPoint, + proper highcharts-more.js integration; could leverage more interactive features + verdict: APPROVED diff --git a/plots/box-basic/metadata/letsplot.yaml b/plots/box-basic/metadata/letsplot.yaml index a653132802..fc6e624747 100644 --- a/plots/box-basic/metadata/letsplot.yaml +++ b/plots/box-basic/metadata/letsplot.yaml @@ -22,3 +22,165 @@ review: - Appropriate text sizes (24pt title, 20pt labels, 16pt ticks) weaknesses: - Grid lines could be slightly more visible (currently very subtle with theme_minimal) + image_description: 'The plot displays 5 box plots showing salary distributions across + departments: Engineering (blue), Marketing (yellow), Sales (red), HR (green), + and Finance (purple). Each box clearly shows the median line, IQR (box), and whiskers + extending to 1.5*IQR. Outliers are displayed as large black dots - visible above + Engineering (~125K, ~137K), Marketing (~107K), Sales (~125K, ~131K), HR (~30K, + ~90K), and Finance (~120K, ~122K). The title "box-basic · letsplot · pyplots.ai" + appears at the top in appropriate size. X-axis labeled "Department" and Y-axis + labeled "Salary ($)" with values ranging from ~20,000 to 140,000. Clean minimal + theme with subtle grid lines. Layout is well-balanced with good proportions.' + criteria_checklist: + visual_quality: + score: 38 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title ~24pt, axis labels ~20pt, tick labels ~16pt - all perfectly + readable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text, category labels well spaced + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Box sizes optimal, outliers clearly visible with size=4 + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Five distinct colors (blue, yellow, red, green, purple) with good + contrast + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Perfect proportions, no cut-off, good use of space + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: 'Descriptive with units: "Salary ($)", "Department"' + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: false + comment: Grid is subtle and good, legend correctly hidden (not needed) - but + grid could be slightly more visible + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct box-and-whisker plot + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Categories on X, values on Y correctly assigned + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Median line ✓, outliers as points ✓, whiskers at 1.5*IQR ✓, different + colors + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: All data visible including outliers + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend hidden appropriately (colors explained by x-axis) + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: 'Correct format: "box-basic · letsplot · pyplots.ai"' + data_quality: + score: 20 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 8 + max: 8 + passed: true + comment: Shows outliers, different spreads (Sales widest, HR narrowest), different + medians + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Salary by department is a real, comprehensible scenario + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: Realistic salary values ($20K-$140K range appropriate for US salaries) + code_quality: + score: 10 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: Simple imports → data → plot → save structure + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: np.random.seed(42) set + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: All imports used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Current lets-plot API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png and plot.html + library_features: + score: 5 + max: 5 + items: [] + verdict: APPROVED diff --git a/plots/box-basic/metadata/matplotlib.yaml b/plots/box-basic/metadata/matplotlib.yaml index 2e79331201..6533d6c53d 100644 --- a/plots/box-basic/metadata/matplotlib.yaml +++ b/plots/box-basic/metadata/matplotlib.yaml @@ -25,3 +25,176 @@ review: use more distinct colors for better differentiation - Performance scores exceed 100 for some outliers which is slightly inconsistent if interpreting as percentage scores + image_description: 'The plot displays a box-and-whisker chart with 4 departments + (Engineering, Marketing, Sales, Support) on the x-axis and Performance Score on + the y-axis (ranging from ~20 to ~130). Each department has a distinct colored + box: Engineering in steel blue (#306998), Marketing in yellow (#FFD43B), Sales + in lighter blue (#4B8BBE), and Support in orange (#E8A838). The boxes show median + lines, quartile boxes, and whiskers extending to 1.5*IQR. Outliers are visible + as gray circular points - Engineering has one low outlier (~43), Marketing has + one high outlier (~104), and Sales has three outliers (one very high at ~127, + one at ~104, and one very low at ~21). The title "box-basic · matplotlib · pyplots.ai" + appears at the top. A subtle horizontal grid with dashed lines aids readability.' + criteria_checklist: + visual_quality: + score: 37 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title at 24pt, axis labels at 20pt, tick labels at 16pt - all perfectly + readable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Boxes well-sized, outliers clearly visible with appropriate marker + size + - id: VQ-04 + name: Color Accessibility + score: 4 + max: 5 + passed: true + comment: Colors are distinguishable but blue shades (Engineering/Sales) are + somewhat similar + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Good proportions, proper use of tight_layout + - id: VQ-06 + name: Axis Labels + score: 1 + max: 2 + passed: true + comment: Descriptive labels but no units (Performance Score could have units) + - id: VQ-07 + name: Grid & Legend + score: 1 + max: 2 + passed: true + comment: Grid subtle at alpha=0.3, y-axis only which is appropriate; no legend + needed for this plot type + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct box-and-whisker plot + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Categories on X, values on Y correctly assigned + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Median line, quartile boxes, whiskers at 1.5*IQR, outliers shown, + different colors per category + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: All data visible including outliers + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: No legend needed; category labels serve this purpose + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: Uses exact format "box-basic · matplotlib · pyplots.ai" + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 7 + max: 8 + passed: true + comment: Shows outliers, different distributions (narrow for Marketing, wide + for Sales), varying medians; could show more extreme differences + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Department performance scores is a realistic, comprehensible scenario + - id: DQ-03 + name: Appropriate Scale + score: 4 + max: 5 + passed: true + comment: Scores in 20-130 range; some outliers above 100 are slightly unrealistic + for a 0-100 score context + code_quality: + score: 10 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Simple linear flow: imports → data → plot → save' + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Uses np.random.seed(42) + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: Only matplotlib and numpy imported, both used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses tick_labels instead of deprecated labels parameter + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png + library_features: + score: 2 + max: 5 + items: + - id: LF-01 + name: Distinctive Features + score: 2 + max: 5 + passed: false + comment: Uses patch_artist for filled boxes and customizes flierprops/medianprops/whiskerprops, + but does not use more advanced matplotlib features like violin overlays + or swarm points + verdict: APPROVED diff --git a/plots/box-basic/metadata/plotly.yaml b/plots/box-basic/metadata/plotly.yaml index 924b112c7b..d110584c1a 100644 --- a/plots/box-basic/metadata/plotly.yaml +++ b/plots/box-basic/metadata/plotly.yaml @@ -26,3 +26,177 @@ review: - The $5k outlier in Sales is unrealistically low for annual salary data - Does not leverage Plotly-specific features like custom hover templates or quartile annotations + image_description: 'The plot displays 5 box plots showing salary distributions across + departments (Engineering, Marketing, Sales, HR, Finance). Each box uses a different + color: Engineering (muted blue), Marketing (yellow), Sales (blue), HR (light yellow), + Finance (gray). The title "box-basic · plotly · pyplots.ai" is centered at the + top. The Y-axis shows "Annual Salary ($)" with values ranging from $0 to $140,000, + formatted with dollar signs and commas. The X-axis shows "Department" with 5 category + labels. Each box shows the median line, quartile box, and whiskers. Outliers are + visible as individual points - notably two outliers in Sales (one very high ~$147k, + one very low ~$5k) and one in Engineering (~$57k). The background is clean white + with subtle horizontal gridlines.' + criteria_checklist: + visual_quality: + score: 37 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title at 32pt, axis labels at 24pt, tick fonts at 20pt - all clearly + readable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements, category labels well-spaced + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Box plots well-sized with clear median lines, whiskers, and visible + outlier points + - id: VQ-04 + name: Color Accessibility + score: 4 + max: 5 + passed: true + comment: Colors are distinguishable, though yellow boxes (Marketing, HR) are + somewhat similar + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Good proportions, adequate margins, no cut-off content + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: Y-axis has "Annual Salary ($)" with unit, X-axis has "Department" + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: true + comment: Grid is subtle (good), but no legend present (acceptable since showlegend=False + and colors are decorative) + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct box plot type + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Categories on X-axis, values on Y-axis + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Median line shown, outliers displayed as points, whiskers present, + different colors per category + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: Full data range shown including outliers + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend disabled appropriately (categories labeled on x-axis) + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: Correct format "box-basic · plotly · pyplots.ai" + data_quality: + score: 19 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 8 + max: 8 + passed: true + comment: Shows outliers (especially in Sales), different distributions (Engineering + highest, HR lowest), varying spreads (Sales widest, HR narrowest) + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Salary by department is a real, comprehensible scenario with plausible + relationships + - id: DQ-03 + name: Appropriate Scale + score: 4 + max: 5 + passed: true + comment: Mostly realistic salaries, though the $5k outlier in Sales is unrealistically + low for annual salary + code_quality: + score: 10 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Simple linear structure: imports → data → plot → save' + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: np.random.seed(42) is set + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: Only numpy and plotly.graph_objects used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Current API usage + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png and plot.html + library_features: + score: 0 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 0 + max: 5 + passed: false + comment: Basic go.Box usage without leveraging Plotly-specific features like + hover templates, annotations, or interactive elements that would be visible + in the HTML output + verdict: APPROVED diff --git a/plots/box-basic/metadata/plotnine.yaml b/plots/box-basic/metadata/plotnine.yaml index 77d4c10d0e..8a8ef120b0 100644 --- a/plots/box-basic/metadata/plotnine.yaml +++ b/plots/box-basic/metadata/plotnine.yaml @@ -24,3 +24,171 @@ review: - No subtle grid lines to aid value reading (theme_minimal removes them by default) - Y-axis starting at 0 creates unnecessary whitespace since no salaries are near zero + image_description: 'The plot displays a box-and-whisker chart showing salary distributions + across four departments (Engineering, Marketing, Sales, Support). Each department + has a distinctly colored box: Engineering (coral/salmon), Marketing (olive green), + Sales (cyan/turquoise), and Support (purple/violet). The boxes show median lines, + quartiles, and whiskers extending to 1.5×IQR. Outliers are visible as individual + gray points above several boxes (Engineering, Marketing, Sales, Support). The + title "box-basic · plotnine · pyplots.ai" appears at the top. X-axis labeled "Department" + and Y-axis labeled "Salary ($)" with values ranging from 0 to 150000.' + criteria_checklist: + visual_quality: + score: 36 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title, axis labels, and tick labels are all clearly readable at appropriate + sizes + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Box plots are well-sized, outliers visible with appropriate alpha + - id: VQ-04 + name: Color Accessibility + score: 4 + max: 5 + passed: true + comment: Colors are distinguishable but not from a standard colorblind-safe + palette + - id: VQ-05 + name: Layout Balance + score: 4 + max: 5 + passed: true + comment: Good proportions, minor whitespace at bottom left + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: Descriptive labels with units ("Salary ($)", "Department") + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: true + comment: No visible grid, legend hidden (acceptable since categories on x-axis) + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct box-and-whisker plot + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Categories on X, values on Y correctly + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Median lines, quartiles, whiskers at 1.5×IQR, outliers as points, + different colors per category + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: All data visible within axes + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend appropriately hidden (categories shown on x-axis) + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: Correct format "box-basic · plotnine · pyplots.ai" + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 7 + max: 8 + passed: true + comment: Shows different distributions, outliers present, varying spreads; + could show more outlier variety + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Salary by department is a real, comprehensible business scenario + - id: DQ-03 + name: Appropriate Scale + score: 4 + max: 5 + passed: true + comment: Salary values are realistic; y-axis starting at 0 creates some empty + space + code_quality: + score: 9 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: Simple imports → data → plot → save structure + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: np.random.seed(42) set + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: Only necessary imports used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Modern plotnine API + - id: CQ-05 + name: Output Correct + score: 0 + max: 1 + passed: false + comment: verbose=False is non-standard parameter + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: true + comment: Uses ggplot grammar correctly with geom_boxplot, theme_minimal, element_text + customization; could leverage scale_fill_brewer for better palettes + verdict: APPROVED diff --git a/plots/box-basic/metadata/pygal.yaml b/plots/box-basic/metadata/pygal.yaml index 8bc8379672..977bfd040c 100644 --- a/plots/box-basic/metadata/pygal.yaml +++ b/plots/box-basic/metadata/pygal.yaml @@ -22,3 +22,171 @@ review: - Legend box size is small relative to the large chart dimensions, making it less prominent - Outlier markers could be slightly larger for better visibility at this resolution + image_description: 'The plot displays a box plot (box-and-whisker) showing salary + distributions across 5 departments: Engineering (blue), Marketing (yellow), Sales + (green), Operations (orange), and HR (purple). Each department has a distinct + colored box showing the interquartile range with a median line. Whiskers extend + to show the data range, and outliers are displayed as small dots outside the whiskers. + The title "box-basic · pygal · pyplots.ai" appears at the top. The y-axis shows + "Salary ($)" ranging from 0 to ~135,000, and the x-axis label "Department" appears + at the bottom. A legend at the bottom identifies each department color. The background + is white with subtle horizontal grid lines.' + criteria_checklist: + visual_quality: + score: 36 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 9 + max: 10 + passed: true + comment: Title and axis labels are readable, though tick labels could be slightly + larger + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements + - id: VQ-03 + name: Element Visibility + score: 7 + max: 8 + passed: true + comment: Boxes are clearly visible, outlier dots are small but distinguishable + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Uses distinct colors that are colorblind-safe (blue, yellow, green, + orange, purple) + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Good proportions with legend at bottom, appropriate margins + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: Y-axis has "Salary ($)" with units, X-axis has "Department" + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: true + comment: Grid is subtle but legend box sizes appear small relative to the + chart + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct box plot type + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Categories on x-axis, values on y-axis correctly + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Shows median, quartiles, whiskers, and outliers as specified + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: Y-axis shows full range including outliers + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend correctly identifies all 5 departments + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: Uses correct format "box-basic · pygal · pyplots.ai" + data_quality: + score: 20 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 8 + max: 8 + passed: true + comment: Shows different distributions, varying spreads, and outliers in Engineering + and Sales + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Salary by department is a realistic, relatable scenario + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: Salary values ($40k-$135k) are realistic for department salaries + code_quality: + score: 10 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Simple linear structure: imports → data → plot → save' + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Uses np.random.seed(42) + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: Only numpy, pygal, and Style are imported + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current pygal API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png and plot.html + library_features: + score: 0 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 0 + max: 5 + passed: false + comment: Uses box_mode="tukey" which is good, but could leverage more pygal-specific + styling or interactivity features + verdict: APPROVED diff --git a/plots/box-basic/metadata/seaborn.yaml b/plots/box-basic/metadata/seaborn.yaml index 7b6c0e1ffe..c0bcec957a 100644 --- a/plots/box-basic/metadata/seaborn.yaml +++ b/plots/box-basic/metadata/seaborn.yaml @@ -23,3 +23,171 @@ review: - Does not leverage seaborn distinctive features like stripplot overlay, violin plots, or statistical annotations - Yellow color for Marketing category could have slightly better contrast + image_description: 'The plot displays a box-and-whisker chart showing salary distributions + across 5 departments (Engineering, Marketing, Sales, HR, Finance). Each department + has a distinctly colored box: Engineering (blue), Marketing (yellow/gold), Sales + (green), HR (orange), and Finance (purple). The y-axis shows "Salary ($)" ranging + from approximately $20K to $160K with currency formatting. The x-axis shows "Department" + labels. Each box clearly displays the median line, quartile boundaries, whiskers + extending to 1.5*IQR, and outliers shown as hollow circles. The title correctly + reads "box-basic · seaborn · pyplots.ai". A subtle dashed horizontal grid helps + with value reading. The layout is clean with good proportions.' + criteria_checklist: + visual_quality: + score: 38 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title at 24pt, labels at 20pt, ticks at 16pt - all perfectly readable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements, all labels clear + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Boxes well-sized (width=0.6), outliers clearly visible (fliersize=10) + - id: VQ-04 + name: Color Accessibility + score: 4 + max: 5 + passed: true + comment: Distinct colors for each category, though yellow may be slightly + harder to see + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Good proportions, proper use of tight_layout + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: '"Salary ($)" with unit indicator, "Department" descriptive' + - id: VQ-07 + name: Grid & Legend + score: 1 + max: 2 + passed: true + comment: Grid subtle (alpha=0.3), but y-axis only; no legend needed as colors + are self-explanatory + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct box plot implementation + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Categories on X, values on Y correctly assigned + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Median line, quartile box, whiskers at 1.5*IQR, outliers as points, + different colors per category + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: Y-axis shows all data including outliers + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: No legend needed; category colors match x-axis labels + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: Correct format "box-basic · seaborn · pyplots.ai" + data_quality: + score: 20 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 8 + max: 8 + passed: true + comment: Shows different distributions (Engineering high/tight, Sales wide + spread, HR lower/tight), multiple outliers visible + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Salary by department is a real, comprehensible scenario + - id: DQ-03 + name: Appropriate Scale + score: 5 + max: 5 + passed: true + comment: Salary ranges $40K-$160K are realistic for US corporate salaries + code_quality: + score: 10 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: Imports → Data → Plot → Save structure, no functions/classes + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: np.random.seed(42) set + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: Only matplotlib, numpy, pandas, seaborn - all used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses hue with palette to avoid seaborn 0.14+ warning + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png + library_features: + score: 0 + max: 5 + items: + - id: LF-01 + name: Distinctive Features + score: 0 + max: 5 + passed: false + comment: Uses sns.boxplot which is basic; could have used violin overlay, + swarmplot, or statistical annotations + verdict: APPROVED diff --git a/plots/box-grouped/metadata/altair.yaml b/plots/box-grouped/metadata/altair.yaml index 3ae037c02d..7477358945 100644 --- a/plots/box-grouped/metadata/altair.yaml +++ b/plots/box-grouped/metadata/altair.yaml @@ -25,3 +25,178 @@ review: plot area - Grid styling uses gridDash which works but default subtle grid might be cleaner - Could add tooltips for interactivity since Altair excels at this + image_description: 'The plot displays a grouped box plot comparing employee performance + scores across four departments (Engineering, Marketing, Sales, Support). Within + each department, three side-by-side box plots represent experience levels: Junior + (deep blue #306998), Mid (yellow #FFD43B), and Senior (teal #4ECDC4). The y-axis + shows "Performance Score (%)" ranging from 0 to 105. Each box plot shows the median + (white horizontal line), interquartile range (box), whiskers extending to ~1.5×IQR, + and outliers as hollow circles. A legend on the right identifies the experience + levels. The title "box-grouped · altair · pyplots.ai" is centered at the top. + The plot demonstrates clear progression where Senior employees consistently score + higher than Mid, who score higher than Junior across all departments.' + criteria_checklist: + visual_quality: + score: 37 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title at 28pt, axis labels at 22pt, tick labels at 18pt - all perfectly + readable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements, all labels clearly separated + - id: VQ-03 + name: Element Visibility + score: 7 + max: 8 + passed: true + comment: Box plots well-sized (size=60), outliers visible (size=80), slight + deduction as some boxes could be slightly wider for better distinction + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Blue/yellow/teal palette is colorblind-safe, good contrast + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Plot fills canvas well, balanced margins, legend well-positioned + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: '"Performance Score (%)" includes units, "Department" is descriptive' + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: true + comment: Grid is subtle (alpha 0.3, dashed), but legend is positioned far + from the data in isolated space on the right + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct grouped box plot implementation + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Department on x-axis, Performance Score on y-axis, Experience Level + for grouping + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Side-by-side boxes, distinct colors, legend present, median lines, + whiskers, outliers all shown + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: Y-axis shows 0-105, capturing all data including outliers + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend correctly identifies Junior, Mid, Senior + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: Uses exact format "box-grouped · altair · pyplots.ai" + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 7 + max: 8 + passed: true + comment: Shows varied distributions, different medians, spreads, and outliers; + slight deduction as outliers appear in limited positions + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Employee performance scores by department and experience is a real, + comprehensible business scenario + - id: DQ-03 + name: Appropriate Scale + score: 4 + max: 5 + passed: true + comment: Performance scores 0-100 are realistic; minor deduction as some distributions + seem slightly compressed at the top (clipping at 100) + code_quality: + score: 9 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: 'Linear structure: imports → data → plot → save' + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Uses np.random.seed(42) + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: Only altair, numpy, pandas - all used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current Altair API + - id: CQ-05 + name: Output Correct + score: 0 + max: 1 + passed: false + comment: Saves as plot.png but also saves plot.html (minor, but only png requested + for this review) + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: true + comment: Uses Altair's declarative encoding with xOffset for grouping, mark_boxplot + with customization (median stroke, outlier size), but could leverage more + interactive features or tooltips + verdict: APPROVED diff --git a/plots/box-grouped/metadata/bokeh.yaml b/plots/box-grouped/metadata/bokeh.yaml index c37755012b..0905747eca 100644 --- a/plots/box-grouped/metadata/bokeh.yaml +++ b/plots/box-grouped/metadata/bokeh.yaml @@ -28,3 +28,176 @@ review: - One outlier value (105) slightly exceeds typical 100-point performance scale - Could leverage more Bokeh-specific interactive features (HoverTool would enhance the plot) + image_description: 'The plot displays a grouped box plot comparing employee performance + scores across 4 departments (Sales, Engineering, Marketing, Support) with 3 experience + levels (Junior in blue #306998, Senior in yellow #FFD43B, Lead in teal #4ECDC4). + Each department shows 3 side-by-side box plots with clear median lines, IQR boxes, + whiskers extending to 1.5×IQR, and outliers displayed as colored circles. The + title "box-grouped · bokeh · pyplots.ai" is centered at the top. A legend on the + right side clearly identifies the subcategories. The grid uses subtle dashed lines + with low alpha. Notable outliers appear in Engineering Lead (~38, ~58) and Support + Lead (~65-69). The y-axis ranges from 30-110 showing Performance Score, and all + text is clearly readable.' + criteria_checklist: + visual_quality: + score: 36 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title at 36pt, axis labels at 28pt, tick labels at 22pt - all perfectly + readable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text, boxes well-spaced within groups + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Box widths and outlier markers appropriately sized for the data density + - id: VQ-04 + name: Color Accessibility + score: 4 + max: 5 + passed: true + comment: Blue/Yellow/Teal palette is colorblind-friendly, though contrast + between yellow boxes and white background could be slightly better + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Plot fills canvas well, balanced margins, legend well-positioned + - id: VQ-06 + name: Axis Labels + score: 1 + max: 2 + passed: true + comment: Descriptive labels ("Department", "Performance Score") but no units + - id: VQ-07 + name: Grid & Legend + score: 2 + max: 2 + passed: true + comment: Subtle dashed grid with alpha 0.3, legend well-placed on right + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct grouped box plot type + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Categories on x-axis, values on y-axis, subcategories as groups + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Shows median, quartiles, whiskers at 1.5×IQR, outliers, distinct + colors, legend + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: Y-axis 30-110 shows all data including outliers + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend correctly identifies Junior/Senior/Lead + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: Correct format "box-grouped · bokeh · pyplots.ai" + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 7 + max: 8 + passed: true + comment: 'Shows outliers, different medians, varying spreads across groups + - minor: could show more dramatic distribution differences' + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Employee performance scores by department and experience level is + a real, comprehensible HR scenario + - id: DQ-03 + name: Appropriate Scale + score: 4 + max: 5 + passed: true + comment: Performance scores 40-100 are realistic; the 105 outlier slightly + exceeds typical 100-point scales + code_quality: + score: 9 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 2 + max: 3 + passed: true + comment: Has a helper function `calc_boxplot_stats` which deviates from pure + KISS, but it's reasonable for box plot calculations + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Uses `np.random.seed(42)` + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: All imports are used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Current Bokeh API + - id: CQ-05 + name: Output Correct + score: 1 + max: 1 + passed: true + comment: Saves as plot.png + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: true + comment: Uses ColumnDataSource, figure with proper categorical x_range, vbar + for boxes, segment for whiskers. Good usage but could leverage more Bokeh-specific + features like HoverTool for interactivity + verdict: APPROVED diff --git a/plots/box-grouped/metadata/highcharts.yaml b/plots/box-grouped/metadata/highcharts.yaml index 9543cd5012..e84a16f489 100644 --- a/plots/box-grouped/metadata/highcharts.yaml +++ b/plots/box-grouped/metadata/highcharts.yaml @@ -23,3 +23,180 @@ review: (no functions/classes rule) - Outliers are not displayed as separate points (spec requests outliers to be shown) - Legend could be positioned closer to the chart area + image_description: 'The plot displays a grouped box plot visualization with 4 department + categories (Engineering, Sales, Marketing, Finance) on the x-axis and Performance + Score (range 20-100) on the y-axis. Each department contains 3 side-by-side box + plots colored distinctly: blue (Junior), yellow (Mid-Level), and purple (Senior). + The title correctly reads "box-grouped · highcharts · pyplots.ai" in bold black + text with a gray subtitle "Employee Performance Scores by Department and Experience + Level". A vertical legend in the top-right identifies the three experience levels. + All boxes show clear median lines (black), quartile boxes with fill colors matching + the legend, and whiskers extending to data bounds. The distributions vary meaningfully + across groups - e.g., Sales Junior has a wide spread down to ~36, while Finance + Senior reaches up to 100.' + criteria_checklist: + visual_quality: + score: 36 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 9 + max: 10 + passed: true + comment: Title, subtitle, axis labels, and tick marks are all clearly readable. + Font sizes are appropriate for 4800x2700 canvas. + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text elements. Category labels are well-spaced, legend + doesn't overlap data. + - id: VQ-03 + name: Element Visibility + score: 7 + max: 8 + passed: true + comment: Box plots are clearly visible with good line widths. Boxes could + be slightly wider for optimal visibility. + - id: VQ-04 + name: Color Accessibility + score: 5 + max: 5 + passed: true + comment: Blue, yellow, purple palette is colorblind-safe. No red-green conflicts. + - id: VQ-05 + name: Layout Balance + score: 4 + max: 5 + passed: true + comment: Good use of canvas space. Slight excess whitespace at bottom due + to y-axis starting at 20. + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: '"Department" and "Performance Score" are descriptive labels.' + - id: VQ-07 + name: Grid & Legend + score: 1 + max: 2 + passed: true + comment: Grid is subtle. Legend placement is good but could be closer to the + chart. + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct grouped box plot implementation + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Categories on x-axis, values on y-axis, subcategories as grouped + series + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Side-by-side boxes, distinct colors, legend, median/quartile/whiskers + shown + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: Y-axis 20-100 shows all data appropriately + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend correctly identifies Junior, Mid-Level, Senior + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: 'Correct format: "box-grouped · highcharts · pyplots.ai"' + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 7 + max: 8 + passed: true + comment: Shows varied distributions, different medians, spread differences. + Missing explicit outliers beyond whiskers. + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Employee performance by department/experience is a highly realistic + business scenario + - id: DQ-03 + name: Appropriate Scale + score: 4 + max: 5 + passed: true + comment: Performance scores 20-100 are reasonable. Some extreme values at + boundaries (100) are slightly artificial. + code_quality: + score: 7 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 1 + max: 3 + passed: false + comment: Contains a helper function `calc_boxplot_stats()` which violates + KISS principle + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Uses `np.random.seed(42)` + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: All imports are used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current Highcharts API + - id: CQ-05 + name: Output Correct + score: 0 + max: 1 + passed: true + comment: Saves as plot.png + library_features: + score: 5 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 5 + max: 5 + passed: true + comment: Properly uses BoxPlotSeries, Highcharts styling options, inline JS + embedding for Selenium rendering + verdict: APPROVED diff --git a/plots/box-grouped/metadata/letsplot.yaml b/plots/box-grouped/metadata/letsplot.yaml index c0673e2cf2..5c1b382d23 100644 --- a/plots/box-grouped/metadata/letsplot.yaml +++ b/plots/box-grouped/metadata/letsplot.yaml @@ -28,3 +28,175 @@ review: - minor label inconsistency - Does not leverage lets-plot interactive features in the HTML export (tooltips would enhance the visualization) + image_description: 'The plot displays a grouped box plot with 4 departments (Engineering, + Marketing, Sales, Operations) on the x-axis and Performance Score (%) on the y-axis + ranging from approximately 20 to 110. Within each department, there are 3 side-by-side + box plots representing experience levels: Junior (blue #306998), Mid-Level (yellow + #FFD43B), and Senior (green #4CAF50). The boxes show clear median lines, quartile + boxes, whiskers, and outliers displayed as gray circles. The title reads "box-grouped + · letsplot · pyplots.ai" in bold at the top. A legend on the right identifies + the three experience levels. The plot uses a minimal theme with a light gray background + and subtle grid lines.' + criteria_checklist: + visual_quality: + score: 37 + max: 40 + items: + - id: VQ-01 + name: Text Legibility + score: 10 + max: 10 + passed: true + comment: Title is large and bold (28pt), axis labels are 22pt, tick labels + are 18pt, all perfectly readable + - id: VQ-02 + name: No Overlap + score: 8 + max: 8 + passed: true + comment: No overlapping text, all labels clear and distinct + - id: VQ-03 + name: Element Visibility + score: 8 + max: 8 + passed: true + comment: Box plots are well-sized with appropriate alpha (0.85), outliers + are visible with size=3 + - id: VQ-04 + name: Color Accessibility + score: 4 + max: 5 + passed: true + comment: Colors are distinguishable (blue, yellow, green) but blue-green could + be slightly problematic for some colorblind users + - id: VQ-05 + name: Layout Balance + score: 5 + max: 5 + passed: true + comment: Good use of canvas space, plot is well-centered with balanced margins + - id: VQ-06 + name: Axis Labels + score: 2 + max: 2 + passed: true + comment: Y-axis has "Performance Score (%)" with units, X-axis has "Department" + - id: VQ-07 + name: Grid & Legend + score: 0 + max: 2 + passed: false + comment: Grid is present but legend title says "Experience Level" while legend + fill label in code says "fill" - minor inconsistency + spec_compliance: + score: 25 + max: 25 + items: + - id: SC-01 + name: Plot Type + score: 8 + max: 8 + passed: true + comment: Correct grouped box plot with side-by-side boxes + - id: SC-02 + name: Data Mapping + score: 5 + max: 5 + passed: true + comment: Categories on X, values on Y, subcategories as fill color + - id: SC-03 + name: Required Features + score: 5 + max: 5 + passed: true + comment: Shows median, quartiles, whiskers, and outliers as specified + - id: SC-04 + name: Data Range + score: 3 + max: 3 + passed: true + comment: All data visible including outliers + - id: SC-05 + name: Legend Accuracy + score: 2 + max: 2 + passed: true + comment: Legend correctly identifies Junior, Mid-Level, Senior + - id: SC-06 + name: Title Format + score: 2 + max: 2 + passed: true + comment: Correctly formatted as "box-grouped · letsplot · pyplots.ai" + data_quality: + score: 18 + max: 20 + items: + - id: DQ-01 + name: Feature Coverage + score: 7 + max: 8 + passed: true + comment: 'Shows outliers, different distributions, varying medians and spreads + across groups. Minor deduction: some distributions very similar' + - id: DQ-02 + name: Realistic Context + score: 7 + max: 7 + passed: true + comment: Employee performance scores by department and experience level is + a realistic HR scenario + - id: DQ-03 + name: Appropriate Scale + score: 4 + max: 5 + passed: true + comment: Performance scores 20-110% - scores over 100% are slightly unusual + for a percentage metric + code_quality: + score: 9 + max: 10 + items: + - id: CQ-01 + name: KISS Structure + score: 3 + max: 3 + passed: true + comment: Clean imports → data → plot → save structure, no functions/classes + - id: CQ-02 + name: Reproducibility + score: 3 + max: 3 + passed: true + comment: Uses np.random.seed(42) + - id: CQ-03 + name: Clean Imports + score: 2 + max: 2 + passed: true + comment: All imports are used + - id: CQ-04 + name: No Deprecated API + score: 1 + max: 1 + passed: true + comment: Uses current lets-plot API + - id: CQ-05 + name: Output Correct + score: 0 + max: 1 + passed: false + comment: Saves to "plot.png" but path="." is unusual (should work but non-standard) + library_features: + score: 3 + max: 5 + items: + - id: LF-01 + name: Uses distinctive library features + score: 3 + max: 5 + passed: false + comment: Uses lets-plot grammar of graphics appropriately with theme_minimal, + scale_fill_manual, but doesn't leverage unique lets-plot features like interactive + tooltips in HTML output + verdict: APPROVED diff --git a/plots/box-grouped/metadata/matplotlib.yaml b/plots/box-grouped/metadata/matplotlib.yaml index 1417f2818d..3434943416 100644 --- a/plots/box-grouped/metadata/matplotlib.yaml +++ b/plots/box-grouped/metadata/matplotlib.yaml @@ -26,3 +26,172 @@ review: - Data pattern is quite uniform across departments (all show same Junior