Software, die benötigt wird, um Daten aus dem Diagramm zu entfernen [geschlossen]

56

Hat jemand Erfahrung mit Software (am besten kostenlos, am besten Open Source), die ein Bild von Daten aufnimmt, die auf kartesischen Koordinaten aufgezeichnet sind (ein normaler, alltäglicher Plot), und die Koordinaten der Punkte extrahiert, die in der Grafik aufgezeichnet sind?

Dies ist im Wesentlichen ein Data-Mining-Problem und ein umgekehrtes Datenvisualisierungsproblem.

Alex Holcombe
quelle
2
Eine Lösung finden Sie in den Kommentaren zu dieser Antwort . Open-Source-Lösungen umfassen Bildverarbeitungs- oder Raster-GIS-Software ( GRASS ist ein wahrscheinlicher Kandidat) oder möglicherweise GNU Octave . Ich erwähne diese als Kommentar, weil ich sie auch nicht für diesen speziellen Zweck verwendet habe, also nimm sie bitte als Möglichkeiten, nicht als definitive Lösungen.
Whuber
Ich hoffe auf Code / Software speziell für das Scraping von Diagrammen, und ich erinnere mich, dass es solche Pakete gab, zumindest vor 10 Jahren, aber ich kann mich jetzt nicht an ihre Namen erinnern und weiß nicht, ob sie auf aktuellen Betriebssystemen funktionieren .
Alex Holcombe
@ Alex, versuchen Sie googeln "Graph Digitizer Open Source"
David LeBauer
Ein kurzes Mathematica-Programm, um Daten von Scans hier abzurufen .
Sjoerd C. de Vries
1
Siehe auch die Ressource, auf die ich in meiner Antwort auf Was ist die Beziehung zwischen Y und X in dieser Darstellung? .
Alexis

Antworten:

42

Graph Digitalisierungssoftware

Es gibt viele verschiedene Optionen, aber alle verwenden grundsätzlich den gleichen Workflow:

  1. Lade ein Bild hoch
  2. Stellen Sie die x- und y-Skalierung ein, indem Sie die Werte an zwei Punkten auf jeder Achse angeben
  3. Geben Sie an, ob der Maßstab linear ist, loggen Sie usw.
  4. Klicken Sie auf die Punkte.
    • Einige Programme erkennen automatisch Linien oder Punkte. Ich bin in der Regel nach Punkten, und ich finde sie zu inkonsistent, um auch mit Hunderten von Punkten hilfreich zu sein. Ich habe keine gefunden, die verschiedene Symbole erkennt. Diese Funktion könnte den Aufwand für die Digitalisierung von Leitungen wert sein, aber ich musste dies nie tun.

Das Programm gibt jeden Punkt als xy-Matrix zurück.

Oft hilft es, Punkte auszuwählen, wenn das Bild gezoomt wird, indem entweder eine gezoomte Version des Bildes hochgeladen oder die Zoomfunktion verwendet wird, die in einigen Programmen verfügbar ist.

Es gibt viele Programme, die sich durch zusätzliche Funktionen, Benutzerfreundlichkeit, Lizenzierung und Kosten unterscheiden. Ich habe sie unten aufgeführt.

Alle, die ich benutzt habe, funktionieren einwandfrei. Außer in Kontexten, in denen der Messfehler sehr klein ist, ist der Fehler durch das Schaben des Graphen unbedeutend (z. B. Fehler durch Digitalisierung << Größe der Fehlerbalken oder Unsicherheit in der Schätzung). Wenn Sie die Genauigkeit eines dieser Programme nicht getestet haben, wäre ein Vergleich zwischen Benutzern, Programmen und den Ergebnissen reproduzierter statistischer Analysen interessant.

Programme, die ich benutzt habe:

  • Digitizer (freie Software, GPL) Automatische Punkt- / Linienerkennung. Verfügbar im Ubuntu Repository (engauge-digitizer)
  • Get Data (Shareware) verfügt über ein Zoomfenster und eine automatische Punkt- / Linienerkennung
  • DigitizeIt (Shareware) Automatische Punkt- / Linienerkennung
  • ImageJ (Open Source, am erweiterbarsten nach R-Digitalisierung)
  • R digitalisieren (kostenlos, Open Source), da es den Prozess des Abrufs von Daten aus dem Diagramm in eine Analyse vereinfacht, indem alle Schritte in R beibehalten werden. Siehe Tutorial in R-Journal
  • Nimm es! (kostenlose Demo, $ 69) Excel-Plug-In
  • WebPlotDigitzer (kostenlos, online). Browser-basiert, extrahiert Daten aus Bildern. Hier rezensiert .

Programme, die ich nicht benutzt habe:

  • GraphClick (Mac, 8 US-Dollar)
  • g3data (Open Source - GNU GPL) Verfügt über ein Zoomfenster , keine automatische Erkennung. Verfügbar im Ubuntu-Repository.
  • GRABIT OpenSource (BSD) -Plugin , das auf einer proprietären Plattform, Matlab, ausgeführt wird

TL; DR: WebPlotDigitizer ist als Webanwendung sowie als Chrome-Plugin verfügbar

David LeBauer
quelle
g3data (Open Source - GNU GPL) hat ein Zoomfenster , keine automatische Erkennung. Verfügbar im Ubuntu-Repository. Ich kann es nicht vergleichen, da es das einzige ist, das ich ausprobiert habe. aber ich fand es sehr einfach zu bedienen.
Scortchi
Warum wurde R digitize aus CRAN entfernt?
Léo Léopold Hertz 준영
1
@Masi die meisten funktionieren nicht mit PDF, mit PDF-Dateien mache ich die Figur groß und speichere dann eine Figur mit einem Screenshot (zB cmd-shift-4 auf dem Mac) als JPG oder PNG.
David LeBauer
1
@Masi Das Verwalten eines CRAN-Pakets kann eine Menge zusätzlicher Arbeit bedeuten. Das Paket ist auf GitHub github.com/tpoisot/digitize
David LeBauer
1
@Masi was genau meinst du mit "systematisch"? Können Sie eine Verknüpfung zu den fraglichen Figuren herstellen? Wenn Sie "Schnittpunkt" sagen, bedeutet dies, dass der Punkt in der Achse enthalten ist und daher nicht angezeigt wird?
David LeBauer
16

Andere Antwortende gehen davon aus, dass Sie sich mit dem Rasterbild eines Diagramms befassen. Heutzutage ist es jedoch empfehlenswert, Diagramme in Vektorform zu veröffentlichen. In diesem Fall können Sie eine viel höhere Genauigkeit der wiederhergestellten Daten erzielen und sogar den Wiederherstellungsfehler abschätzen, wenn Sie direkt mit dem Code des Vektordiagramms arbeiten, ohne ihn in ein Rasterbild umzuwandeln.

Da die Artikel online als PDF-Dateien veröffentlicht werden, gehe ich davon aus, dass Sie über eine PDF-Datei verfügen, die ein Vektordiagramm mit Daten enthält, die Sie wiederherstellen möchten (in numerischer Form), und den eingeführten Wiederherstellungsfehler zu schätzen.

Zunächst einmal ist PDF ein Vektorformat, das im Grunde genommen aus Text besteht (das von einem Texteditor gelesen werden kann). Das Problem ist, dass es (und fast immer) komprimierte Datenströme enthalten kann, die dekomprimiert werden müssen, um von einem Texteditor gelesen zu werden. Diese komprimierten Datenströme enthalten normalerweise die Informationen, die wir benötigen.

Es gibt verschiedene Möglichkeiten, Datenströme zu dekomprimieren, um PDF-Dateien in Textdokumente mit lesbarem PDF-Code zu konvertieren. Der wahrscheinlich einfachste Weg ist die Verwendung des kostenlosen QPDF-Dienstprogramms mit der --stream-data=uncompressOption :

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

Einige andere Möglichkeiten werden hier und hier beschrieben .

Die erzeugte Datei outfile.pdf kann mit einem Texteditor geöffnet werden. Jetzt benötigen Sie PDF Reference Manual 1.7, um zu verstehen, was Sie sehen. In diesem Moment keine Panik! Sie müssen nur wenige Operatoren kennen, die in "TABELLE 4.9 Pfadkonstruktionsoperatoren" auf den Seiten 226 - 227 beschrieben sind. Die wichtigsten Operatoren sind (die erste Spalte enthält die Koordinatenspezifikation für einen Operator, die zweite enthält den Operator und die dritte den Operatornamen) ):

x y               m   moveto 

x y               l   lineto 

x y width height  re  rectangle

                  h   closepath

In den meisten Fällen reicht es aus, diese vier Operatoren zu kennen, um die Daten wiederherzustellen.

Jetzt müssen Sie die Datei outfile.pdf als Text in ein Programm importieren, in dem Sie die Daten bearbeiten können. Ich werde zeigen, wie es mit Mathematica geht .

Datei importieren:

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

Nun nehme ich den einfachsten Fall an: Der Graph enthält eine Linie, die aus vielen Zweipunktsegmenten besteht. In diesem Fall wird jedes Segment der Zeile folgendermaßen codiert:

268.79999 408.92975 m
272.39999 408.92975 l

Alle diese Segmente aus dem PDF-Code extrahieren:

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

Visualisierung:

Graphics[{Line[lines]}]

Sie erhalten so etwas (das Papier, mit dem ich arbeite, enthält vier Grafiken):

Handlung

Jeweils zwei benachbarte Segmente teilen sich einen Punkt. In diesem Fall können Sie also die Sequenzen benachbarter Segmente in Pfade umwandeln:

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

Jetzt können Sie alle Pfade separat visualisieren:

Graphics[{Line /@ paths}]

In dieser Abbildung können Sie den gewünschten Pfad auswählen (durch Doppelklicken), die Grafikauswahl kopieren und als neue Grafik einfügen Graphics. Um es rückwärts in eine Liste von Punkten umzuwandeln, nehmen Sie das Element {1, 1, 1}. Jetzt haben wir die Punkte nicht im Koordinatensystem der Grafik, sondern im Koordinatensystem der PDF-Datei. Wir müssen eine Beziehung zwischen ihnen herstellen.

Aus dem obigen Diagramm wählen Sie die Häkchen mit der Hand aus (halten Sie die Maustaste Shiftfür die Mehrfachauswahl gedrückt), kopieren sie dann und fügen sie als neu ein Graphics. So können Sie Koordinaten horizontaler Hilfsstriche extrahieren:

Bildschirmfoto

Überprüfen Sie nun die Unterschiede zwischen den Ticks:

Differences[reHorTicks]

An diesen Unterschieden können Sie erkennen, wie genau die Ticks in der PDF-Datei positioniert sind. Es gibt eine Schätzung des Fehlers, der durch Konvertieren der ursprünglichen Datenpunkte in ein in der PDF-Datei enthaltenes Vektordiagramm eingeführt wird. Wenn es merkliche Fehler bei der Positionierung von Ticks gibt, können Sie den Fehler reduzieren, indem Sie die Koordinaten von Ticks an ein lineares Modell anpassen. Diese lineare Funktion kann jetzt verwendet werden, um die ursprünglichen Koordinaten von Punkten des Pfades (dh im Koordinatensystem des Diagramms) abzurufen.

Alexey Popkov
quelle
2
Alexey, Sie haben geschrieben. Heutzutage besteht die gute Praxis darin, Diagramme in Vektorform zu veröffentlichen. Haben Sie eine gute Referenz für Best Practices für welche Vektorformate? (Soll ich eine EPS-Kapselung einer SVG-Datei in meinen LaTeX-Manuskripten verwenden oder soll ich Grafiken direkt in LaTeX ausgeben?) Prost.
Alexis
1
@Alexis Ich beziehe mich auf die Empfehlungen des modernen Journals, um Diagramme in Vektorform bereitzustellen. Verschiedene Zeitschriften akzeptieren unterschiedliche Teilmengen von Vektorformaten. Im Allgemeinen erwarte ich eine bessere Qualität, wenn es weniger Transformationen von einem Format in ein anderes gibt.
Alexey Popkov
@Alexis Grundsätzlich erwarte ich, dass die Bereitstellung von Grafiken in einem der PostScript-Formate (EPS oder PDF) die beste Option ist. Die genaue Antwort hängt jedoch von der vom Verlag verwendeten Software ab. Beachten Sie auch, dass Fachzeitschriften in der Regel keine Konvertierungen der von Ihrer Grafiksoftware erstellten Grafiken empfehlen. Wenn Sie also als EPS exportieren können, ist dies wahrscheinlich die beste Option. Wenn Sie nur SVG exportieren können, geben Sie SVG an, wenn das Journal dies akzeptiert. Konvertieren Sie sich nicht in ein anderes Format.
Alexey Popkov
Stark verwandte Antwort mit detaillierter Beschreibung des Verfahrens für Mathematica .
Alexey Popkov
4

Ich habe es nicht benutzt, aber UWA CogSci Lab empfiehlt DataThief (Shareware).

Jeromy Anglim
quelle
2

Sie können auch im2graph ( http://www.im2graph.co.il ) versuchen , Diagramme in Daten zu konvertieren. Funktioniert unter Linux und Windows.

Shai Vaingast
quelle
2

'g3data' ist eine Software, mit der Sie Ihren Zweck erfüllen können. Es ist eine freie Software und ich habe sie benutzt. Sie können es hier herunterladen: http://www.frantz.fi/software/g3data.php

Prashant Dankeschön
quelle
2

Ich musste dies so oft in meiner Karriere tun, dass ich schließlich ein Javascript-Programm zusammenstellte, das hier verfügbar ist:

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

Entschuldigung, aber Sie müssen immer noch auf jeden einzelnen Punkt klicken. Sie können jedoch die Pfeiltasten verwenden, um das Handgelenk zu schonen.

Kevin Dusling
quelle
1

Für RBenutzer kann das Paket grImport(auf CRAN ) Vektorgrafiken importieren und in Objekte konvertieren, die R interpretieren kann. Es wird davon ausgegangen, dass PDF (oder ein anderes interessierendes Vektorformat) in das PostScript-Format konvertiert werden kann. Dies kann zum Beispiel mit Inkscape geschehen : importiere ( File > Import) deine PDF-Seite mit deiner Figur in Inkspace und File > Save As > Save as type: > PostScript *.ps. Sobald Sie Ihre *.psDatei in der grImportVignette Importieren von Vektorgrafiken gespeichert haben, lesen Sie den Abschnitt '4.1. Daten aus Bildern entfernen '.

Sie benötigen Ghostscript auf Ihrem Betriebssystem - versuchen Sie es hier herunterzuladen .

Beachten Sie , wenn Sie irgendwie in ghost Fehler ‚-Status 127‘ laufen , wenn Sie anrufen grImport::PostScriptTrace, dann Brach die Empfehlung von hier , die den Pfad manuell eingestellt sagt auf Ihrem Rechner ghostscript.

Hier ist ein Beispiel für R-Code zum Importieren einer PostScript-Datei in 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)

Hinweis: Befindet sich Ihr Diagramm auf einer Seite in einer mehrseitigen PDF-Datei, können Sie das mehrseitige Dokument mit teilen PDFTK builder. Importieren Sie Ihre einseitige PDF-Datei in Ikscape und löschen Sie alle zusätzlichen Elemente (zusätzlicher Text, zusätzliche Diagrammelemente). Dies erleichtert Ihnen die Arbeit in R, wenn Sie versuchen, die Koordinaten der Diagrammelemente zu ermitteln, an denen Sie interessiert sind.

Valentine
quelle