Workshop two of five. Steps up from the bar chart to three overlapping series — where vision LLMs swap series and produce confidently wrong output. Calibrated handles it the same as a single line: one series at a time.
The practice chart

Open this chart in DataFromChart →
Three product lines (A blue, B green, C orange) monthly over a year. 36 points. Y-axis “units sold (thousands)” 0-130; x-axis Jan-Dec.
Target: three series, twelve (month, value) pairs each.
The trick: extract one series at a time
Finish one series completely before starting the next. All twelve Product A points first, then Product B. Don’t interleave.
Why: with all series in one extraction, it’s easy to lose track of which point belongs to which — especially at crossings. The data layer can’t separate them after the fact.
DataFromChart supports per-series extraction natively: three points groups, series name as label.
Step 1: open the chart and create the first series
Open the chart, advance to POINTS, create a group “Product A”. The app defaults to blue — usually matches.
Step 2: place Product A points
Click each of the twelve blue-line points left to right. Zoom in — land on the marker.
Twelve clicks. Blue points should sit on top of the blue data.
Step 3: calibrate the axes
Y-axis: 0 at the bottom gridline, 120 near the top. X-axis: Jan (month 1) and Dec (month 12), or skip x-calibration if you’ll re-label by month name in the export.
Step 4: repeat for Products B and C
Create “Product B”. Twelve green-line points. Then “Product C”, twelve orange. Don’t re-calibrate — axes apply to all series.
Total: 36 clicks, two calibrations, three named groups.
Step 5: export
XLSX or CSV. All 36 points with series names in long format:
series,month,value
Product A, Jan, 31.2
Product A, Feb, 36.0
...
Product B, Jan, 42.4
... Long format is what Plotly, ggplot, and Vega-Lite prefer.
Answer key
Ground-truth values:
| Month | Product A | Product B | Product C |
|---|---|---|---|
| Jan | 39.6 | 49.8 | 44.5 |
| Feb | 37.4 | 48.8 | 42.0 |
| Mar | 39.2 | 52.8 | 42.9 |
| Apr | 41.6 | 55.7 | 39.3 |
| May | 41.3 | 54.2 | 42.0 |
| Jun | 42.8 | 55.9 | 45.6 |
| Jul | 39.4 | 57.2 | 47.3 |
| Aug | 36.0 | 61.9 | 52.1 |
| Sep | 34.1 | 65.2 | 51.2 |
| Oct | 36.9 | 64.1 | 54.2 |
| Nov | 37.2 | 69.9 | 56.1 |
| Dec | 36.3 | 67.1 | 57.9 |
Per-series MAE. Aim for under 1.5. Above 3 = calibration drift; above 5 with no calibration issue = a point on the wrong series, usually at a crossing.
Common mistakes
- Swapping series at crossings. When blue and green cross around May, it’s easy to click the green line while extracting Product A. Named groups make this visible — a Product A point on the green line is an obvious mismatch. Re-check at crossings.
- Forgetting to switch active groups. Clicking while “Product A” is still active adds to Product A. Check the active group label before each set.
- Inconsistent x-positions across series. All three should share x-positions per month, but eyeballing “Jan” differently each time misaligns your Jan values. Set x-snap to month positions if precision matters.
How this compares to AI
Multi-series is where AI fails most visibly. From our benchmark:
- Claude Sonnet 4.6: 18% MAE, swaps in 5 of 12 months.
- GPT-4o: 22% MAE, consistent swap on the B/C crossing.
- Gemini 2.5 Pro: 20% MAE.
All three could name the series from the legend. None could reliably tie a name to the right line at each x. Per why AI gets chart data wrong: tracking lines through crossings needs sustained spatial reasoning vision encoders aren’t built for.
Calibrated extraction beats all three by 15-20 percentage points in ~8 minutes.
Next
- Workshop 3: Dense Scatter Plot with Auto-Detect — 250 points in 90 seconds with color-based auto-extraction.
- Workshop 4: Log-Scale Chart Without Arithmetic Mistakes — log axes, the failure mode AI never solves.
- All five workshops + practice datasets — full hub.
Try it on your own chart
Upload an image, click your data points, calibrate the axes, and export CSV. Under three minutes, no login required for a single export.
Open the extractor