任何人都具有使用软件(最好是免费的,最好是开放源代码)的经验,该软件将拍摄在笛卡尔坐标上绘制的数据图像(标准的日常绘制),并提取图中绘制的点的坐标?
本质上,这是一个数据挖掘问题和一个反向数据可视化问题。
任何人都具有使用软件(最好是免费的,最好是开放源代码)的经验,该软件将拍摄在笛卡尔坐标上绘制的数据图像(标准的日常绘制),并提取图中绘制的点的坐标?
本质上,这是一个数据挖掘问题和一个反向数据可视化问题。
Answers:
有很多不同的选项,但基本上都使用相同的工作流程:
程序将每个点作为xy矩阵返回。
通常,它可以通过上载图像的缩放版本或使用某些程序中提供的缩放功能来帮助选择缩放图像的点。
程序很多,它们在附加功能,可用性,许可和成本方面也各不相同。我在下面列出了它们。
我使用的所有工具都可以正常工作。除非在测量误差很小的情况下,否则图形刮擦产生的误差是微不足道的(例如,数字化误差<<误差线的大小或估计中的不确定性)。如果尚未测试任何这些程序的准确性,但是在用户之间,程序之间以及与复制的统计分析结果进行比较将是很有趣的。
TL; DR: WebPlotDigitizer可作为Web应用程序和chrome插件使用
其他答复者假定您处理图形的栅格图像。但是,如今的好习惯是以矢量形式发布图形。在这种情况下,如果直接使用矢量图的代码,而无需将其转换为光栅图像,则可以提高恢复数据的准确性,甚至可以估计恢复错误。
由于这些论文以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文件中包含的向量图而引入的误差的估计。如果刻度线位置存在明显的误差,则可以通过将刻度线的坐标拟合到线性模型来减少误差。现在,可以使用此线性函数来获取路径点的原始坐标(即在绘图的坐标系中)。
我没有使用过它,但是UWA CogSci实验室推荐使用DataThief(共享软件)。
查看Engauge。它的免费和开源 http://digitizer.sourceforge.net/
您也可以尝试使用im2graph(http://www.im2graph.co.il)将图形转换为数据。在Linux和Windows中均可使用。
“ g3data”是可用于实现您的目的的软件。这是一个免费软件,我已经使用过。您可以从这里下载:http : //www.frantz.fi/software/g3data.php
在我的职业生涯中,我不得不这样做很多次,最终我最终编写了一个javascript程序,可以在这里找到:
http://kdusling.github.io/projects/DataGrab/index.html
抱歉,您仍然需要单击每个点。虽然您可以使用箭头键来节省手腕的压力。
STIPlotDigitizer已新发布。
http://stiwww.com/product/software-techniques-plot-digitizer
对于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中的工作。