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=uncompress
opció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):
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 Shift
para una selección múltiple), luego cópielos y péguelos como nuevos Graphics
. Así es como puede extraer coordenadas de tics horizontales:
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).