Repository files navigation

Python applicationPyPI versionDOI

A Python3 command line utility to digitize plots in batch mode.

This utility is useful when you have a lot of similar plots such as EEG, ECG recordings. See examples below.

For one-off use cases, you can use my web utilty Plot Extractor.

Installation

$ python3 -m pip install plotdigitizer
$ plotdigitizer --help

Preparing image

Crop the image and leave only axis and trajectories. I used the gthumb utility on Linux. You can also use imagemagick or gimp.

The following image is from MacFadden and Koshland, PNAS 1990 after trimming. One should also remove top and right axes. I didn't because I want to highlight the limitation of this tool!

Trimmed image

Run

plotdigitizer ./figures/trimmed.png -p 0,0 -p 10,0 -p 0,1

We need at least three points (-p option) to map x- and y-axis onto the image.

In the example above, these are 0,0 (where x-axis and y-axis intersect) , 10,0 (a point on the x-axis), and 0,1 (a point on the y-axis). To map these points on the image, you will be asked to click on these points. Make sure to click in the same order and click on the points as precisely as you could. Any error in this step will propagate.

If you don't have 0,0 in your image, you must provide 4 points: 2 on the x-axis and 2 on the y-axis.

The data points will be dumped to a CSV file specified by --output /path/to/file.csv.

If --plot output.png is passed, a plot of the extracted data points will be saved to output.png. This requires matplotlib. Very useful when debugging/testing.

Notice the error near the right y-axis.

Using in batch mode

You can pass the coordinates of points in the image at the command prompt. This allows it to run in batch mode without any need for the user to click on the image.

plotdigitizer ./figures/trimmed.png -p 0,0 -p 20,0 -p 0,1 -l 22,295 -l 142,295 -l 22,215 --plot output.png

How to find coordinates of axes points

In the example above, point 0,0 is mapped to coordinate 22,295 i.e., the data point 0,0 is on the 22nd row and 295th column of the image (assuming that the bottom left of the image is the first row, first column (0,0)). I have included a utility plotdigitizer-locate (script plotdigitizer/locate.py), which you can use to find the coordinates of points.

$ plotdigitizer-locate figures/trimmed.png

or, by directly using the script:

$ python3 plotdigitizer/locate.py figures/trimmed.png

This command opens the image in a simple window. You can click on a point, and its coordinates will be written on the image. Note them down.

Examples

Base examples

plotdigitizer figures/graphs_1.png \
-p 1,0 -p 6,0 -p 0,3 \
-l 165,160 -l 599,160 -l 85,60 \
--plot figures/graphs_1.result.png \
--preprocess

originalreconstructed

Light grids

plotdigitizer figures/ECGImage.png \
-p 1,0 -p 5,0 -p 0,1 \
-l 290,337 -l 1306,338 -l 106,83 \
--plot figures/ECGImage.result.png

originalreconstructed

With grids

plotdigitizer figures/graph_with_grid.png \
-p 200,0 -p 1000,0 -p 0,50 \
-l 269,69 -l 1789,69 -l 82,542 \
--plot figures/graph_with_grid.result.png

originalImage credit: Yang yi, Wang

reconstructed

Note that legend was not removed in the original figure and it has screwed up the detection below it.

Limitations

This application has the following limitations:

  • Only b/w images are supported for now. Color images will be converted to grayscale upon reading.
  • Each plot should have only one trajectory.

Need help

Open an issue and please attach the sample plot.

Related Projects

  1. https://tools.dilawars.me/tool/plot-extractor is web-utility to extract data manually.

About

A Python utility to digitize plots. A web-utility for non-batch mode https://tools.dilawars.me/tool/plot-extractor

Topics

Resources

Stars

173 stars

Watchers

6 watching

Forks

Releases

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

Python applicationPyPI versionDOI

A Python3 command line utility to digitize plots in batch mode.

This utility is useful when you have a lot of similar plots such as EEG, ECG recordings. See examples below.

For one-off use cases, you can use my web utilty Plot Extractor.

Installation

$ python3 -m pip install plotdigitizer
$ plotdigitizer --help

Preparing image

Crop the image and leave only axis and trajectories. I used the gthumb utility on Linux. You can also use imagemagick or gimp.

The following image is from MacFadden and Koshland, PNAS 1990 after trimming. One should also remove top and right axes. I didn't because I want to highlight the limitation of this tool!

Trimmed image

Run

plotdigitizer ./figures/trimmed.png -p 0,0 -p 10,0 -p 0,1

We need at least three points (-p option) to map x- and y-axis onto the image.

In the example above, these are 0,0 (where x-axis and y-axis intersect) , 10,0 (a point on the x-axis), and 0,1 (a point on the y-axis). To map these points on the image, you will be asked to click on these points. Make sure to click in the same order and click on the points as precisely as you could. Any error in this step will propagate.

If you don't have 0,0 in your image, you must provide 4 points: 2 on the x-axis and 2 on the y-axis.

The data points will be dumped to a CSV file specified by --output /path/to/file.csv.

If --plot output.png is passed, a plot of the extracted data points will be saved to output.png. This requires matplotlib. Very useful when debugging/testing.

Notice the error near the right y-axis.

Using in batch mode

You can pass the coordinates of points in the image at the command prompt. This allows it to run in batch mode without any need for the user to click on the image.

plotdigitizer ./figures/trimmed.png -p 0,0 -p 20,0 -p 0,1 -l 22,295 -l 142,295 -l 22,215 --plot output.png

How to find coordinates of axes points

In the example above, point 0,0 is mapped to coordinate 22,295 i.e., the data point 0,0 is on the 22nd row and 295th column of the image (assuming that the bottom left of the image is the first row, first column (0,0)). I have included a utility plotdigitizer-locate (script plotdigitizer/locate.py), which you can use to find the coordinates of points.

$ plotdigitizer-locate figures/trimmed.png

or, by directly using the script:

$ python3 plotdigitizer/locate.py figures/trimmed.png

This command opens the image in a simple window. You can click on a point, and its coordinates will be written on the image. Note them down.

Examples

Base examples

plotdigitizer figures/graphs_1.png \
-p 1,0 -p 6,0 -p 0,3 \
-l 165,160 -l 599,160 -l 85,60 \
--plot figures/graphs_1.result.png \
--preprocess

originalreconstructed

Light grids

plotdigitizer figures/ECGImage.png \
-p 1,0 -p 5,0 -p 0,1 \
-l 290,337 -l 1306,338 -l 106,83 \
--plot figures/ECGImage.result.png

originalreconstructed

With grids

plotdigitizer figures/graph_with_grid.png \
-p 200,0 -p 1000,0 -p 0,50 \
-l 269,69 -l 1789,69 -l 82,542 \
--plot figures/graph_with_grid.result.png

originalImage credit: Yang yi, Wang

reconstructed

Note that legend was not removed in the original figure and it has screwed up the detection below it.

Limitations

This application has the following limitations:

  • Only b/w images are supported for now. Color images will be converted to grayscale upon reading.
  • Each plot should have only one trajectory.

Need help

Open an issue and please attach the sample plot.

Related Projects

  1. https://tools.dilawars.me/tool/plot-extractor is web-utility to extract data manually.

About

A Python utility to digitize plots. A web-utility for non-batch mode https://tools.dilawars.me/tool/plot-extractor

Topics

Resources

Stars

173 stars

Watchers

6 watching

Forks

Releases

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Python applicationPyPI versionDOI

A Python3 command line utility to digitize plots in batch mode.

This utility is useful when you have a lot of similar plots such as EEG, ECG recordings. See examples below.

For one-off use cases, you can use my web utilty Plot Extractor.

Installation

$ python3 -m pip install plotdigitizer
$ plotdigitizer --help

Preparing image

Crop the image and leave only axis and trajectories. I used the gthumb utility on Linux. You can also use imagemagick or gimp.

The following image is from MacFadden and Koshland, PNAS 1990 after trimming. One should also remove top and right axes. I didn't because I want to highlight the limitation of this tool!

Trimmed image

Run

plotdigitizer ./figures/trimmed.png -p 0,0 -p 10,0 -p 0,1

We need at least three points (-p option) to map x- and y-axis onto the image.

In the example above, these are 0,0 (where x-axis and y-axis intersect) , 10,0 (a point on the x-axis), and 0,1 (a point on the y-axis). To map these points on the image, you will be asked to click on these points. Make sure to click in the same order and click on the points as precisely as you could. Any error in this step will propagate.

If you don't have 0,0 in your image, you must provide 4 points: 2 on the x-axis and 2 on the y-axis.

The data points will be dumped to a CSV file specified by --output /path/to/file.csv.

If --plot output.png is passed, a plot of the extracted data points will be saved to output.png. This requires matplotlib. Very useful when debugging/testing.

Notice the error near the right y-axis.

Using in batch mode

You can pass the coordinates of points in the image at the command prompt. This allows it to run in batch mode without any need for the user to click on the image.

plotdigitizer ./figures/trimmed.png -p 0,0 -p 20,0 -p 0,1 -l 22,295 -l 142,295 -l 22,215 --plot output.png

How to find coordinates of axes points

In the example above, point 0,0 is mapped to coordinate 22,295 i.e., the data point 0,0 is on the 22nd row and 295th column of the image (assuming that the bottom left of the image is the first row, first column (0,0)). I have included a utility plotdigitizer-locate (script plotdigitizer/locate.py), which you can use to find the coordinates of points.

$ plotdigitizer-locate figures/trimmed.png

or, by directly using the script:

$ python3 plotdigitizer/locate.py figures/trimmed.png

This command opens the image in a simple window. You can click on a point, and its coordinates will be written on the image. Note them down.

Examples

Base examples

plotdigitizer figures/graphs_1.png \
-p 1,0 -p 6,0 -p 0,3 \
-l 165,160 -l 599,160 -l 85,60 \
--plot figures/graphs_1.result.png \
--preprocess

originalreconstructed

Light grids

plotdigitizer figures/ECGImage.png \
-p 1,0 -p 5,0 -p 0,1 \
-l 290,337 -l 1306,338 -l 106,83 \
--plot figures/ECGImage.result.png

originalreconstructed

With grids

plotdigitizer figures/graph_with_grid.png \
-p 200,0 -p 1000,0 -p 0,50 \
-l 269,69 -l 1789,69 -l 82,542 \
--plot figures/graph_with_grid.result.png

originalImage credit: Yang yi, Wang

reconstructed

Note that legend was not removed in the original figure and it has screwed up the detection below it.

Limitations

This application has the following limitations:

  • Only b/w images are supported for now. Color images will be converted to grayscale upon reading.
  • Each plot should have only one trajectory.

Need help

Open an issue and please attach the sample plot.

Related Projects

  1. https://tools.dilawars.me/tool/plot-extractor is web-utility to extract data manually.

About

A Python utility to digitize plots. A web-utility for non-batch mode https://tools.dilawars.me/tool/plot-extractor

Topics

Resources

Stars

173 stars

Watchers

6 watching

Forks

Releases

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Python applicationPyPI versionDOI

A Python3 command line utility to digitize plots in batch mode.

This utility is useful when you have a lot of similar plots such as EEG, ECG recordings. See examples below.

For one-off use cases, you can use my web utilty Plot Extractor.

Installation

$ python3 -m pip install plotdigitizer
$ plotdigitizer --help

Preparing image

Crop the image and leave only axis and trajectories. I used the gthumb utility on Linux. You can also use imagemagick or gimp.

The following image is from MacFadden and Koshland, PNAS 1990 after trimming. One should also remove top and right axes. I didn't because I want to highlight the limitation of this tool!

Trimmed image

Run

plotdigitizer ./figures/trimmed.png -p 0,0 -p 10,0 -p 0,1

We need at least three points (-p option) to map x- and y-axis onto the image.

In the example above, these are 0,0 (where x-axis and y-axis intersect) , 10,0 (a point on the x-axis), and 0,1 (a point on the y-axis). To map these points on the image, you will be asked to click on these points. Make sure to click in the same order and click on the points as precisely as you could. Any error in this step will propagate.

If you don't have 0,0 in your image, you must provide 4 points: 2 on the x-axis and 2 on the y-axis.

The data points will be dumped to a CSV file specified by --output /path/to/file.csv.

If --plot output.png is passed, a plot of the extracted data points will be saved to output.png. This requires matplotlib. Very useful when debugging/testing.

Notice the error near the right y-axis.

Using in batch mode

You can pass the coordinates of points in the image at the command prompt. This allows it to run in batch mode without any need for the user to click on the image.

plotdigitizer ./figures/trimmed.png -p 0,0 -p 20,0 -p 0,1 -l 22,295 -l 142,295 -l 22,215 --plot output.png

How to find coordinates of axes points

In the example above, point 0,0 is mapped to coordinate 22,295 i.e., the data point 0,0 is on the 22nd row and 295th column of the image (assuming that the bottom left of the image is the first row, first column (0,0)). I have included a utility plotdigitizer-locate (script plotdigitizer/locate.py), which you can use to find the coordinates of points.

$ plotdigitizer-locate figures/trimmed.png

or, by directly using the script:

$ python3 plotdigitizer/locate.py figures/trimmed.png

This command opens the image in a simple window. You can click on a point, and its coordinates will be written on the image. Note them down.

Examples

Base examples

plotdigitizer figures/graphs_1.png \
-p 1,0 -p 6,0 -p 0,3 \
-l 165,160 -l 599,160 -l 85,60 \
--plot figures/graphs_1.result.png \
--preprocess

originalreconstructed

Light grids

plotdigitizer figures/ECGImage.png \
-p 1,0 -p 5,0 -p 0,1 \
-l 290,337 -l 1306,338 -l 106,83 \
--plot figures/ECGImage.result.png

originalreconstructed

With grids

plotdigitizer figures/graph_with_grid.png \
-p 200,0 -p 1000,0 -p 0,50 \
-l 269,69 -l 1789,69 -l 82,542 \
--plot figures/graph_with_grid.result.png

originalImage credit: Yang yi, Wang

reconstructed

Note that legend was not removed in the original figure and it has screwed up the detection below it.

Limitations

This application has the following limitations:

  • Only b/w images are supported for now. Color images will be converted to grayscale upon reading.
  • Each plot should have only one trajectory.

Need help

Open an issue and please attach the sample plot.

Related Projects

  1. https://tools.dilawars.me/tool/plot-extractor is web-utility to extract data manually.

About

A Python utility to digitize plots. A web-utility for non-batch mode https://tools.dilawars.me/tool/plot-extractor

Topics

Resources

Stars

173 stars

Watchers

6 watching

Forks

Releases

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

Python applicationPyPI versionDOI

A Python3 command line utility to digitize plots in batch mode.

This utility is useful when you have a lot of similar plots such as EEG, ECG recordings. See examples below.

For one-off use cases, you can use my web utilty Plot Extractor.

Installation

$ python3 -m pip install plotdigitizer
$ plotdigitizer --help

Preparing image

Crop the image and leave only axis and trajectories. I used the gthumb utility on Linux. You can also use imagemagick or gimp.

The following image is from MacFadden and Koshland, PNAS 1990 after trimming. One should also remove top and right axes. I didn't because I want to highlight the limitation of this tool!

Trimmed image

Run

plotdigitizer ./figures/trimmed.png -p 0,0 -p 10,0 -p 0,1

We need at least three points (-p option) to map x- and y-axis onto the image.

In the example above, these are 0,0 (where x-axis and y-axis intersect) , 10,0 (a point on the x-axis), and 0,1 (a point on the y-axis). To map these points on the image, you will be asked to click on these points. Make sure to click in the same order and click on the points as precisely as you could. Any error in this step will propagate.

If you don't have 0,0 in your image, you must provide 4 points: 2 on the x-axis and 2 on the y-axis.

The data points will be dumped to a CSV file specified by --output /path/to/file.csv.

If --plot output.png is passed, a plot of the extracted data points will be saved to output.png. This requires matplotlib. Very useful when debugging/testing.

Notice the error near the right y-axis.

Using in batch mode

You can pass the coordinates of points in the image at the command prompt. This allows it to run in batch mode without any need for the user to click on the image.

plotdigitizer ./figures/trimmed.png -p 0,0 -p 20,0 -p 0,1 -l 22,295 -l 142,295 -l 22,215 --plot output.png

How to find coordinates of axes points

In the example above, point 0,0 is mapped to coordinate 22,295 i.e., the data point 0,0 is on the 22nd row and 295th column of the image (assuming that the bottom left of the image is the first row, first column (0,0)). I have included a utility plotdigitizer-locate (script plotdigitizer/locate.py), which you can use to find the coordinates of points.

$ plotdigitizer-locate figures/trimmed.png

or, by directly using the script:

$ python3 plotdigitizer/locate.py figures/trimmed.png

This command opens the image in a simple window. You can click on a point, and its coordinates will be written on the image. Note them down.

Examples

Base examples

plotdigitizer figures/graphs_1.png \
-p 1,0 -p 6,0 -p 0,3 \
-l 165,160 -l 599,160 -l 85,60 \
--plot figures/graphs_1.result.png \
--preprocess

originalreconstructed

Light grids

plotdigitizer figures/ECGImage.png \
-p 1,0 -p 5,0 -p 0,1 \
-l 290,337 -l 1306,338 -l 106,83 \
--plot figures/ECGImage.result.png

originalreconstructed

With grids

plotdigitizer figures/graph_with_grid.png \
-p 200,0 -p 1000,0 -p 0,50 \
-l 269,69 -l 1789,69 -l 82,542 \
--plot figures/graph_with_grid.result.png

originalImage credit: Yang yi, Wang

reconstructed

Note that legend was not removed in the original figure and it has screwed up the detection below it.

Limitations

This application has the following limitations:

  • Only b/w images are supported for now. Color images will be converted to grayscale upon reading.
  • Each plot should have only one trajectory.

Need help

Open an issue and please attach the sample plot.

Related Projects

  1. https://tools.dilawars.me/tool/plot-extractor is web-utility to extract data manually.

About

A Python utility to digitize plots. A web-utility for non-batch mode https://tools.dilawars.me/tool/plot-extractor

Topics

Resources

Stars

173 stars

Watchers

6 watching

Forks

Releases

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Python applicationPyPI versionDOI

A Python3 command line utility to digitize plots in batch mode.

This utility is useful when you have a lot of similar plots such as EEG, ECG recordings. See examples below.

For one-off use cases, you can use my web utilty Plot Extractor.

Installation

$ python3 -m pip install plotdigitizer
$ plotdigitizer --help

Preparing image

Crop the image and leave only axis and trajectories. I used the gthumb utility on Linux. You can also use imagemagick or gimp.

The following image is from MacFadden and Koshland, PNAS 1990 after trimming. One should also remove top and right axes. I didn't because I want to highlight the limitation of this tool!

Trimmed image

Run

plotdigitizer ./figures/trimmed.png -p 0,0 -p 10,0 -p 0,1

We need at least three points (-p option) to map x- and y-axis onto the image.

In the example above, these are 0,0 (where x-axis and y-axis intersect) , 10,0 (a point on the x-axis), and 0,1 (a point on the y-axis). To map these points on the image, you will be asked to click on these points. Make sure to click in the same order and click on the points as precisely as you could. Any error in this step will propagate.

If you don't have 0,0 in your image, you must provide 4 points: 2 on the x-axis and 2 on the y-axis.

The data points will be dumped to a CSV file specified by --output /path/to/file.csv.

If --plot output.png is passed, a plot of the extracted data points will be saved to output.png. This requires matplotlib. Very useful when debugging/testing.

Notice the error near the right y-axis.

Using in batch mode

You can pass the coordinates of points in the image at the command prompt. This allows it to run in batch mode without any need for the user to click on the image.

plotdigitizer ./figures/trimmed.png -p 0,0 -p 20,0 -p 0,1 -l 22,295 -l 142,295 -l 22,215 --plot output.png

How to find coordinates of axes points

In the example above, point 0,0 is mapped to coordinate 22,295 i.e., the data point 0,0 is on the 22nd row and 295th column of the image (assuming that the bottom left of the image is the first row, first column (0,0)). I have included a utility plotdigitizer-locate (script plotdigitizer/locate.py), which you can use to find the coordinates of points.

$ plotdigitizer-locate figures/trimmed.png

or, by directly using the script:

$ python3 plotdigitizer/locate.py figures/trimmed.png

This command opens the image in a simple window. You can click on a point, and its coordinates will be written on the image. Note them down.

Examples

Base examples

plotdigitizer figures/graphs_1.png \
-p 1,0 -p 6,0 -p 0,3 \
-l 165,160 -l 599,160 -l 85,60 \
--plot figures/graphs_1.result.png \
--preprocess

originalreconstructed

Light grids

plotdigitizer figures/ECGImage.png \
-p 1,0 -p 5,0 -p 0,1 \
-l 290,337 -l 1306,338 -l 106,83 \
--plot figures/ECGImage.result.png

originalreconstructed

With grids

plotdigitizer figures/graph_with_grid.png \
-p 200,0 -p 1000,0 -p 0,50 \
-l 269,69 -l 1789,69 -l 82,542 \
--plot figures/graph_with_grid.result.png

originalImage credit: Yang yi, Wang

reconstructed

Note that legend was not removed in the original figure and it has screwed up the detection below it.

Limitations

This application has the following limitations:

  • Only b/w images are supported for now. Color images will be converted to grayscale upon reading.
  • Each plot should have only one trajectory.

Need help

Open an issue and please attach the sample plot.

Related Projects

  1. https://tools.dilawars.me/tool/plot-extractor is web-utility to extract data manually.

About

A Python utility to digitize plots. A web-utility for non-batch mode https://tools.dilawars.me/tool/plot-extractor

Topics

Resources

Stars

173 stars

Watchers

6 watching

Forks

Releases

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Python applicationPyPI versionDOI

A Python3 command line utility to digitize plots in batch mode.

This utility is useful when you have a lot of similar plots such as EEG, ECG recordings. See examples below.

For one-off use cases, you can use my web utilty Plot Extractor.

Installation

$ python3 -m pip install plotdigitizer
$ plotdigitizer --help

Preparing image

Crop the image and leave only axis and trajectories. I used the gthumb utility on Linux. You can also use imagemagick or gimp.

The following image is from MacFadden and Koshland, PNAS 1990 after trimming. One should also remove top and right axes. I didn't because I want to highlight the limitation of this tool!

Trimmed image

Run

plotdigitizer ./figures/trimmed.png -p 0,0 -p 10,0 -p 0,1

We need at least three points (-p option) to map x- and y-axis onto the image.

In the example above, these are 0,0 (where x-axis and y-axis intersect) , 10,0 (a point on the x-axis), and 0,1 (a point on the y-axis). To map these points on the image, you will be asked to click on these points. Make sure to click in the same order and click on the points as precisely as you could. Any error in this step will propagate.

If you don't have 0,0 in your image, you must provide 4 points: 2 on the x-axis and 2 on the y-axis.

The data points will be dumped to a CSV file specified by --output /path/to/file.csv.

If --plot output.png is passed, a plot of the extracted data points will be saved to output.png. This requires matplotlib. Very useful when debugging/testing.

Notice the error near the right y-axis.

Using in batch mode

You can pass the coordinates of points in the image at the command prompt. This allows it to run in batch mode without any need for the user to click on the image.

plotdigitizer ./figures/trimmed.png -p 0,0 -p 20,0 -p 0,1 -l 22,295 -l 142,295 -l 22,215 --plot output.png

How to find coordinates of axes points

In the example above, point 0,0 is mapped to coordinate 22,295 i.e., the data point 0,0 is on the 22nd row and 295th column of the image (assuming that the bottom left of the image is the first row, first column (0,0)). I have included a utility plotdigitizer-locate (script plotdigitizer/locate.py), which you can use to find the coordinates of points.

$ plotdigitizer-locate figures/trimmed.png

or, by directly using the script:

$ python3 plotdigitizer/locate.py figures/trimmed.png

This command opens the image in a simple window. You can click on a point, and its coordinates will be written on the image. Note them down.

Examples

Base examples

plotdigitizer figures/graphs_1.png \
-p 1,0 -p 6,0 -p 0,3 \
-l 165,160 -l 599,160 -l 85,60 \
--plot figures/graphs_1.result.png \
--preprocess

originalreconstructed

Light grids

plotdigitizer figures/ECGImage.png \
-p 1,0 -p 5,0 -p 0,1 \
-l 290,337 -l 1306,338 -l 106,83 \
--plot figures/ECGImage.result.png

originalreconstructed

With grids

plotdigitizer figures/graph_with_grid.png \
-p 200,0 -p 1000,0 -p 0,50 \
-l 269,69 -l 1789,69 -l 82,542 \
--plot figures/graph_with_grid.result.png

originalImage credit: Yang yi, Wang

reconstructed

Note that legend was not removed in the original figure and it has screwed up the detection below it.

Limitations

This application has the following limitations:

  • Only b/w images are supported for now. Color images will be converted to grayscale upon reading.
  • Each plot should have only one trajectory.

Need help

Open an issue and please attach the sample plot.

Related Projects

  1. https://tools.dilawars.me/tool/plot-extractor is web-utility to extract data manually.

About

A Python utility to digitize plots. A web-utility for non-batch mode https://tools.dilawars.me/tool/plot-extractor

Topics

Resources

Stars

173 stars

Watchers

6 watching

Forks

Releases

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

Python applicationPyPI versionDOI

A Python3 command line utility to digitize plots in batch mode.

This utility is useful when you have a lot of similar plots such as EEG, ECG recordings. See examples below.

For one-off use cases, you can use my web utilty Plot Extractor.

Installation

$ python3 -m pip install plotdigitizer
$ plotdigitizer --help

Preparing image

Crop the image and leave only axis and trajectories. I used the gthumb utility on Linux. You can also use imagemagick or gimp.

The following image is from MacFadden and Koshland, PNAS 1990 after trimming. One should also remove top and right axes. I didn't because I want to highlight the limitation of this tool!

Trimmed image

Run

plotdigitizer ./figures/trimmed.png -p 0,0 -p 10,0 -p 0,1

We need at least three points (-p option) to map x- and y-axis onto the image.

In the example above, these are 0,0 (where x-axis and y-axis intersect) , 10,0 (a point on the x-axis), and 0,1 (a point on the y-axis). To map these points on the image, you will be asked to click on these points. Make sure to click in the same order and click on the points as precisely as you could. Any error in this step will propagate.

If you don't have 0,0 in your image, you must provide 4 points: 2 on the x-axis and 2 on the y-axis.

The data points will be dumped to a CSV file specified by --output /path/to/file.csv.

If --plot output.png is passed, a plot of the extracted data points will be saved to output.png. This requires matplotlib. Very useful when debugging/testing.

Notice the error near the right y-axis.

Using in batch mode

You can pass the coordinates of points in the image at the command prompt. This allows it to run in batch mode without any need for the user to click on the image.

plotdigitizer ./figures/trimmed.png -p 0,0 -p 20,0 -p 0,1 -l 22,295 -l 142,295 -l 22,215 --plot output.png

How to find coordinates of axes points

In the example above, point 0,0 is mapped to coordinate 22,295 i.e., the data point 0,0 is on the 22nd row and 295th column of the image (assuming that the bottom left of the image is the first row, first column (0,0)). I have included a utility plotdigitizer-locate (script plotdigitizer/locate.py), which you can use to find the coordinates of points.

$ plotdigitizer-locate figures/trimmed.png

or, by directly using the script:

$ python3 plotdigitizer/locate.py figures/trimmed.png

This command opens the image in a simple window. You can click on a point, and its coordinates will be written on the image. Note them down.

Examples

Base examples

plotdigitizer figures/graphs_1.png \
-p 1,0 -p 6,0 -p 0,3 \
-l 165,160 -l 599,160 -l 85,60 \
--plot figures/graphs_1.result.png \
--preprocess

originalreconstructed

Light grids

plotdigitizer figures/ECGImage.png \
-p 1,0 -p 5,0 -p 0,1 \
-l 290,337 -l 1306,338 -l 106,83 \
--plot figures/ECGImage.result.png

originalreconstructed

With grids

plotdigitizer figures/graph_with_grid.png \
-p 200,0 -p 1000,0 -p 0,50 \
-l 269,69 -l 1789,69 -l 82,542 \
--plot figures/graph_with_grid.result.png

originalImage credit: Yang yi, Wang

reconstructed

Note that legend was not removed in the original figure and it has screwed up the detection below it.

Limitations

This application has the following limitations:

  • Only b/w images are supported for now. Color images will be converted to grayscale upon reading.
  • Each plot should have only one trajectory.

Need help

Open an issue and please attach the sample plot.

Related Projects

  1. https://tools.dilawars.me/tool/plot-extractor is web-utility to extract data manually.

About

A Python utility to digitize plots. A web-utility for non-batch mode https://tools.dilawars.me/tool/plot-extractor

Topics

Resources

Stars

173 stars

Watchers

6 watching

Forks

Releases

Used by

Contributors

Languages