Skip to content

Plot Digitizer

Recover the numbers behind a published plot: calibrate its axes, trace the curves, then download the points as CSV or copy a matplotlib script that plots them.

Drop an image of the plot here

The sharper the figure, the more precise the points.

.png.jpg.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 WebP image of the plot, or press Load a sample to practise on a drawn one. 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

Press Set X1, 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 X axis or Log Y axis if an axis is logarithmic. Each button shows a tick once its point is set.

3

Trace the curve

Press Add points, 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 series for each curve and give it a name and colour. The line above the figure always says what a click will do; Esc stops.

4

Clean up and export

Use Erase to brush away stray points, or Undo point to drop the last one, and download the CSV. Under the figure, the plot of the points follows every click: check the extracted series there, style it, and save it as PDF, PNG or SVG. The Python script beside it draws the same figure from your CSV.

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 plot and the matplotlib script all sort points by x and use the same values, the ones the CSV holds, 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
\text{value} = v_1 + (p - p_1)\,\frac{v_2 - v_1}{p_2 - p_1}
Logarithmic axis
\text{value} = 10^{\,\log_{10} v_1 \,+\, (p - p_1)\,\frac{\log_{10} v_2 \,-\, \log_{10} v_1}{p_2 - p_1}}

where p is the pixel coordinate of your point, p_1 and p_2 are the pixel positions of your two calibration marks, and v_1 and v_2 are the data values you typed for them.

Where the error actually comes from

Calibration span

Error scales with 1/(p_2 - p_1). 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 cursor readout under Calibrate the axes 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 series for each curve with Add series, give each a name and colour, and make sure the right one is selected before you trace, points always go to the active series. 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 plot and the Python script give me?
The plot under the figure draws the extracted series as you trace, at the size it will be saved, so you can check the extraction before you use it. Its Style button sets the axis labels, size, fonts, ticks, colours, legend and grid, and it saves as PDF, PNG or SVG. The Python script draws the same figure with matplotlib: it reads the CSV you downloaded, by the file name you chose, or holds the points itself if you pick Data in the script.
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.