D'autres répondeurs supposent que vous traitez une image matricielle d'un graphe. Mais de nos jours, la bonne pratique consiste à publier des graphiques sous forme vectorielle. Dans ce cas, vous pouvez obtenir une précision beaucoup plus élevée des données récupérées et même estimer l'erreur de récupération si vous utilisez directement le code du graphe vectoriel, sans le convertir en image raster.
Étant donné que les articles sont publiés en ligne sous forme de fichiers PDF, je suppose que vous avez un fichier PDF contenant un tracé vectoriel avec les données que vous souhaitez récupérer (obtenez-le sous forme numérique) et estimez l'erreur de récupération introduite.
Tout d'abord, le format PDF est un format vectoriel qui est essentiellement textuel (peut être lu par un éditeur de texte). Le problème est qu’il peut (et presque toujours) contenir des flux de données compressés qui doivent être décompressés pour pouvoir être lus par un éditeur de texte. Ces flux de données compressés contiennent généralement les informations dont nous avons besoin.
Il existe plusieurs façons de décompresser des flux de données afin de convertir un fichier PDF en un document textuel avec un code PDF lisible. Le moyen le plus simple consiste probablement à utiliser l’ utilitaire gratuit QPDF avec l’ --stream-data=uncompress
option suivante :
qpdf infile.pdf --stream-data=uncompress -- outfile.pdf
Certains autres moyens sont décrits ici et ici .
Le fichier outfile.pdf généré peut être ouvert par un éditeur de texte. Vous avez maintenant besoin du Manuel de référence PDF 1.7 pour comprendre ce que vous voyez. Ne paniquez pas en ce moment! Vous devez connaître uniquement quelques opérateurs décrits dans le "TABLEAU 4.9 Opérateurs de construction de chemin" des pages 226 à 227. Les opérateurs les plus importants sont (la première colonne contient la spécification des coordonnées d'un opérateur, la deuxième contient l'opérateur et le troisième le nom de l'opérateur). ):
x y m moveto
x y l lineto
x y width height re rectangle
h closepath
Dans la plupart des cas, il suffit de connaître ces quatre opérateurs pour récupérer les données.
Vous devez maintenant importer le fichier outfile.pdf en tant que texte dans un programme permettant de manipuler les données. Je vais montrer comment faire avec Mathematica .
Importer le fichier:
pdfCode = Import["outfile.pdf", "Text"];
Supposons maintenant le cas le plus simple: le graphique contient une ligne composée de nombreux segments à deux points. Dans ce cas, chaque segment de la ligne est codé comme ceci:
268.79999 408.92975 m
272.39999 408.92975 l
Extraire tous ces segments du code PDF:
lines = StringCases[pdfCode,
StartOfLine ~~ x1 : NumberString ~~ " " ~~ y1 : NumberString ~~ " m\n" ~~
x2 : NumberString ~~ " " ~~ y2 : NumberString ~~ " l\n"
:> ToExpression@{{x1, y1}, {x2, y2}}];
En les visualisant:
Graphics[{Line[lines]}]
Vous obtenez quelque chose comme ceci (le document sur lequel je travaille contient quatre graphiques):
Chaque deux segments adjacents partagent un point. Donc, dans ce cas, vous pouvez transformer les séquences de segments adjacents en chemins:
paths = Split[lines, #1[[2]] == #2[[1]] &];
Vous pouvez maintenant visualiser tous les chemins séparément:
Graphics[{Line /@ paths}]
À partir de cette figure, vous pouvez sélectionner (en double-cliquant) le chemin que vous recherchez, copier la sélection de graphiques et la coller en tant que nouvelle Graphics
. Pour le convertir à l’arrière en liste de points, vous prenez l’élément {1, 1, 1}
. Nous avons maintenant les points non pas dans le système de coordonnées du graphique, mais dans le système de coordonnées du fichier PDF. Nous devons établir des relations entre eux.
Dans le graphique ci-dessus, vous sélectionnez les ticks à la main ( Shift
en les sélectionnant plusieurs fois), puis les copiez et les collez en tant que nouveaux Graphics
. Voici comment vous pouvez extraire les coordonnées des ticks horizontaux:
Maintenant, vérifiez les différences entre les ticks:
Differences[reHorTicks]
À partir de ces différences, vous pouvez voir à quel point le positionnement des graduations dans le fichier PDF est précis. Il donne une estimation de l'erreur introduite en convertissant les points de données d'origine en un graphe vectoriel inclus dans le fichier PDF. S'il y a des erreurs appréciables dans le positionnement des ticks, vous pouvez réduire l'erreur en ajustant les coordonnées des ticks à un modèle linéaire. Cette fonction linéaire peut maintenant être utilisée pour obtenir les coordonnées d'origine des points du chemin (c'est-à-dire dans le système de coordonnées du tracé).