Logiciel nécessaire pour extraire les données du graphique [fermé]

56

Quelqu'un a-t-il une expérience avec un logiciel (de préférence gratuit, de préférence open source) qui prend une image de données tracées sur des coordonnées cartésiennes (un tracé standard quotidien) et extrait les coordonnées des points tracés sur le graphique?

Il s’agit essentiellement d’un problème d’exploration de données et d’un problème de visualisation inversée des données.

Alex Holcombe
la source
2
Pour une solution, voir les commentaires à cette réponse . Les solutions open source incluraient un logiciel de traitement d'image ou un logiciel SIG raster ( GRASS est un candidat probable) ou, peut-être, GNU Octave . Je les mentionne en tant que commentaire car je ne les ai pas utilisés non plus à cette fin. Veuillez donc les prendre comme des possibilités et non comme des solutions définitives.
whuber
J'espère un code / logiciel spécifiquement conçu pour la gravure de graphiques, et je me souviens que de tels packages existaient. Au moins, ils le faisaient il y a 10 ans, mais je ne me souviens plus de leurs noms, et je ne sais pas s'ils fonctionnent avec les systèmes d'exploitation actuels. .
Alex Holcombe
@Alex, essayez Google "Graph Digitizer Open Source"
David LeBauer
Un court programme Mathematica pour obtenir des données d’analyses ici .
Sjoerd C. de Vries
1
Voir aussi la ressource que je cite dans ma réponse à Quelle est la relation entre Y et X dans ce graphique? .
Alexis

Réponses:

42

logiciel de numérisation graphique

Il existe de nombreuses options différentes, mais toutes utilisent essentiellement le même flux de travail:

  1. télécharger une image
  2. définir les échelles x et y en indiquant les valeurs en deux points de chaque axe
  3. indiquer si l'échelle est linéaire, logarithmique, etc.
  4. Cliquez sur les points.
    • Certains programmes reconnaissent automatiquement les lignes ou les points. Je suis généralement après les points, et je les trouve trop incohérents pour être utiles, même avec des centaines de points. Je n'en ai pas trouvé qui reconnaît différents symboles. Cette fonctionnalité pourrait valoir la peine pour numériser des lignes, mais je n’ai jamais eu à le faire.

Le programme renvoie chaque point sous forme de matrice xy.

Il est souvent utile de sélectionner des points si l'image est zoomée, soit en téléchargeant une version zoomée de l'image, soit en utilisant la fonctionnalité de zoom disponible dans certains programmes.

Il existe de nombreux programmes et ils varient en fonctionnalités, en convivialité, en licences et en coûts. Je les ai énumérés ci-dessous.

Tous ceux que j'ai utilisés fonctionnent bien. Sauf dans des contextes où l'erreur de mesure est très petite, l'erreur de grattage de graphique est non significative (par exemple, erreur de numérisation << taille des barres d'erreur ou incertitude dans l'estimation). Si n’avons pas testé l’exactitude de l’un de ces programmes, il serait intéressant de comparer les utilisateurs, les programmes et les résultats d’analyses statistiques reproduites.

Programmes que j'ai utilisés:

  • Reconnaissance automatique de point / ligne par le numériseur (logiciel libre, GPL). Disponible dans le référentiel Ubuntu (engauge-digitizer)
  • Obtenir des données (shareware) a fenêtre de zoom, reconnaissance automatique de point / ligne
  • DigitizeIt (shareware) reconnaissance automatique de point / ligne
  • ImageJ (open source, plus extensible après R digitize)
  • R digitize (gratuit, open source), parce que cela simplifie les processus d'obtention de données du graphique dans une analyse en conservant toutes les étapes dans R. Voir le tutoriel dans R-Journal
  • Attrape le! (démo gratuite, 69 $) plug-in Excel
  • WebPlotDigitzer (gratuit, en ligne). Basé sur le navigateur, extrait les données des images. Examiné ici .

Programmes que je n'ai pas utilisés:

  • GraphClick (Mac, 8 $)
  • g3data (open source - GNU GPL) Dispose d'une fenêtre de zoom, pas de reconnaissance automatique. Disponible dans le référentiel Ubuntu.
  • GRABIT OpenSource (BSD) plug-in qui s’exécute sur une plate-forme propriétaire, Matlab

TL; DR: WebPlotDigitizer est disponible en tant qu’application Web et plug-in chrome.

David LeBauer
la source
g3data (open source - GNU GPL) a une fenêtre de zoom, pas de reconnaissance automatique. Disponible dans le référentiel Ubuntu. Je ne peux pas comparer, car c'est le seul que j'ai essayé; mais je l'ai trouvé très facile à utiliser.
Scortchi - Réintégrer Monica
Pourquoi R digitize a été retiré du CRAN?
Léo Léopold Hertz
1
@ La plupart d'entre eux ne fonctionnent pas avec pdf, avec les fichiers pdf, je grossis la figure puis j'utilise une capture d'écran (par exemple, cmd-shift-4 sur Mac) pour enregistrer une figure au format jpg ou png.
David LeBauer
1
@Masi Conserver un paquet sur CRAN peut prendre beaucoup de travail supplémentaire. Le package est disponible sur GitHub github.com/tpoisot/digitize
David LeBauer
1
@Masi qu'est-ce que vous entendez par «systématiquement»? Pouvez-vous créer un lien vers la ou les figures en question? Quand vous dites "intersecter", voulez-vous dire que le point est contenu dans l'axe et n'apparaît donc pas?
David LeBauer
16

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=uncompressoption 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):

terrain

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 ( Shiften 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:

capture d'écran

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é).

Alexey Popkov
la source
2
Alexey, vous avez écrit Mais de nos jours, la bonne pratique consiste à publier des graphiques sous forme vectorielle. Avez-vous une bonne référence pour les meilleures pratiques autour de quel (s) format (s) vectoriel (s)? (Par exemple, devrais-je utiliser une encapsulation eps d'un fichier svg dans mes manuscrits LaTeX, ou suis-je censé générer un graphique directement vers LaTeX?) À la vôtre.
Alexis
1
@Alexis Je me réfère aux recommandations de la revue moderne pour fournir des graphiques sous forme vectorielle. Différentes revues acceptent différents sous-ensembles de formats vectoriels. En général, je m'attends à une meilleure qualité lorsqu'il y a de petites transformations d'un format à un autre.
Alexey Popkov
@Alexis Donc, je pense que la meilleure option est de fournir des graphiques dans l’un des formats PostScript (EPS ou PDF). Mais la réponse exacte dépend du logiciel utilisé par l'éditeur. Notez également que les journaux recommandent généralement toute conversion des graphiques produits par votre logiciel de création de graphiques. Donc, si vous pouvez exporter au format EPS, c'est probablement la meilleure option. Si vous ne pouvez exporter que SVG, fournissez SVG si le journal l'accepte, ne vous convertissez pas dans un autre format.
Alexey Popkov
Réponse étroitement liée avec une description détaillée de la procédure à suivre pour Mathematica .
Alexey Popkov
2

Vous pouvez également essayer im2graph ( http://www.im2graph.co.il ) pour convertir des graphiques en données. Fonctionne sous Linux et Windows.

Shai Vaingast
la source
2

J'ai dû faire cela tellement de fois au cours de ma carrière que j'ai finalement créé un programme javascript disponible ici:

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

Désolé, mais vous devrez toujours cliquer sur chaque point. Bien que vous puissiez utiliser les touches fléchées, vous éviterez des tensions au poignet.

Kevin Dusling
la source
1

Pour les Rutilisateurs, le package grImport(sur CRAN ) peut importer des graphiques vectoriels et les convertir en objets pouvant être interprétés par R. Cela suppose que l’on puisse convertir les PDF (ou tout autre format vectoriel d’intérêt) au format PostScript. Cela peut être fait par exemple avec Inkscape : importez ( File > Import) votre page PDF avec votre figure dans Inkspace et File > Save As > Save as type: > PostScript *.ps. Une fois votre *.psfichier remplacé par la grImportvignette Importation de graphiques vectoriels , la section '4.1. Gratter les données des images '.

Vous aurez besoin de ghostscript sur votre système d'exploitation - essayez de le télécharger à partir d' ici .

Notez que si vous rencontrez une erreur ghostscript 'status 127' lorsque vous appelez grImport::PostScriptTrace, alors suivez la recommandation qui suit , qui consiste à définir manuellement le chemin d'accès à ghostscript sur votre ordinateur.

Voici un exemple de code R permettant d'importer un fichier PostScript dans 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)

Notez que si votre graphique se trouve sur une page d'un fichier PDF de plusieurs pages, vous pouvez alors scinder le document de plusieurs pages avec PDFTK builder. Importez votre fichier PDF d'une page dans Ikscape et supprimez tous les éléments supplémentaires (texte supplémentaire, éléments graphiques supplémentaires). Cela facilitera votre travail dans R lorsque vous essaierez de saisir les coordonnées des éléments graphiques qui vous intéressent.

Valentine
la source