从图形中抓取数据所需的软件


56

任何人都具有使用软件(最好是免费的,最好是开放源代码)的经验,该软件将拍摄在笛卡尔坐标上绘制的数据图像(标准的日常绘制),并提取图中绘制的点的坐标?

本质上,这是一个数据挖掘问题和一个反向数据可视化问题。


2
有关一种解决方案,请参阅对此回复的评论。开源解决方案将包括图像处理或栅格GIS软件(可能选择GRASS)或GNU Octave。我将这些作为评论提及,因为我也没有将其用于此特定目的,因此请将其视为可能,而不是确定的解决方案。
ub

我希望使用专门用于抓取图形的代码/软件,而且我记得已经存在这样的软件包,至少它们在10年前就已经存在,但是我现在不记得它们的名称了,也不知道它们是否在当前操作系统上运行。
亚历克斯·霍尔科姆

@Alex,尝试使用Google搜索“ Graph Digitizer Open Source”
David LeBauer

一个简短的Mathematica程序,用于从此处的扫描中获取数据。
Sjoerd C. de Vries 2015年

Answers:



42

图形数字化软件

有很多不同的选项,但基本上都使用相同的工作流程:

  1. 上传图片
  2. 通过指示每个轴上两个点的值来设置x和y比例
  3. 指示比例尺是否为线性,对数等
  4. 单击要点。
    • 一些程序会自动识别线或点。我通常会追逐分数,即使积分达到100分,我也发现它们太不一致了,无法提供帮助。我还没有找到可以识别不同符号的工具。对于数字化线路,此功能可能值得一试,但是我从来没有这样做。

程序将每个点作为xy矩阵返回。

通常,它可以通过上载图像的缩放版本或使用某些程序中提供的缩放功能来帮助选择缩放图像的点。

程序很多,它们在附加功能,可用性,许可和成本方面也各不相同。我在下面列出了它们。

我使用的所有工具都可以正常工作。除非在测量误差很小的情况下,否则图形刮擦产生的误差是微不足道的(例如,数字化误差<<误差线的大小或估计中的不确定性)。如果尚未测试任何这些程序的准确性,但是在用户之间,程序之间以及与复制的统计分析结果进行比较将是很有趣的。

我使用过的程序:

  • 数字化仪(免费软件,GPL)自动点/线识别。在Ubuntu存储库中可用(engauge-digitizer)
  • 获取数据(共享软件)具有缩放窗口,自动点/线识别
  • DigitizeIt(共享软件)自动点/线识别
  • ImageJ(开源,R数字化后可扩展)
  • R数字化(免费,开放源代码),因为它通过保留R中的所有步骤简化了将数据从图形获取到分析中的过程。请参见R-Journal中教程
  • 抓住它!(免费演示,69美元)Excel插件
  • WebPlotDigitzer(免费,在线)。基于浏览器,从图像中提取数据。在这里评论

我没有使用过的程序:

  • GraphClick(Mac,8美元)
  • g3data(开源-GNU GPL)具有缩放窗口,无自动识别。在Ubuntu存储库中可用。
  • 在专有平台Matlab中运行的GRABIT OpenSource(BSD)插件

TL; DR: WebPlotDigitizer可作为Web应用程序chrome插件使用


g3data(开源-GNU GPL)具有缩放窗口,没有自动识别功能。在Ubuntu存储库中可用。我无法比较,因为这是我尝试过的唯一方法。但我发现它非常易于使用。
Scortchi-恢复莫妮卡

为什么R digitize被从CRAN中删除?
莱奥波德·赫兹(LéoLéopoldHertz),2016年

1
@Masi其中大多数都不适用于pdf,对于pdf文件,我将图形放大了,然后使用屏幕截图(例如Mac上的cmd-shift-4)将图形另存为jpg或png。
大卫·勒鲍尔

1
@Masi在CRAN上维护程序包可能是许多额外的工作。该程序包可在GitHub github.com/tpoisot/digitize
David LeBauer,2016年

1
@Masi“系统地”是什么意思?您可以链接到所讨论的图形吗?当您说“相交”时,您是说该点包含在轴内并因此不出现?
David LeBauer '16

16

其他答复者假定您处理图形的栅格图像。但是,如今的好习惯是以矢量形式发布图形。在这种情况下,如果直接使用矢量图的代码,而无需将其转换为光栅图像,则可以提高恢复数据的准确性,甚至可以估计恢复错误。

由于这些论文以PDF文件在线发布,因此我假设您有一个PDF文件,其中包含矢量绘图,其中包含您希望从中恢复的数据(以数字形式获取)并估计引入的恢复误差。

首先,PDF是一种基本为文本的矢量格式(可以由文本编辑器读取)。问题在于它可以(几乎总是)包含压缩数据流,这些数据流需要解压缩才能通过文本编辑器读取。这些压缩的数据流通常包含我们需要的信息。

有几种解压缩数据流的方法,以便将PDF文件转换为具有可读PDF代码的文本文档。可能最简单的方法是使用带有选项的免费QPDF实用程序--stream-data=uncompress

qpdf infile.pdf --stream-data=uncompress -- outfile.pdf

这里这里介绍其他一些方法。

可以通过文本编辑器打开生成的outfile.pdf。现在,您需要PDF参考手册1.7才能了解所见内容。现在不要惊慌!您只需要知道第226-227页的“表4.9路径构造运算符”中所述的几个运算符。最重要的运算符是(第一列包含运算符的坐标规范,第二列包含该运算符,第三列是运算符名称):

x y               m   moveto 

x y               l   lineto 

x y width height  re  rectangle

                  h   closepath

在大多数情况下,了解这四个运算符就足以恢复数据。

现在,您需要将outfile.pdf文件作为文本导入到可以处理数据的某个程序中。我将展示如何使用Mathematica进行操作

导入文件:

pdfCode = Import["outfile.pdf", "Text"];

现在,我假设最简单的情况是:图形包含由许多两点线段组成的线。在这种情况下,该行的每个段都按如下方式编码:

268.79999 408.92975 m
272.39999 408.92975 l

从PDF代码中提取所有这些段:

lines = StringCases[pdfCode, 
   StartOfLine ~~ x1 : NumberString ~~ " " ~~ y1 : NumberString ~~ " m\n" ~~ 
                  x2 : NumberString ~~ " " ~~ y2 : NumberString ~~ " l\n" 
                                        :> ToExpression@{{x1, y1}, {x2, y2}}]; 

可视化它们:

Graphics[{Line[lines]}]

您得到这样的信息(我正在处理的论文包含四个图形):

情节

每两个相邻的段共享一个点。因此,在这种情况下,您可以将相邻线段的序列转换为路径:

paths = Split[lines, #1[[2]] == #2[[1]] &];

现在,您可以分别可视化所有路径:

Graphics[{Line /@ paths}]

在此图中,您可以选择(双击)所需的路径,复制图形选择并粘贴为新路径Graphics。为了将其向后转换为点列表,需要使用element {1, 1, 1}。现在,这些点不在图形的坐标系中,而在PDF文件的坐标系中。我们需要建立它们之间的关系。

在上面的图中,您可以手动选择刻度线(按住Shift多项选择),然后将其复制并粘贴为new Graphics。这是提取水平刻度的坐标的方法:

屏幕截图

现在检查刻度线之间的差异:

Differences[reHorTicks]

从这些差异中,您可以看到刻度在PDF文件中的定位有多精确。它提供了通过将原始数据点转换为PDF文件中包含的向量图而引入的误差的估计。如果刻度线位置存在明显的误差,则可以通过将刻度线的坐标拟合到线性模型来减少误差。现在,可以使用此线性函数来获取路径点的原始坐标(即在绘图的坐标系中)。


2
Alexey,您曾写过。但是如今,好的做法是以矢量形式发布图形。您对哪种向量格式的最佳做法有很好的参考?(我应该在LaTeX原稿中使用svg文件的eps封装,还是应该将图形直接输出到LaTeX?)干杯。
Alexis 2014年

1
@Alexis我参考了现代期刊的建议以提供矢量形式的图形。不同的期刊接受矢量格式的不同子集。通常,当从一种格式到另一种格式的转换较少时,我希望质量更高。
Alexey Popkov 2014年

@Alexis因此,基本上,我希望以PostScript格式(EPS或PDF)之一提供图形应该是最好的选择。但是确切的答案取决于发布者使用的软件。还请注意,通常期刊建议不要对绘图软件生成的图形进行任何转换。因此,如果您可以导出为EPS,则可能是最佳选择。如果您只能导出SVG,然后在日记帐接受时提供SVG,请不要将自己转换为其他格式。
Alexey Popkov 2014年

Mathematica程序的详细描述密切相关的答案
Alexey Popkov




2

尝试使用scanit:http://amsterchem.com/scanit.html

它是免费的,可在Windows上运行






1

对于R用户,程序包grImport(在CRAN上)可以导入矢量图形并将其转换为R可以解释的对象。假设可以将PDF(或其他感兴趣的矢量格式)转换为PostScript格式。例如,可以使用Inkscape进行此操作:将File > Import您的图形的PDF页面导入()到Inkspace和File > Save As > Save as type: > PostScript *.ps。一旦有了*.ps文件,grImport小插图Importing Vector Graphics就会变得更重要,请参见'4.1。从图像中抓取数据。

您的操作系统上将需要ghostscript-尝试从此处下载。

请注意,如果您在调用时以某种方式遇到ghostscript错误“状态127” grImport::PostScriptTrace,则请从此处接受建议,即建议在计算机上手动设置ghostscript的路径。

这是一些将PostScript文件导入R的示例R代码:

install.packages("grImport")
require(grImport)
# if you get the ghostscript error 'status 127' then set the path to ghostscript, e.g.:
Sys.setenv(R_GSCMD = normalizePath("C:/Program Files/gs/gs9.22/bin/gswin64c.exe")) 
PostScriptTrace(file = "graph.ps", outfilename = "graph.ps.xml")
my_fig <- readPicture(rgmlFile = "graph.ps.xml")
grid.picture(my_fig)

请注意,如果图形位于多页PDF文件中的一页上,则可以使用分割多页文档PDFTK builder。在Ikscape中导入一页PDF文件,并删除所有多余的元素(多余的文本,多余的图形元素)。尝试捕获您感兴趣的图形元素的坐标时,这将简化您在R中的工作。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.