グラフからデータを取得するために必要なソフトウェア[終了]


56

デカルト座標(標準の日常プロット)にプロットされたデータのイメージを取得し、グラフにプロットされたポイントの座標を抽出するソフトウェア(できれば無料、できればオープンソース)の経験がありますか?

本質的に、これはデータマイニングの問題であり、データの可視化の逆の問題です。


2
1つの解決策については、この返信に対するコメントを参照してください。オープンソースソリューションには、画像処理またはラスターGISソフトウェア(GRASSが適している可能性が高い)または、おそらくGNU Octaveが含まれます。私はこの特定の目的にも使用していないため、これらをコメントとして言及しています。したがって、それらを明確な解決策としてではなく、可能性としてとってください。
whuberの

私はグラフをスクレイピングするためのコード/ソフトウェアを望んでおり、少なくとも10年前にそうしたパッケージが存在したことを覚えていますが、現在は名前を思い出せず、現在のオペレーティングシステムで動作するかどうかわかりません。
アレックスホルコム


ここでスキャンからデータを取得する短いMathematicaプログラム。
Sjoerd C. de Vries

1
このプロットのYXの関係は何ですか?の答えで私が指しているリソースも参照してください
アレクシス

回答:



42

グラフデジタル化ソフトウェア

さまざまなオプションがありますが、基本的にはすべて同じワークフローを使用します。

  1. 画像をアップロードする
  2. 各軸の2点の値を示すことにより、xおよびyスケールを設定します
  3. スケールが線形、対数などであるかどうかを示します。
  4. ポイントをクリックします。
    • 一部のプログラムは、ラインまたはポイントを自動的に認識します。私は通常、ポイントの後にいるので、それらがあまりにも一貫していないため、数百のポイントでも役に立たないことがわかります。異なる記号を認識するものは見つかりませんでした。この機能は、ラインをデジタル化するのに苦労する価値がありますが、私はこれを行う必要はありませんでした。

プログラムは、各ポイントをxyマトリックスとして返します。

多くの場合、画像のズームバージョンをアップロードするか、一部のプログラムで使用可能なズーム機能を使用して、画像をズームする場合にポイントを選択するのに役立ちます。

多くのプログラムがあり、追加機能、使いやすさ、ライセンス、およびコストが異なります。以下にリストしました。

私が使用したものはすべて正常に動作します。測定誤差が非常に小さい状況を除いて、グラフのスクレイピングからの誤差は重要ではありません(たとえば、デジタル化による誤差<<誤差範囲のサイズまたは推定値の不確実性)。これらのプログラムの精度をテストしていない場合でも、ユーザー間、プログラム間、および再現された統計分析の結果と比較することは興味深いでしょう。

私が使用したプログラム:

  • デジタイザー(フリーソフトウェア、GPL)自動ポイント/ライン認識。Ubuntuリポジトリで利用可能(engauge-digitizer)
  • Get Data(シェアウェア)にはズームウィンドウ、自動ポイント/ライン認識があります
  • DigitizeIt(シェアウェア)自動ポイント/ライン認識
  • ImageJ(オープンソース、Rデジタイズ後に最も拡張可能)
  • Rデジタイズ(無料、オープンソース)。Rのすべてのステップを保持することで、グラフからデータを分析に取り込むプロセスを簡素化するためです。R-Journalのチュートリアルを参照してください
  • それをつかむ!(無料デモ、69ドル)Excelプラグイン
  • WebPlotDigitzer(無料、オンライン)。ブラウザベース、画像からデータを抽出します。ここで確認します

使用していないプログラム:

  • GraphClick(Mac、8ドル)
  • g3data(オープンソース-GNU GPL)ズームウィンドウがあり、自動認識はありません。Ubuntuリポジトリで利用可能。
  • 独自のプラットフォームであるMatlabで実行されるGRABIT OpenSource(BSD)プラグイン

TL; DR: WebPlotDigitizerchromeプラグインと同様にWebアプリケーションとして利用可能です


g3data(オープンソース-GNU GPL)にはズームウィンドウがあり、自動認識はありません。Ubuntuリポジトリで利用可能。それは私が試した唯一のものなので、私は比較することはできません。しかし、私は非常に使いやすいことがわかりました。
Scortchi -モニカ元に戻し

RデジタイズがCRANから削除されたのはなぜですか?
レオレオポルトヘルツ준영

1
@Masiこれらのほとんどはpdfファイルでは機能せず、pdfファイルではFigureを大きくしてから、スクリーンキャプチャ(Macの場合はcmd-shift-4など)を使用してFigureをjpgまたはpngとして保存します。
デビッドルバウアー

1
@Masi CRANでのパッケージのメンテナンスには、多くの追加作業が必要になる場合があります。このパッケージは、GitHub github.com/tpoisot/digitizeで
David LeBauer

1
@Masi「体系的に」とは具体的にどういう意味ですか?問題の図にリンクできますか?「交差」と言うとき、ポイントは軸内に含まれているため表示されないということですか?
デビッドルバウアー16年

16

他の回答者は、グラフのラスターイメージを扱うことを想定しています。しかし、今日では、グラフをベクター形式で公開することをお勧めします。この場合、ベクトルグラフのコードをラスターイメージに変換せずに直接操作すると、回復されたデータのはるかに高い正確性を達成し、回復エラーを推定することもできます。

論文はPDFファイルとしてオンラインで公開されているため、回復したいデータ(ベクトル形式)を含むベクトルプロットを含むPDFファイルがあり、導入された回復エラーを推定すると仮定します。

まず、PDFは基本的にテキスト形式のテキスト形式です(テキストエディターで読み取ることができます)。問題は、テキストエディターで読み込むために圧縮を解除する必要がある圧縮データストリームを含むことができる(そしてほとんどの場合)これらの圧縮データストリームには通常、必要な情報が含まれています。

PDFファイルを読み取り可能なPDFコードを含むテキストドキュメントに変換するために、データストリームを解凍する方法はいくつかあります。おそらく最も簡単な方法は、オプションで無料のQPDFユーティリティを使用する--stream-data=uncompressことです:

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

他の方法については、ここここで説明します

生成されたoutfile.pdfは、テキストエディターで開くことができます。表示内容を理解するには、PDFリファレンスマニュアル1.7が必要です。この瞬間にpanicてないでください!「表4.9パス構築演算子」(226〜227ページ)で説明されている演算子はほとんど必要ありません。最も重要な演算子は(最初の列には演算子の座標指定、2番目には演算子、3番目には演算子名):

x y               m   moveto 

x y               l   lineto 

x y width height  re  rectangle

                  h   closepath

ほとんどの場合、データを回復するには、これら4つの演算子を知っていれば十分です。

次に、outfile.pdfファイルをテキストとして、データを操作できるプログラムにインポートする必要があります。Mathematicaでそれを行う方法を示します。

ファイルのインポート:

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

ここで、最も単純なケースを想定します。グラフには、多くの2点セグメントで構成される線が含まれます。この場合、行の各セグメントは次のようにエンコードされます。

268.79999 408.92975 m
272.39999 408.92975 l

PDFコードからこのようなセグメントをすべて抽出します。

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

それらを視覚化する:

Graphics[{Line[lines]}]

このようなものが得られます(私が取り組んでいる論文には4つのグラフが含まれています)。

プロット

隣接する2つのセグメントはそれぞれ1つのポイントを共有します。したがって、この場合、隣接するセグメントのシーケンスをパスに変換できます。

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

これで、すべてのパスを個別に視覚化できます。

Graphics[{Line /@ paths}]

この図から、探しているパスを(ダブルクリックして)選択し、グラフィック選択をコピーして、新規として貼り付けることができますGraphics。それをポイントのリストに逆変換するには、要素を使用し{1, 1, 1}ます。これで、グラフの座標系ではなく、PDFファイルの座標系にポイントができました。それらの間の関係を確立する必要があります。

上記のプロットから、ティックを手動で選択し(Shift複数選択を保持)、それらをコピーしてnewとして貼り付けGraphicsます。水平ティックの座標を抽出する方法は次のとおりです。

スクリーンショット

次に、ティック間の違いを確認します。

Differences[reHorTicks]

これらの違いから、PDFファイルの目盛りの正確な位置を確認できます。元のデータポイントをPDFファイルに含まれるベクトルグラフに変換することによって生じる誤差の推定値を示します。目盛りの配置にかなりのエラーがある場合、目盛りの座標を線形モデルに適合させることでエラーを減らすことができます。この線形関数を使用して、パスのポイントの元の座標を取得できます(プロットの座標系内)。


2
アレクセイ、あなたは書いたが、最近では、ベクトル形式でグラフを公開することをお勧めしますどのベクター形式に関するベストプラクティスの参考資料がありますか?(つまり、LaTeX原稿でsvgファイルのepsカプセル化を使用する必要がありますか、それともLaTeXに直接グラフを出力することになっていますか?)
アレクシス14

1
@Alexis現代のジャーナルの推奨事項を参照して、グラフをベクター形式で提供します。異なるジャーナルは、ベクトル形式の異なるサブセットを受け入れます。一般に、ある形式から別の形式への変換が少ない場合、品質が向上することを期待しています。
アレクセイ・ポプコフ14

@Alexisしたがって、基本的には、PostScript形式(EPSまたはPDF)のいずれかでグラフを提供することが最良の選択肢になるはずです。しかし、正確な答えは出版社が使用するソフトウェアに依存します。また、通常、ジャーナルは、グラフ作成ソフトウェアによって作成されたグラフの変換を推奨していません。したがって、EPSとしてエクスポートできる場合は、おそらく最良のオプションです。SVGのみをエクスポートし、ジャーナルが受け入れた場合にSVGを提供できる場合、他の形式に変換しないでください。
アレクセイ・ポプコフ14

Mathematicaの手順の詳細な説明と強く関連する答え
アレクセイ・ポプコフ




2

scanitを試してください:http ://amsterchem.com/scanit.html

無料で、Windows上で動作します






1

以下のためRのユーザーは、パッケージgrImport上の(CRAN)ベクターグラフィックをインポートすることができ、Rが解釈できるオブジェクトに変換します。PDF(または関心のある他のベクター形式)をPostScript形式に変換できると想定しています。これは例えばInkscapeで行うことができます:File > Importあなたのフィギュアを含むPDFページをInkspaceとFile > Save As > Save as type: > PostScript *.ps*.psファイルがgrImportビネットImporting Vector Graphicsになったら、セクション '4.1。画像からデータをスクレイピングします。

オペレーティングシステムにghostscriptが必要になります。こちらからダウンロードしてください

を呼び出すときに、なんらかの形でghostscriptエラー 'status 127'が発生した場合grImport::PostScriptTraceここから推奨事項を許可しないことに注意してください。

PostScriptファイルをRにインポートするためのサンプル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)

グラフが複数ページのPDFファイルのページにある場合は、で複数ページのドキュメントを分割できますPDFTK builder。1ページのPDFファイルをIkscapeにインポートし、余分な要素(余分なテキスト、余分なグラフ要素)を削除します。これにより、関心のあるグラフ要素の座標をキャッチしようとするときにRでの作業が容易になります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.