Outros respondentes assumem que você lida com a imagem rasterizada de um gráfico. Hoje em dia, porém, a boa prática é publicar gráficos em forma de vetor. Nesse caso, você pode obter uma exatidão muito maior dos dados recuperados e até estimar o erro de recuperação se trabalhar com o código do gráfico vetorial diretamente, sem convertê-lo em imagem rasterizada.
Como os artigos são publicados on-line como arquivos PDF, presumo que você tenha um arquivo PDF que contenha gráficos vetoriais com os dados que deseja recuperar (entre em forma numérica) e estime o erro de recuperação introduzido.
Antes de tudo, o PDF é um formato vetorial basicamente textual (pode ser lido por um editor de texto). O problema é que ele pode (e quase sempre) contém fluxos de dados compactados que precisam ser descompactados para serem lidos por um editor de texto. Esses fluxos de dados compactados geralmente contêm as informações de que precisamos.
Existem várias maneiras de descompactar fluxos de dados para converter arquivos PDF em um documento textual com código PDF legível. Provavelmente, a maneira mais simples é usar o utilitário QPDF gratuito com a --stream-data=uncompress
opção :
qpdf infile.pdf --stream-data=uncompress -- outfile.pdf
Algumas outras maneiras são descritas aqui e aqui .
O outfile.pdf gerado pode ser aberto por um editor de texto. Agora você precisa do PDF Reference Manual 1.7 para entender o que vê. Não entre em pânico neste momento! Você precisa conhecer apenas alguns operadores descritos na "TABELA 4.9 Operadores de construção de caminhos" nas páginas 226 - 227. Os operadores mais importantes são (a primeira coluna contém especificações de coordenadas para um operador, a segunda contém o operador e a terceira é o nome do operador ):
x y m moveto
x y l lineto
x y width height re rectangle
h closepath
Na maioria dos casos, é suficiente conhecer esses quatro operadores para recuperar os dados.
Agora você precisa importar o arquivo outfile.pdf como texto para algum programa em que possa manipular os dados. Vou mostrar como fazer isso com o Mathematica .
Importando o arquivo:
pdfCode = Import["outfile.pdf", "Text"];
Agora, assumo o caso mais simples: o gráfico contém uma linha que consiste em muitos segmentos de dois pontos. Nesse caso, cada segmento da linha é codificado da seguinte maneira:
268.79999 408.92975 m
272.39999 408.92975 l
Extraindo todos esses segmentos do código PDF:
lines = StringCases[pdfCode,
StartOfLine ~~ x1 : NumberString ~~ " " ~~ y1 : NumberString ~~ " m\n" ~~
x2 : NumberString ~~ " " ~~ y2 : NumberString ~~ " l\n"
:> ToExpression@{{x1, y1}, {x2, y2}}];
Visualizando-os:
Graphics[{Line[lines]}]
Você obtém algo assim (o trabalho com o qual estou trabalhando contém quatro gráficos):
Cada dois segmentos adjacentes compartilham um ponto. Portanto, neste caso, você pode transformar as seqüências de segmentos adjacentes em caminhos:
paths = Split[lines, #1[[2]] == #2[[1]] &];
Agora você pode visualizar todos os caminhos separadamente:
Graphics[{Line /@ paths}]
Nesta figura, você pode selecionar (clicando duas vezes) o caminho que procura, copiar a seleção de gráficos e colar como novo Graphics
. Para convertê-lo para trás na lista de pontos, você pega o elemento {1, 1, 1}
. Agora, temos os pontos não no sistema de coordenadas do gráfico, mas no sistema de coordenadas do arquivo PDF. Precisamos estabelecer um relacionamento entre eles.
No gráfico acima, você seleciona os carrapatos manualmente (segurando Shift
para seleção múltipla), depois os copia e cola como novo Graphics
. Aqui está como você pode extrair coordenadas de marcações horizontais:
Agora verifique as diferenças entre os ticks:
Differences[reHorTicks]
A partir dessas diferenças, você pode ver o quão preciso é o posicionamento dos ticks no arquivo PDF. Ele fornece uma estimativa do erro introduzido pela conversão de pontos de dados originais em gráficos vetoriais incluídos no arquivo PDF. Se houver erros consideráveis no posicionamento de ticks, você poderá reduzir o erro ajustando as coordenadas dos ticks a um modelo linear. Agora, essa função linear pode ser usada para obter coordenadas originais dos pontos do caminho (que estão no sistema de coordenadas do gráfico).