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

机器算法验证 数据可视化 数据挖掘 软件
2022-01-19 03:59:45

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

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

4个回答

图形数字化软件

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

  1. 上传图片
  2. 通过指示每个轴上两个点的值来设置 x 和 y 比例
  3. 指示刻度是否为线性、对数等,
  4. 点击点。
    • 一些程序会自动识别线或点。我通常追求分数,我发现它们太不一致了,即使有 100 分也无济于事。我还没有找到一个识别不同符号的。这个功能对于数字化线路来说是值得的,但我从来没有这样做过。

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

如果图像被缩放,通常它有助于选择点,或者通过上传图像的缩放版本或使用某些程序中可用的缩放功能。

有许多程序,它们在额外功能、可用性、许可和成本方面各不相同。我在下面列出了它们。

我用过的所有东西都可以正常工作。除了在测量误差非常小的情况下,来自图形抓取的误差是微不足道的(例如,来自数字化的误差 << 误差条的大小或估计中的不确定性)。如果没有测试任何这些程序的准确性,但是在用户之间、程序之间进行比较以及与复制的统计分析结果进行比较会很有趣。

我用过的程序:

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

我没用过的程序:

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

查看R的数字化它旨在解决这类问题。

其他回答者假设您处理图形的光栅图像。但如今,好的做法是以矢量形式发布图形。在这种情况下,如果您直接使用矢量图的代码而不将其转换为光栅图像,您可以获得更高的恢复数据的准确性,甚至可以估计恢复错误。

由于论文以 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(共享软件)。