Initialize digitizer

Upload a reference plot to extract coordinate data and generate automated Matplotlib rendering scripts.

Supported formats: PNG, JPEG, WEBP

How-To Guide

How to extract data from a published plot

Upload a figure, tell the tool where two known values sit on each axis, then trace the curve. You get a CSV of real coordinates plus a ready-to-run Matplotlib script.

1

Upload the figure

Drop in a PNG, JPG or any raster image of the plot. Use the highest resolution you can find, a screenshot of a PDF at full zoom beats a thumbnail, because every pixel of the original is a pixel of precision you keep.

2

Calibrate both axes

Click X1, then click that position on the image, and type the value it represents. Repeat for X2, Y1 and Y2. Pick two points that are far apart on each axis, usually the first and last labelled gridline. Tick Log if an axis is logarithmic.

3

Trace the curve

Select Manual, then either click individual points or hold and drag along the curve to lay down a trail. The magnifier follows your cursor so you can land on the line rather than near it. Add a dataset for each series and give it a name and colour.

4

Clean up and export

Use Erase to brush away stray points, or Undo to drop the last one. Then export the CSV, generate a Matplotlib script, or open the interactive preview to check the extracted series before you use it.

Toggle the background image off at any point to see only your extracted points. It is the quickest way to spot a stray click or a gap in a trace.

What the digitizer does, and what limits it

Two-point affine calibration

Each axis is mapped from pixels to data by a straight line through your two calibration marks. On a log axis the same interpolation is done in log10 space and then exponentiated, which is why both log values must be strictly positive.

You place every point

Coordinates come from where you click, so every point in your dataset is one you saw on the curve. Where a series doubles back on itself or crosses another, you decide which branch to follow rather than leaving it to a threshold.

Exports stay consistent

The CSV, the Matplotlib script and the interactive preview all sort points by x and use the same values, so the curve you see on screen is the curve you get in the file, even if you traced right-to-left or patched a gap in the middle.

Everything stays local

The image never leaves your machine. It is read with the browser's FileReader and drawn to a canvas, nothing is uploaded, so unpublished figures and confidential data are safe to work with.

Digitized data is an estimate of the original, never a substitute for it. Where the authors have published their numbers, or you can request them, use those instead. If you do digitize, say so in your methods and cite the source figure.
Method

The mapping, and where the error comes from

Both axes use the same two-point interpolation. Understanding it tells you exactly how to keep your extraction accurate.

Linear axis

value = v1 + (p − p1) × (v2 − v1) / (p2 − p1)

Logarithmic axis

value = 10 log10v1 + (p − p1)(log10v2 − log10v1) / (p2 − p1)

where p is the pixel coordinate of your point, p1 / p2 are the pixel positions of your two calibration marks, and v1 / v2 are the data values you typed for them.

Where the error actually comes from

Calibration span

Error scales with 1 / (p2−p1). Two marks a few pixels apart amplify every subsequent click; marks at opposite ends of the axis divide the error down. This is the single biggest lever you control.

Image resolution

One screen pixel is the floor on precision. A 400 px-wide figure spanning 0–100 gives you no better than ±0.25 per pixel, before any human error. Start from the largest version of the figure available.

Line thickness

A curve drawn 3 px thick is ambiguous by ±1.5 px wherever you click on it. Aim consistently for the centre of the stroke; the magnifier exists to make that possible.

Sanity check your calibration. After calibrating, hover over a gridline whose value you already know and see whether the readout matches. If it does not, one of your four marks or values is wrong, and every point you trace afterwards will inherit that error.

Frequently asked questions

How accurate is digitized data?
With a high-resolution figure, well-separated calibration marks and careful clicking, agreement with the underlying values is typically within a percent or so, published reliability studies of digitizing tools report high agreement between independent extractors. But accuracy is bounded by the image itself: pixel size, line thickness and axis span all set a floor you cannot beat. Treat digitized values as good estimates, state in your methods that they were extracted from a figure, and cite the original.
Where should I put the calibration points?
As far apart as the axis allows, on positions whose values you know exactly, normally the first and last labelled tick. The error in every extracted point scales inversely with the pixel distance between your two marks, so two marks near each other magnify every later click. Placing both on the same pixel is rejected outright, because the scale would be undefined.
Why was my log axis rejected?
A logarithmic mapping interpolates in log10 space, which is undefined for zero or negative numbers. Both calibration values on that axis must therefore be strictly greater than zero. If your axis genuinely crosses zero it is not logarithmic, it is probably linear, or a symlog scale, which this two-point mapping does not model.
How many points should I trace?
Enough to capture the shape, not the whole line. Place points densely where the curve bends, turns or peaks, and sparsely along straight runs, a smooth section is reconstructed perfectly well from its endpoints. Holding and dragging lays down a trail automatically as you follow the curve, which is usually the fastest way to cover a long sweep.
Can I trace several curves from one figure?
Yes. Add a dataset per series with + Add, give each a name and colour, and make sure the right one is selected before you trace, points always go to the active dataset. Names are carried through to the CSV's Dataset column and become the legend entries in the generated Matplotlib script.
Does the order I click in matter?
Not for the output. Points are sorted by x when exported and when drawn, so tracing right-to-left or going back to fill a gap still yields a properly ordered series. It does matter for Undo, which removes the most recently added point rather than the right-most one.
Why does my CSV show values like 2.3e-5?
Because the value is genuinely that small. Values are written with significant digits rather than a fixed number of decimals, so small magnitudes survive the round trip, a fixed four-decimal format would have written that number as 0.0000 and destroyed it. Very large and very small magnitudes use exponential notation, which pandas.read_csv and every spreadsheet read without special handling.
What do the generated Python script and preview give me?
The script loads your exported CSV with pandas and rebuilds the figure in Matplotlib (one axes with all series, or stacked subplots) carrying over your labels, colours, log scales, grid and figure size. The preview does the same thing instantly with Plotly in a new tab, so you can check the extraction before writing any files. Save the CSV first: the script reads it by the filename you chose.
Is my figure uploaded anywhere?
No. The image is read locally by your browser and drawn to a canvas. Nothing is transmitted, stored or logged, so it is safe to digitize unpublished figures, confidential results or anything under embargo.