--- name: Implement Static Graph Question description: Create D3 questions with static line graphs and coordinating table inputs. Students read graphs and fill in corresponding values. --- # Implement Static Graph Question Use this skill when creating questions where students: - Read a static line graph showing a relationship - Fill in table values based on the graph - Explain patterns or relationships shown in the graph ## When to Use This Pattern **Perfect for:** - "Use the graph to complete the table" - "Read the graph and fill in missing values" - Proportional relationship questions with visual representation - Rate/slope questions with coordinate visualization **Not suitable for:** - Interactive graph manipulation (use dynamic graph component when available) - Simple tables without graphs → use [implement-table-question](../implement-table-question/SKILL.md) - Drag-and-drop matching → use [implement-drag-match-question](../implement-drag-match-question/SKILL.md) ## Components Required **Copy these from** `.claude/skills/question-types/snippets/`: ### Required - `static-graph.js` → `renderStaticGraph()` - NEW! Static graph component - `cards/standard-card.js` → `createStandardCard()` ### Optional - `cards/explanation-card.js` → `createExplanationCard()` - For student explanations - `cards/video-accordion.js` → `createVideoAccordion()` - For help videos - `tables.js` → For custom table rendering (or use HTML tables) ## Quick Start 1. **Study the working example**: ```bash cat courses/IM-8th-Grade/modules/Unit-3/assignments/Ramp-Up-01/questions/02/attachments/chart.js ``` 2. **Copy the static-graph component** from [snippets/static-graph.js](../snippets/static-graph.js) 3. **Use the pattern below** to render graph + table ## Key Implementation Decisions 1. **Graph configuration** - X/Y domains, labels, grid spacing 2. **Line data** - What relationship does the graph show? 3. **Table structure** - Which values are editable? 4. **State fields** - One field per editable table cell ## State Shape ```javascript function createDefaultState() { return { // One field per editable table cell cell1: "", cell2: "", cell3: "", cell4: "", explanation: "" }; } ``` ## Core Pattern ### 1. Define Graph Configuration ```javascript // Graph data const RATE = 20; // $20 per day const MAX_DAYS = 10; const MAX_MONEY = 200; const graphConfig = { width: 600, height: 400, padding: { top: 40, right: 40, bottom: 60, left: 70 }, xDomain: [0, MAX_DAYS], yDomain: [0, MAX_MONEY], xLabel: "Days", yLabel: "Money Earned ($)", xVariable: "d", // Variable label (optional) yVariable: "m", // Variable label (optional) lineData: [ { x: 0, y: 0 }, { x: MAX_DAYS, y: MAX_DAYS * RATE } ], xGridStep: 1, yGridStep: 20, showArrow: true }; ``` ### 2. Render Graph ```javascript function buildLayout(d3, containerSelector) { const container = d3.select(containerSelector); container.html("").style("padding", "20px").style("overflow", "auto"); // Intro card const introCard = createStandardCard(d3, container, { size: "large", title: "Read the Graph" }); introCard.append("p").text("Use the graph to complete the table below."); // Graph card const graphCard = createStandardCard(d3, container, { size: "graph", title: "Sarah's Earnings" }); const svg = graphCard.append("svg"); renderStaticGraph(d3, svg, graphConfig); // Table and explanation below... renderTable(d3, container); renderExplanation(d3, container); } ``` ### 3. Render Table with Inputs ```javascript function renderTable(d3, container) { const tableCard = createStandardCard(d3, container, { size: "medium", title: "Complete the Table" }); // HTML table approach (simpler) const tableHtml = `
Days Money ($)
1
3
`; tableCard.html(tableCard.html() + tableHtml); // Bind input events input1 = tableCard.select("#day1") .property("value", chartState.day1) .on("input", function() { chartState.day1 = this.value; sendChartState(); }); input3 = tableCard.select("#day3") .property("value", chartState.day3) .on("input", function() { chartState.day3 = this.value; sendChartState(); }); } ``` ### 4. Message Protocol ```javascript function sendChartState() { sendMessage("response_updated", { tableValues: { day1: chartState.day1, day3: chartState.day3, // ... other table values }, explanation: { text: chartState.explanation } }); } ``` ## Working Examples **In codebase:** - [IM-8th-Grade Ramp-Up-01 Q02](../../../../../courses/IM-8th-Grade/modules/Unit-3/assignments/Ramp-Up-01/questions/02/attachments/chart.js) - Complete example with graph + table **Key features shown:** - Static line graph with grid - Arrowhead at end of line - Variable labels (d, m) - Table with 4 editable cells - Explanation card - Video accordion for help ## Common Variations ### Two-Column Layout (Graph + Table Side-by-Side) ```javascript const layout = container.append("div") .style("display", "grid") .style("grid-template-columns", "1fr 1fr") .style("gap", "20px"); const leftColumn = layout.append("div"); const rightColumn = layout.append("div"); // Graph in left column const svg = leftColumn.append("svg"); renderStaticGraph(d3, svg, graphConfig); // Table in right column renderTable(d3, rightColumn); ``` ### Different Graph Types **Horizontal line (constant value):** ```javascript lineData: [ { x: 0, y: 50 }, { x: 10, y: 50 } ] ``` **Non-linear relationship:** ```javascript lineData: Array.from({length: 11}, (_, i) => ({ x: i, y: i * i // Quadratic })) ``` ### D3 Table Instead of HTML See [snippets/tables.js](../snippets/tables.js) for D3 table patterns with custom styling. ## Static Graph Component API The `renderStaticGraph()` function accepts these options: ```javascript renderStaticGraph(d3, svg, { // Size width: 600, // SVG width height: 400, // SVG height padding: { top: 40, right: 40, bottom: 60, left: 70 }, // Domains xDomain: [0, 10], // X-axis min/max yDomain: [0, 200], // Y-axis min/max // Labels xLabel: "Days", // X-axis label yLabel: "Money ($)", // Y-axis label xVariable: "d", // X variable (optional, italic) yVariable: "m", // Y variable (optional, italic) // Line data lineData: [ // Array of {x, y} points { x: 0, y: 0 }, { x: 10, y: 200 } ], // Grid xGridStep: 1, // Vertical grid line spacing yGridStep: 20, // Horizontal grid line spacing // Axes xTicks: 10, // Number of X-axis ticks (optional) yTicks: 10, // Number of Y-axis ticks // Line styling showArrow: true, // Show arrowhead at end lineColor: "#3b82f6", // Line color lineWidth: 2.5 // Line stroke width }); ``` ## Implementation Checklist - [ ] Copied `renderStaticGraph()` from snippets/static-graph.js - [ ] Defined graph configuration (domains, labels, line data) - [ ] Created SVG and called `renderStaticGraph()` - [ ] Created table with editable cells (HTML or D3) - [ ] Created `createDefaultState()` with one field per editable cell - [ ] Bound input events to update state - [ ] Implemented `sendChartState()` with tableValues - [ ] Added explanation card (if needed) - [ ] Implemented `setInteractivity()` to disable inputs when locked - [ ] Implemented `applyInitialState()` to restore table values - [ ] Tested state restoration - [ ] Tested locking/unlocking - [ ] Verified graph renders correctly at different screen sizes ## Tips 1. **Match table to graph** - Table values should correspond to visible points on the graph 2. **Use grid lines** - Help students read values accurately 3. **Label clearly** - Both axis labels and variable labels aid comprehension 4. **Provide context** - Intro card should explain the scenario 5. **Consider layout** - Side-by-side works well on desktop, stacked better on mobile 6. **Test readability** - Ensure graph is readable at different sizes (viewBox helps!) ## Graph Design Best Practices - **Choose appropriate domains** - Don't make graph too cramped or too sparse - **Use consistent grid spacing** - Makes values easier to read - **Add arrowheads** - Shows the line continues beyond the visible domain - **Include units** - Label axes with units (e.g., "Days", "Money ($)") - **Variable labels optional** - Use when teaching function notation (e.g., m = f(d)) ## Related Skills - [implement-table-question](../implement-table-question/SKILL.md) - For tables without graphs - [implement-slider-question](../implement-slider-question/SKILL.md) - For interactive parameter exploration - [create-d3-question](../../create-d3-question/SKILL.md) - Parent workflow skill ## Additional Resources - [snippets/static-graph.js](../snippets/static-graph.js) - Static graph component - [snippets/tables.js](../snippets/tables.js) - D3 table patterns - [snippets/cards/](../snippets/cards/) - Card components