Software necesario para extraer datos del gráfico [cerrado]

56

¿Alguien tiene alguna experiencia con software (preferiblemente gratuito, preferiblemente de código abierto) que tomará una imagen de datos trazados en coordenadas cartesianas (un diagrama estándar, cotidiano) y extraerá las coordenadas de los puntos trazados en el gráfico?

Esencialmente, este es un problema de minería de datos y un problema de visualización inversa de datos.

Alex Holcombe
fuente
2
Para una solución, vea los comentarios a esta respuesta . Las soluciones de código abierto incluirían el procesamiento de imágenes o el software raster GIS ( GRASS es un candidato probable) o, tal vez, GNU Octave . Los menciono como un comentario porque no los he usado para este propósito específico, así que tómalos como posibilidades, no como soluciones definitivas.
whuber
Espero código / software específicamente para raspar gráficos, y recuerdo que tales paquetes existían, al menos hace 10 años, pero no puedo recordar sus nombres ahora, y no sé si funcionan en los sistemas operativos actuales .
Alex Holcombe
@Alex, intenta buscar en Google "Graph Digitizer Open Source"
David LeBauer
Un breve programa de Mathematica para obtener datos de escaneos aquí .
Sjoerd C. de Vries
1
Vea también el recurso que señalo en mi respuesta a ¿Cuál es la relación entre Y y X en esta gráfica? .
Alexis

Respuestas:

38

Echa un vistazo a la digitize paquete para R . Está diseñado para resolver exactamente este tipo de problema.

Zach
fuente
44
Hay un buen artículo / tutorial en R Journal, junio de 2011
David LeBauer
42

software de digitalización de gráficos

Hay muchas opciones diferentes, pero todas utilizan básicamente el mismo flujo de trabajo:

  1. subir una imagen
  2. establezca las escalas xey indicando los valores en dos puntos en cada eje
  3. indicar si la escala es lineal, log, etc.
  4. Haga clic en los puntos.
    • Algunos de los programas reconocen automáticamente líneas o puntos. Normalmente busco puntos, y los encuentro demasiado inconsistentes para ser útiles incluso con cientos de puntos. No he encontrado uno que reconozca diferentes símbolos. Esta característica podría valer la pena para digitalizar líneas, pero nunca he tenido que hacer esto.

El programa devuelve cada punto como una matriz xy.

A menudo ayuda a seleccionar puntos si la imagen se amplía, ya sea cargando una versión ampliada de la imagen o utilizando la función de zoom disponible en algunos de los programas.

Hay muchos programas y varían en características adicionales, usabilidad, licencias y costos. Los he enumerado a continuación.

Todos los que he usado funcionan bien. Excepto en contextos donde el error de medición es muy pequeño, el error del raspado del gráfico es insignificante (por ejemplo, error de digitalización << tamaño de las barras de error o incertidumbre en la estimación). Si no ha probado la precisión de ninguno de estos programas, sería interesante comparar entre usuarios, entre programas y con los resultados de análisis estadísticos reproducidos.

Programas que he usado:

  • Digitalizador (software libre, GPL) reconocimiento automático de punto / línea. Disponible en el repositorio de Ubuntu (engauge-digitizer)
  • Obtener datos (shareware) tiene ventana de zoom, reconocimiento automático de punto / línea
  • DigitizeIt (shareware) reconocimiento automático de punto / línea
  • ImageJ (código abierto, más extensible después de R digitalizar)
  • R digitalizar (libre, de código abierto), porque simplifica los procesos de obtención de datos del gráfico en un análisis al mantener todos los pasos en R. Vea el tutorial en R-Journal
  • ¡Agarrarlo! (demostración gratuita, $ 69) complemento de Excel
  • WebPlotDigitzer (gratis, en línea). Basado en navegador, extrae datos de imágenes. Revisada aquí .

Programas que no he usado:

  • GraphClick (Mac, $ 8)
  • g3data (código abierto - GNU GPL) Tiene ventana de zoom, sin reconocimiento automático. Disponible en el repositorio de Ubuntu.
  • Complemento GRABIT OpenSource (BSD) que se ejecuta en una plataforma patentada, Matlab

TL; DR: WebPlotDigitizer está disponible como una aplicación web , así como un complemento de Chrome

David LeBauer
fuente
g3data (código abierto - GNU GPL) tiene ventana de zoom, sin reconocimiento automático. Disponible en el repositorio de Ubuntu. No puedo comparar, ya que es el único que he probado; pero me pareció muy fácil de usar.
Scortchi - Restablece a Monica
¿Por qué se eliminó R digitalize de CRAN?
Léo Léopold Hertz 준영
1
@Masi la mayoría de estos no funcionan con pdf, con archivos pdf agrando la figura y luego uso una captura de pantalla (por ejemplo, cmd-shift-4 en Mac) para guardar una figura como jpg o png.
David LeBauer
1
@Masi Mantener un paquete en CRAN puede ser mucho trabajo adicional. El paquete está disponible en GitHub github.com/tpoisot/digitize
David LeBauer
1
@ Masi, ¿qué quieres decir específicamente con 'sistemáticamente'? ¿Puedes vincular a las figuras en cuestión? Cuando dice 'intersectar', ¿quiere decir que el punto está contenido dentro del eje y por lo tanto no aparece?
David LeBauer
16

Otros respondedores suponen que se trata con la imagen ráster de un gráfico. Pero hoy en día la buena práctica es publicar gráficos en forma vectorial. En este caso, puede lograr una precisión mucho mayor de los datos recuperados e incluso estimar el error de recuperación si trabaja directamente con el código del gráfico vectorial, sin convertirlo en una imagen ráster.

Dado que los documentos se publican en línea como archivos PDF, supongo que tiene un archivo PDF que contiene un diagrama vectorial con los datos que desea recuperar (obtener en forma numérica) y estimar el error de recuperación introducido.

Primero que nada, PDF es un formato vectorial que es básicamente textual (puede ser leído por un editor de texto). El problema es que puede (y casi siempre) contener flujos de datos comprimidos que deben descomprimirse para poder leerlos un editor de texto. Estos flujos de datos comprimidos generalmente contienen la información que necesitamos.

Hay varias formas de descomprimir flujos de datos para convertir un archivo PDF en un documento de texto con un código PDF legible. Probablemente la forma más simple es usar la utilidad QPDF gratuita con la --stream-data=uncompressopción :

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

Algunas otras formas se describen aquí y aquí .

Un archivo de texto puede abrir el archivo outfile.pdf generado. Ahora necesita el Manual de referencia en PDF 1.7 para comprender lo que ve. ¡No se asuste en este momento! Solo necesita conocer algunos operadores descritos en la "TABLA 4.9 Operadores de construcción de caminos" en las páginas 226 - 227. Los operadores más importantes son (la primera columna contiene la especificación de coordenadas para un operador, la segunda contiene el operador y la tercera es el nombre del operador ):

x y               m   moveto 

x y               l   lineto 

x y width height  re  rectangle

                  h   closepath

En la mayoría de los casos, es suficiente conocer estos cuatro operadores para recuperar los datos.

Ahora necesita importar el archivo outfile.pdf como texto en algún programa donde pueda manipular los datos. Te mostraré cómo hacerlo con Mathematica .

Importando el archivo:

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

Ahora supongo el caso más simple: el gráfico contiene una línea que consta de muchos segmentos de dos puntos. En este caso, cada segmento de la línea se codifica así:

268.79999 408.92975 m
272.39999 408.92975 l

Extraer todos estos segmentos del código PDF:

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

Visualizándolos:

Graphics[{Line[lines]}]

Obtiene algo como esto (el documento con el que estoy trabajando contiene cuatro gráficos):

trama

Cada dos segmentos adyacentes comparten un punto. Entonces, en este caso, puede convertir las secuencias de segmentos adyacentes en rutas:

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

Ahora puede visualizar todas las rutas por separado:

Graphics[{Line /@ paths}]

A partir de esta figura, puede seleccionar (haciendo doble clic) la ruta que está buscando, copiar la selección de gráficos y pegarla como nueva Graphics. Para convertirlo hacia atrás a la lista de puntos, toma el elemento {1, 1, 1}. Ahora tenemos los puntos no en el sistema de coordenadas del gráfico sino en el sistema de coordenadas del archivo PDF. Necesitamos establecer una relación entre ellos.

De la gráfica anterior, selecciona los ticks a mano (manteniéndolos presionados Shiftpara una selección múltiple), luego cópielos y péguelos como nuevos Graphics. Así es como puede extraer coordenadas de tics horizontales:

captura de pantalla

Ahora verifique las diferencias entre las garrapatas:

Differences[reHorTicks]

A partir de estas diferencias, puede ver cuán preciso es el posicionamiento de las marcas en el archivo PDF. Ofrece una estimación del error introducido al convertir los puntos de datos originales en un gráfico vectorial incluido en el archivo PDF. Si hay errores apreciables en el posicionamiento de las marcas, puede reducir el error ajustando las coordenadas de las marcas a un modelo lineal. Esta función lineal ahora se puede utilizar para obtener coordenadas originales de puntos de la ruta (que está en el sistema de coordenadas de la trama).

Alexey Popkov
fuente
2
Alexey, escribiste Pero hoy en día la buena práctica es publicar gráficos en forma vectorial. ¿Tiene una buena referencia para las mejores prácticas en torno a qué formato (s) de vector? (¿Debería usar una encapsulación eps de un archivo svg en mis manuscritos de LaTeX, o se supone que debo enviar el gráfico a LaTeX directamente?) Saludos.
Alexis
1
@Alexis Me refiero a las recomendaciones de la revista moderna para proporcionar gráficos en forma vectorial. Diferentes revistas aceptan diferentes subconjuntos de formatos vectoriales. En general, espero una mejor calidad cuando hay transformaciones menores de un formato a otro.
Alexey Popkov
@Alexis Entonces, básicamente, espero que proporcionar gráficos en uno de los formatos PostScript (EPS o PDF) sea la mejor opción. Pero la respuesta exacta depende del software utilizado por el editor. Tenga en cuenta también que, por lo general, las revistas recomiendan contra cualquier conversión de los gráficos producidos por su software de gráficos. Entonces, si puede exportar como EPS, probablemente sea la mejor opción. Si solo puede exportar SVG, proporcione SVG si el diario lo acepta, no se convierta a otro formato.
Alexey Popkov
Respuesta muy relacionada con una descripción detallada del procedimiento para Mathematica .
Alexey Popkov
2

Tuve que hacer esto tantas veces en mi carrera que eventualmente armé un programa de JavaScript que está disponible aquí:

http://kdusling.github.io/projects/DataGrab/index.html

Lo sentimos, pero aún tendrá que hacer clic en cada punto. Aunque puede usar las teclas de flecha que ahorran algo de esfuerzo en la muñeca.

Kevin Dusling
fuente
1

Para los Rusuarios, el paquete grImport(en CRAN ) puede importar gráficos vectoriales y convertirlos en objetos que R puede interpretar. Se supone que uno puede convertir PDF (u otro formato vectorial de interés) a formato PostScript. Esto se puede hacer, por ejemplo, con Inkscape : importe ( File > Import) su página PDF con su figura en Inkspace y File > Save As > Save as type: > PostScript *.ps. Una vez que tenga su *.psarchivo en barbecho de la grImportviñeta Importación de gráficos vectoriales , más relevante será la sección '4.1. Raspado de datos de imágenes '.

Necesitará ghostscript en su sistema operativo; intente descargarlo desde aquí .

Tenga en cuenta que si de alguna manera se encuentra con el error 'estado 127' de ghostscript cuando llama grImport::PostScriptTrace, entonces siga la recomendación desde aquí , que dice configurar manualmente la ruta a ghostscript en su máquina.

Aquí hay un código R de muestra para importar un archivo PostScript a 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)

Tenga en cuenta que si su gráfico está en una página en un archivo PDF de varias páginas, puede dividir el documento de varias páginas con PDFTK builder. Importe su archivo PDF de una página en Ikscape y elimine cualquier elemento adicional (texto adicional, elementos gráficos adicionales). Esto facilitará su trabajo en R cuando intente capturar las coordenadas de los elementos gráficos que le interesan.

Valentine
fuente