PlotTracer
Measured

How well it reads a figure.

Every number on this page comes from running PlotTracer's own shipped code over public corpora that someone else built and someone else transcribed, scored with the competition's own metric. The harness and the exact image lists are public, so anyone can run it again and disagree with us.

Automatic extraction

Benchmark results

PlotTracer's automatic extraction, scored against two public corpora from the CHART-Infographics competition series using the competition's own metric. Box plots appear in both corpora and are excluded: PlotTracer captures them by hand but does not auto-extract them.

Chart type[1] Real figures[2] Synthetic figures
Bar76.4%n = 6,49436.7%n = 6,739
Line69.3%n = 29,68892.0%n = 2,236
Scatter91.3%n = 5,40932.1%n = 11,996

Share of elements recovered within the competition's tolerance, scored in image space by automatic extraction. PlotTracer 2.4.0 at its default settings (tolerance 60, minimum blob diameter 3), measured 2026-09-01.

  1. [1] K. Davila, F. Xu, S. Ahmed, D. A. Mendoza, S. Setlur and V. Govindaraju, “ICPR 2022: Challenge on Harvesting Raw Tables from Infographics (CHART-Infographics),” 26th Int. Conf. on Pattern Recognition, 2022, pp. 4995–5001. doi:10.1109/ICPR56361.2022.9956289 Charts from open-access PubMed Central papers. 799 figures scored.
  2. [2] K. Davila, B. U. Kota, S. Setlur, V. Govindaraju, C. Tensmeyer, S. Shekhar and R. Chaudhry, “ICDAR 2019 Competition on Harvesting Raw Tables from Infographics (CHART-Infographics),” Int. Conf. on Document Analysis and Recognition, 2019, pp. 1594–1599. doi:10.1109/ICDAR.2019.00203 Generated with matplotlib from real data sources. 808 figures scored.

What a human declaration is worth

PlotTracer is human-in-the-loop, so the honest question is not only what it recovers alone but what one declaration buys. This is the same bar figures with the two things a person states in the calibration walk, and nothing else changed.

CorpusAutomaticAssistedDifference
[1] Real figures76.1%automatic77.4%assisted+1.3points, n = 5,778 bars
[2] Synthetic figures36.7%automatic62.0%assisted+25.3points, n = 6,739 bars

Bar recall, with and without the two things a person declares in the calibration walk: the marked category axis, and the baseline the bars stand on. Nothing else differs. This is a ceiling rather than a user's day, because those declarations come from the corpus placed exactly. The second corpus is where hatched fills are common.

Reading the chart's own words

Recovering a figure's names is a separate question from recovering its numbers, and it is measured against the same corpus's own transcription.

ReadExactly rightFigures
Tick labels [1]79.8%10,169 of 12,751887real published figures

Matched character for character against the corpus's own transcription of each label, with no partial credit. Those are the labels printed level, 95.4% of every tick label in that corpus. Recovering a chart's NAMES is a different question from recovering its VALUES, so it is reported on its own: a tool can be good at one and poor at the other, and a single blended percentage would hide both.

Capturing by hand, in the figure's own units

Everything above is scored in image space, because that is what the competition metric measures. This one is scored in data space: the numbers a user would actually read off the panel and paste into a spreadsheet.

Captured by handWithin 1%Figures
Bars [1]80.9%4,674 of 5,778 bars79.4%273 of 344 with every bar within

Driving the application's own capture session, with the calibration recovered from each figure's own tick labels and two corners clicked per bar. Scored in DATA space, in the figure's own units, at 1% of the value range - the only one of these paths measured in the units a user actually reads. 40 figures are excluded, most for carrying no two numeric tick labels to calibrate from.

Where it does worst

  • Greyscale. About 10 points on bars and 37 on lines in [1]. Not for the reason we first assumed: monochrome figures do carry the signal - across 101 greyscale bar figures the number of distinct grey shades matches the number of series 81% of the time. The loss is that a third of the gaps between adjacent shades are narrower than the colour tolerance, so two series match as one. Normalising a figure's contrast before matching recovers part of it, and is being worked on.
  • Adjacent same-coloured bars. Bars of one colour with no gap merge into a single region. Across 384 bar figures in [1]: 82.2% where bars are separated, 71.1% where they touch (89.2% and 73.6% on colour figures alone).
  • Dense scatter. Overlapping markers are over-detected in [1] and under-detected in [2]. In [1] roughly half the surplus detections are other ink inside the plot area - grid lines, error bars and trend lines.

Method. These corpora score fully automatic recognition, while PlotTracer is human-in-the-loop, so the two are adjacent rather than equivalent. That is why each path is reported on its own above and never blended: the automatic table is the harness supplying the two inputs a person supplies, the plot box and one colour pick per visible colour, and nothing else, with everything after that the application's own shipped code at its default settings. Scoring is in image space at the competition's tolerance of 5% of the smaller image dimension, except for manual capture, which is in data space at 1% of the value range. Every digitiser draws the line between what the human supplies and what the program does somewhere, and a number without that line drawn is not comparable to anything, so ours is written out in full rather than summarised. The harness, the exact image lists and the scoring code are at github.com/katalystnord/plottracer-benchmarks, and every number on this page is generated from its results file rather than typed here by hand.