Perangkat lunak diperlukan untuk mengikis data dari grafik [tertutup]

56

Adakah yang punya pengalaman dengan perangkat lunak (lebih disukai gratis, lebih disukai open source) yang akan mengambil gambar data yang diplot pada koordinat kartesius (plot standar, harian) dan mengekstrak koordinat titik-titik yang diplot pada grafik?

Pada dasarnya, ini adalah masalah penambangan data dan masalah visualisasi data terbalik .

Alex Holcombe
sumber
2
Untuk satu solusi, lihat komentar untuk balasan ini . Solusi open source akan mencakup pemrosesan gambar atau perangkat lunak GIS raster ( GRASS kemungkinan adalah kandidat) atau, mungkin, GNU Octave . Saya menyebutkan ini sebagai komentar karena saya belum pernah menggunakan keduanya untuk tujuan khusus ini, jadi tolong anggap itu sebagai kemungkinan, bukan sebagai solusi yang pasti.
whuber
Saya berharap untuk kode / perangkat lunak khusus untuk menggores grafik, dan saya ingat paket seperti itu ada, setidaknya mereka lakukan 10 tahun yang lalu, tetapi saya tidak dapat mengingat nama mereka sekarang, dan tidak tahu apakah mereka bekerja pada sistem operasi saat ini .
Alex Holcombe
@Alex, coba googling "Graph Digitizer Open Source"
David LeBauer
Program Mathematica singkat untuk mendapatkan data dari pemindaian di sini .
Sjoerd C. de Vries
1
Lihat juga sumber yang saya tunjukkan dalam jawaban saya untuk Apa hubungan antara Y dan X dalam plot ini? .
Alexis

Jawaban:

42

perangkat lunak digitasi grafik

Ada banyak opsi berbeda, tetapi pada dasarnya semua menggunakan alur kerja yang sama:

  1. unggah gambar
  2. atur skala x dan y dengan menunjukkan nilai pada dua titik pada setiap sumbu
  3. menunjukkan apakah skalanya linear, log, dll,
  4. klik pada poin.
    • Beberapa program secara otomatis mengenali garis atau titik. Saya biasanya mengejar poin, dan saya menemukan mereka terlalu tidak konsisten untuk membantu bahkan dengan 100 poin. Saya belum menemukan satu yang mengenali simbol yang berbeda. Fitur ini mungkin sepadan dengan masalah untuk jalur digitalisasi, tetapi saya tidak pernah harus melakukan ini.

Program mengembalikan setiap titik sebagai matriks xy.

Seringkali membantu memilih titik jika gambar diperbesar, baik dengan mengunggah versi yang diperbesar dari gambar atau menggunakan fitur pembesaran yang tersedia di beberapa program.

Ada banyak program, dan mereka berbeda dalam fitur tambahan, kegunaan, lisensi, dan biaya. Saya telah mendaftarkan mereka di bawah ini.

Semua yang saya gunakan berfungsi dengan baik. Kecuali dalam konteks di mana kesalahan pengukuran sangat kecil, kesalahan dari pengikisan grafik tidak signifikan (mis. Kesalahan dari digitalisasi << ukuran bar kesalahan atau ketidakpastian dalam perkiraan). Jika belum menguji keakuratan salah satu dari program ini, tetapi akan menarik untuk membandingkan antara pengguna, antara program, dan terhadap hasil analisis statistik yang direproduksi.

Program yang saya gunakan:

  • Pengenalan jalur / jalur digital digitizer (GPL). Tersedia dalam repositori Ubuntu (engauge-digitizer)
  • Dapatkan Data (shareware) memiliki jendela zoom, pengenalan titik / garis otomatis
  • Pengenalan jalur / garis digital DigitizeIt (shareware)
  • ImageJ (open source, paling bisa dikembangkan setelah R digitalisasi)
  • R digitize (gratis, sumber terbuka), karena menyederhanakan proses mendapatkan data dari grafik ke dalam analisis dengan menjaga semua langkah dalam R. Lihat tutorial di R-Journal
  • Ambil! (demo gratis, $ 69) Plugin Excel
  • WebPlotDigitzer (gratis, online). Berbasis browser, mengekstrak data dari gambar. Ditinjau di sini .

Program yang belum saya gunakan:

  • GraphClick (Mac, $ 8)
  • g3data (open source - GNU GPL) Memiliki jendela zoom, tidak ada pengenalan otomatis. Tersedia dalam repositori Ubuntu.
  • Plugin GRABIT OpenSource (BSD) yang berjalan di platform berpemilik, Matlab

TL; DR: WebPlotDigitizer tersedia sebagai aplikasi web dan juga plugin chrome

David LeBauer
sumber
g3data (open source - GNU GPL) memiliki jendela zoom, tidak ada pengenalan otomatis. Tersedia dalam repositori Ubuntu. Saya tidak dapat membandingkan, karena hanya itu yang saya coba; tapi saya merasa sangat mudah digunakan.
Scortchi
Mengapa R digitize dihapus dari CRAN?
Léo Léopold Hertz 준영
1
@Masi sebagian besar dari ini tidak bekerja dengan pdf, dengan file pdf saya membuat angka besar dan kemudian menggunakan tangkapan layar (misalnya cmd-shift-4 pada Mac) untuk menyimpan gambar sebagai jpg atau png.
David LeBauer
1
@Masi Mempertahankan paket pada CRAN bisa menjadi banyak pekerjaan tambahan. Paket ini tersedia di GitHub github.com/tpoisot/digitize
David LeBauer
1
@Masi apa yang Anda maksud dengan 'sistematis' secara spesifik? Bisakah Anda menautkan ke gambar yang dimaksud? Ketika Anda mengatakan 'berpotongan', apakah maksud Anda titik tersebut terkandung dalam sumbu dan dengan demikian tidak muncul?
David LeBauer
16

Penjawab lain menganggap bahwa Anda berurusan dengan gambar raster grafik. Namun saat ini praktik terbaiknya adalah menerbitkan grafik dalam bentuk vektor. Dalam hal ini Anda dapat mencapai ketepatan yang jauh lebih tinggi dari data yang dipulihkan dan bahkan memperkirakan kesalahan pemulihan jika Anda bekerja dengan kode grafik vektor secara langsung, tanpa mengubahnya menjadi gambar raster.

Karena makalah diterbitkan secara online sebagai file PDF, saya berasumsi bahwa Anda memiliki file PDF yang berisi plot vektor dengan data yang ingin Anda pulihkan darinya (dapatkan dalam bentuk numerik) dan perkirakan kesalahan pemulihan yang diperkenalkan.

Pertama-tama, PDF adalah format vektor yang pada dasarnya bersifat tekstual (dapat dibaca oleh editor teks). Masalahnya adalah ia dapat (dan hampir selalu) berisi aliran data terkompresi yang perlu dikompresi untuk membacanya oleh editor teks. Aliran data terkompresi ini biasanya berisi informasi yang kita butuhkan.

Ada beberapa cara untuk mengompres aliran data untuk mengonversi file PDF ke dokumen teks dengan kode PDF yang dapat dibaca. Mungkin cara paling sederhana adalah dengan menggunakan utilitas QPDF gratis dengan --stream-data=uncompressopsi :

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

Beberapa cara lain dijelaskan di sini dan di sini .

File outfile.pdf yang dihasilkan dapat dibuka oleh editor teks. Sekarang Anda membutuhkan Manual Referensi PDF 1.7 untuk memahami apa yang Anda lihat. Jangan panik saat ini! Anda hanya perlu mengetahui beberapa operator yang dijelaskan dalam "TABEL 4.9 Operator konstruksi jalur" pada halaman 226 - 227. Operator yang paling penting adalah (kolom pertama berisi spesifikasi koordinat untuk operator, yang kedua berisi operator dan yang ketiga adalah nama operator ):

x y               m   moveto 

x y               l   lineto 

x y width height  re  rectangle

                  h   closepath

Dalam kebanyakan kasus cukup mengetahui empat operator ini untuk memulihkan data.

Sekarang Anda perlu mengimpor file outfile.pdf sebagai teks ke dalam beberapa program di mana Anda dapat memanipulasi data. Saya akan menunjukkan bagaimana melakukannya dengan Mathematica .

Mengimpor file:

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

Sekarang saya menganggap kasus paling sederhana: grafik berisi garis yang terdiri dari banyak segmen dua titik. Dalam hal ini setiap segmen garis dikodekan seperti ini:

268.79999 408.92975 m
272.39999 408.92975 l

Mengekstrak semua segmen tersebut dari kode PDF:

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

Visualisasikan mereka:

Graphics[{Line[lines]}]

Anda mendapatkan sesuatu seperti ini (makalah yang saya kerjakan berisi empat grafik):

merencanakan

Setiap dua segmen yang berdekatan berbagi satu titik. Jadi dalam hal ini Anda dapat mengubah urutan segmen yang berdekatan menjadi jalur:

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

Sekarang Anda dapat memvisualisasikan semua jalur secara terpisah:

Graphics[{Line /@ paths}]

Dari gambar ini Anda dapat memilih (dengan mengklik dua kali) jalur yang Anda cari, menyalin pemilihan grafik dan menempelkannya sebagai baru Graphics. Untuk mengubahnya mundur ke daftar poin Anda mengambil elemen {1, 1, 1}. Sekarang kita memiliki poin tidak dalam sistem koordinat grafik tetapi dalam sistem koordinat file PDF. Kita perlu membangun hubungan di antara mereka.

Dari plot di atas, Anda memilih kutu dengan tangan (tahan Shiftuntuk beberapa pilihan), lalu salin dan tempel sebagai yang baru Graphics. Berikut ini cara mengekstrak koordinat kutu horizontal:

tangkapan layar

Sekarang periksa perbedaan antara kutu:

Differences[reHorTicks]

Dari perbedaan-perbedaan ini, Anda dapat melihat seberapa tepat posisi kutu dalam file PDF. Ini memberikan perkiraan kesalahan yang diperkenalkan dengan mengubah datapoint asli menjadi grafik vektor yang termasuk dalam file PDF. Jika ada kesalahan yang cukup besar dalam posisi kutu, Anda dapat mengurangi kesalahan dengan menyesuaikan koordinat kutu ke model linier. Fungsi linier ini sekarang dapat digunakan untuk mendapatkan koordinat asli titik jalan (yang ada di sistem koordinat plot).

Alexey Popkov
sumber
2
Alexey, Anda menulis. Tetapi saat ini praktik terbaiknya adalah menerbitkan grafik dalam bentuk vektor. Apakah Anda memiliki referensi yang baik untuk praktik terbaik di sekitar format vektor yang mana ? (Ie saya harus menggunakan enkapsulasi eps dari file svg dalam naskah LaTeX saya, atau apakah saya harus langsung menampilkan grafik ke LaTeX secara langsung?) Ceria.
Alexis
1
@Alexis saya merujuk pada rekomendasi jurnal modern untuk menyediakan grafik dalam bentuk vektor. Jurnal yang berbeda menerima himpunan bagian format vektor yang berbeda. Secara umum saya mengharapkan kualitas yang lebih baik ketika ada lebih sedikit transformasi dari satu format ke format lainnya.
Alexey Popkov
@Alexis Jadi pada dasarnya saya berharap bahwa menyediakan grafik dalam salah satu format PostScript (EPS atau PDF) harus menjadi pilihan terbaik. Tetapi jawaban pasti tergantung pada perangkat lunak yang digunakan oleh penerbit. Perhatikan juga bahwa biasanya jurnal merekomendasikan konversi dari grafik yang dihasilkan oleh perangkat lunak grafik Anda. Jadi, jika Anda dapat mengekspor sebagai EPS, itu mungkin pilihan terbaik. Jika Anda hanya dapat mengekspor SVG maka berikan SVG jika jurnal menerimanya, jangan konversikan diri Anda ke format lain.
Alexey Popkov
Jawaban yang sangat terkait dengan deskripsi terperinci dari prosedur untuk Mathematica .
Alexey Popkov
4

Saya belum menggunakannya, tetapi lab UWA CogSci merekomendasikan DataThief (shareware).

Jeromy Anglim
sumber
2

Anda juga dapat mencoba im2graph ( http://www.im2graph.co.il ) untuk mengubah grafik menjadi data. Bekerja di Linux dan Windows.

Shai Vaingast
sumber
2

'g3data' adalah perangkat lunak yang dapat digunakan untuk melayani tujuan Anda. Ini adalah perangkat lunak gratis dan saya telah menggunakannya. Anda dapat mengunduhnya dari sini: http://www.frantz.fi/software/g3data.php

Prashant Thankey
sumber
2

Saya harus melakukan ini berkali-kali dalam karir saya, akhirnya saya menyusun program javascript yang tersedia di sini:

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

Maaf, tetapi Anda masih harus mengklik pada setiap titik. Meskipun Anda dapat menggunakan tombol panah yang tidak menyimpan ketegangan pergelangan tangan.

Kevin Dusling
sumber
1

Untuk Rpengguna, paket grImport(pada CRAN ) dapat mengimpor grafik vektor dan mengubahnya menjadi objek yang dapat ditafsirkan R. Diasumsikan bahwa seseorang dapat mengonversi PDF (atau format vektor lain yang menarik) ke format PostScript. Ini dapat dilakukan misalnya dengan Inkscape : import ( File > Import) halaman PDF Anda dengan gambar Anda ke Inkspace dan File > Save As > Save as type: > PostScript *.ps. Setelah *.psfile Anda kosong, grImportsketsa mengimpor Grafik Vektor , yang lebih relevan adalah bagian '4.1. Menggores data dari gambar '.

Anda akan memerlukan ghostscript pada Sistem Operasi Anda - cobalah untuk mengunduhnya dari sini .

Catatan, jika Anda menemukan entah bagaimana kesalahan ghostscript 'status 127' saat Anda menelepon grImport::PostScriptTrace, maka bera rekomendasi dari sini , yang mengatakan untuk secara manual mengatur path ke ghostscript pada mesin Anda.

Berikut ini beberapa contoh kode R untuk mengimpor file PostScript ke 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)

Catatan, jika grafik Anda berada pada halaman dalam file PDF multi halaman, maka Anda dapat membagi dokumen multi-halaman dengan PDFTK builder. Impor file PDF satu halaman Anda di Ikscape dan hapus elemen tambahan apa pun (teks tambahan, elemen grafik tambahan). Ini akan memudahkan pekerjaan Anda dalam R ketika mencoba menangkap koordinat elemen grafik yang Anda minati.

Valentine
sumber