デカルト座標(標準の日常プロット)にプロットされたデータのイメージを取得し、グラフにプロットされたポイントの座標を抽出するソフトウェア(できれば無料、できればオープンソース)の経験がありますか?
本質的に、これはデータマイニングの問題であり、データの可視化の逆の問題です。
デカルト座標(標準の日常プロット)にプロットされたデータのイメージを取得し、グラフにプロットされたポイントの座標を抽出するソフトウェア(できれば無料、できればオープンソース)の経験がありますか?
本質的に、これはデータマイニングの問題であり、データの可視化の逆の問題です。
回答:
さまざまなオプションがありますが、基本的にはすべて同じワークフローを使用します。
プログラムは、各ポイントをxyマトリックスとして返します。
多くの場合、画像のズームバージョンをアップロードするか、一部のプログラムで使用可能なズーム機能を使用して、画像をズームする場合にポイントを選択するのに役立ちます。
多くのプログラムがあり、追加機能、使いやすさ、ライセンス、およびコストが異なります。以下にリストしました。
私が使用したものはすべて正常に動作します。測定誤差が非常に小さい状況を除いて、グラフのスクレイピングからの誤差は重要ではありません(たとえば、デジタル化による誤差<<誤差範囲のサイズまたは推定値の不確実性)。これらのプログラムの精度をテストしていない場合でも、ユーザー間、プログラム間、および再現された統計分析の結果と比較することは興味深いでしょう。
TL; DR: WebPlotDigitizerはchromeプラグインと同様にWebアプリケーションとして利用可能です
他の回答者は、グラフのラスターイメージを扱うことを想定しています。しかし、今日では、グラフをベクター形式で公開することをお勧めします。この場合、ベクトルグラフのコードをラスターイメージに変換せずに直接操作すると、回復されたデータのはるかに高い正確性を達成し、回復エラーを推定することもできます。
論文は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ファイルに含まれるベクトルグラフに変換することによって生じる誤差の推定値を示します。目盛りの配置にかなりのエラーがある場合、目盛りの座標を線形モデルに適合させることでエラーを減らすことができます。この線形関数を使用して、パスのポイントの元の座標を取得できます(プロットの座標系内)。
使用していませんが、UWA CogSciラボではDataThief(シェアウェア)を推奨しています。
エンゲージをチェックしてください。その無料でオープンソースの http://digitizer.sourceforge.net/
im2graph(http://www.im2graph.co.il)を試して、グラフをデータに変換することもできます。LinuxおよびWindowsで動作します。
「g3data」は、目的を果たすために使用できるソフトウェアです。それはフリーソフトウェアであり、私はそれを使用しています。ここからダウンロードできます:http : //www.frantz.fi/software/g3data.php
私のキャリアの中でこれを何度もしなければならなかったので、最終的にここで利用可能なjavascriptプログラムを作成しました:
http://kdusling.github.io/projects/DataGrab/index.html
申し訳ありませんが、すべてのポイントをクリックする必要があります。手首の負担を軽減する矢印キーを使用できますが。
STIPlotDigitizerが新しくリリースされました。
http://stiwww.com/product/software-techniques-plot-digitizer
以下のため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での作業が容易になります。