ซอฟต์แวร์ที่จำเป็นสำหรับการขูดข้อมูลจากกราฟ [ปิด]


56

ใครมีประสบการณ์กับซอฟต์แวร์ (โดยเฉพาะอย่างยิ่งฟรีโอเพนซอร์ซ) ที่จะถ่ายภาพของข้อมูลที่ถูกพล็อตบนพิกัดคาร์ทีเซียน (มาตรฐานพล็อตประจำวัน) และแยกพิกัดของจุดที่พล็อตลงบนกราฟ

โดยพื้นฐานแล้วนี่เป็นปัญหาการขุดข้อมูลและปัญหาการแสดงข้อมูลย้อนกลับ


2
สำหรับวิธีแก้ปัญหาเดียวให้ดูความคิดเห็นของคำตอบนี้ การแก้ปัญหาการเปิดแหล่งที่มาจะรวมถึงการประมวลผลภาพหรือซอฟต์แวร์ GIS แรสเตอร์ ( GRASSเป็นผู้สมัครที่มีแนวโน้ม) หรือบางทีคู่ของกนู ฉันกำลังพูดถึงสิ่งเหล่านี้เป็นความคิดเห็นเพราะฉันไม่ได้ใช้เพื่อจุดประสงค์นี้โดยเฉพาะดังนั้นโปรดนำสิ่งเหล่านั้นมาเป็นไปได้ไม่ใช่วิธีแก้ปัญหาที่ชัดเจน
whuber

ฉันหวังว่าจะใช้รหัส / ซอฟต์แวร์โดยเฉพาะสำหรับการขูดกราฟและฉันจำได้ว่ามีแพ็คเกจดังกล่าวอย่างน้อยพวกเขาก็ทำเมื่อ 10 ปีที่แล้ว แต่ฉันจำชื่อของพวกเขาไม่ได้ตอนนี้และไม่รู้ว่าพวกเขาทำงานบนระบบปฏิบัติการปัจจุบันหรือไม่ .
Alex Holcombe

@ อเล็กซ์ลองใช้ googling "Graph Digitizer Open Source"
David LeBauer

โปรแกรม Mathematica สั้นที่จะได้รับข้อมูลจากการสแกนที่นี่
Sjoerd C. de Vries

1
ดูทรัพยากรที่ฉันชี้ไปในคำตอบของฉันกับ ความสัมพันธ์ระหว่างYและXในโครงเรื่องนี้คืออะไร? .
Alexis

คำตอบ:



42

ซอฟต์แวร์แปลงกราฟ

มีตัวเลือกต่าง ๆ มากมาย แต่โดยพื้นฐานแล้วทั้งหมดใช้เวิร์กโฟลว์เดียวกัน:

  1. อัปโหลดภาพ
  2. ตั้งค่าสเกล x และ y โดยระบุค่าที่จุดสองจุดบนแต่ละแกน
  3. ระบุว่าสเกลเป็นเชิงเส้นบันทึก ฯลฯ
  4. คลิกที่จุด
    • บางโปรแกรมรับรู้เส้นหรือจุดโดยอัตโนมัติ ฉันมักจะตามหลังคะแนนและฉันพบว่าพวกเขาไม่สอดคล้องกันที่จะเป็นประโยชน์แม้จะมีคะแนน 100 คะแนนก็ตาม ฉันไม่พบหนึ่งที่รู้จักสัญลักษณ์ที่แตกต่างกัน ฟีเจอร์นี้อาจจะคุ้มค่ากับปัญหาในการแปลงบรรทัดเป็นดิจิทัล แต่ฉันไม่เคยทำเช่นนี้มาก่อน

โปรแกรมจะคืนค่าแต่ละจุดเป็น xy matrix

บ่อยครั้งที่มันช่วยในการเลือกจุดหากภาพถูกซูมโดยการอัปโหลดรูปภาพที่ซูมหรือใช้คุณสมบัติการซูมที่มีในบางโปรแกรม

มีหลายโปรแกรมและพวกเขาแตกต่างกันไปในคุณสมบัติพิเศษการใช้งานการออกใบอนุญาตและค่าใช้จ่าย ฉันได้แสดงรายการไว้ด้านล่าง

ทุกอย่างที่ฉันเคยทำงานได้ดี ยกเว้นในบริบทที่ข้อผิดพลาดการวัดมีขนาดเล็กมากข้อผิดพลาดจากการขูดกราฟนั้นไม่มีนัยสำคัญ (เช่นข้อผิดพลาดจากการแปลงเป็นดิจิทัลขนาดของแถบข้อผิดพลาดหรือความไม่แน่นอนในการประมาณค่า) หากยังไม่ได้ทดสอบความถูกต้องของโปรแกรมใด ๆ เหล่านี้ แต่มันน่าสนใจที่จะเปรียบเทียบระหว่างผู้ใช้ระหว่างโปรแกรมและกับผลลัพธ์ของการวิเคราะห์ทางสถิติที่ทำซ้ำ

โปรแกรมที่ฉันใช้:

  • Digitizer (ซอฟต์แวร์ฟรี, GPL) การรับรู้จุด / บรรทัดอัตโนมัติ มีอยู่ในที่เก็บ Ubuntu (engauge-digitizer)
  • รับข้อมูล (แชร์แวร์) มีหน้าต่างซูมการรับรู้จุดอัตโนมัติ / สาย
  • DigitizeIt (แชร์แวร์) การรับรู้จุด / บรรทัดอัตโนมัติ
  • ImageJ (โอเพ่นซอร์สส่วนใหญ่สามารถขยายได้หลังจาก R digitize)
  • R digitize (ฟรี, โอเพ่นซอร์ส) เพราะมันช่วยให้กระบวนการรับข้อมูลจากกราฟเข้าสู่การวิเคราะห์ได้ง่ายขึ้นโดยการรักษาทุกขั้นตอนใน R. ดูบทช่วยสอนใน R-Journal
  • คว้ามัน! (ตัวอย่างฟรี, $ 69) ปลั๊กอินของ Excel
  • WebPlotDigitzer (ออนไลน์ฟรี) เบราว์เซอร์ที่ใช้ดึงข้อมูลจากภาพ ทานที่นี่

โปรแกรมที่ฉันไม่ได้ใช้:

  • กราฟคลิก (Mac, $ 8)
  • g3data (โอเพ่นซอร์ส - GNU GPL) มีหน้าต่างซูมไม่มีการจดจำอัตโนมัติ พร้อมใช้งานในที่เก็บ Ubuntu
  • ปลั๊กอิน GRABIT OpenSource (BSD) ที่ทำงานในแพลตฟอร์ม Matlab ที่เป็นกรรมสิทธิ์

TL; DR: WebPlotDigitizerพร้อมใช้งานในรูปแบบเว็บแอปพลิเคชันรวมถึงปลั๊กอิน Chrome


g3data (โอเพ่นซอร์ส - GNU GPL) มีหน้าต่างซูมไม่มีการจดจำอัตโนมัติ พร้อมใช้งานในที่เก็บ Ubuntu ฉันไม่สามารถเปรียบเทียบได้เพราะเป็นสิ่งเดียวที่ฉันได้ลอง แต่ฉันพบว่ามันใช้งานง่ายมาก
Scortchi - Reinstate Monica

ทำไม R digitize จึงถูกลบออกจาก CRAN
LéoLéopold Hertz

1
@Masi ส่วนใหญ่ไม่ทำงานกับ pdf ด้วยไฟล์ pdf ฉันทำให้ภาพใหญ่ขึ้นแล้วใช้การจับภาพหน้าจอ (เช่น cmd-shift-4 บน Mac) เพื่อบันทึกรูปเป็น jpg หรือ png
David LeBauer

1
@Masi การคงแพ็คเกจบน CRAN อาจเป็นงานเพิ่มเติมจำนวนมาก แพคเกจสามารถใช้ได้ใน GitHub github.com/tpoisot/digitize
David LeBauer

1
@Masi คุณหมายถึงอะไรเป็นพิเศษโดย 'เป็นระบบ' คุณสามารถลิงค์ไปยังตัวเลขที่เป็นปัญหาได้หรือไม่? เมื่อคุณพูดว่า 'ตัดกัน' คุณหมายถึงว่าจุดนั้นอยู่ในแกนจึงไม่ปรากฏขึ้น?
David LeBauer

16

ผู้ตอบคนอื่นคิดว่าคุณจัดการกับภาพแรสเตอร์ของกราฟ แต่ทุกวันนี้แนวปฏิบัติที่ดีคือการเผยแพร่กราฟในรูปแบบเวกเตอร์ ในกรณีนี้คุณสามารถบรรลุความถูกต้องที่สูงขึ้นของข้อมูลที่กู้คืนได้และประเมินข้อผิดพลาดการกู้คืนหากคุณทำงานกับรหัสของกราฟเวกเตอร์โดยตรงโดยไม่ต้องแปลงเป็นภาพแรสเตอร์

เนื่องจากเอกสารเผยแพร่ออนไลน์เป็นไฟล์ PDF ฉันถือว่าคุณมีไฟล์ PDF ซึ่งมีพล็อตเวกเตอร์ที่มีข้อมูลที่คุณต้องการกู้คืนจากมัน (รับในรูปแบบตัวเลข) และประมาณการข้อผิดพลาดในการกู้คืนที่แนะนำ

ประการแรก PDF เป็นรูปแบบเวกเตอร์ซึ่งเป็นข้อความเดิม (สามารถอ่านได้โดยโปรแกรมแก้ไขข้อความ) ปัญหาคือมันสามารถ (และเกือบตลอดเวลา) มีสตรีมข้อมูลที่ถูกบีบอัดซึ่งต้องการให้ไม่มีการบีบอัดเพื่อที่จะอ่านโดยโปรแกรมแก้ไขข้อความ สตรีมข้อมูลที่ถูกบีบอัดเหล่านี้มักจะมีข้อมูลที่เราต้องการ

มีหลายวิธีในการคลายการบีบอัดข้อมูลสตรีมเพื่อแปลงไฟล์ PDF เป็นเอกสารต้นฉบับด้วยรหัส PDF ที่อ่านได้ อาจเป็นวิธีที่ง่ายที่สุดคือใช้ยูทิลิตี้ QPDFฟรีพร้อม--stream-data=uncompressตัวเลือก :

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

บางวิธีการอื่น ๆ ที่อธิบายไว้ที่นี่และที่นี่

outfile.pdf ที่สร้างขึ้นสามารถเปิดได้โดยตัวแก้ไขข้อความ ตอนนี้คุณต้องมีคู่มืออ้างอิง PDF 1.7เพื่อทำความเข้าใจกับสิ่งที่คุณเห็น อย่าตกใจในขณะนี้! คุณจำเป็นต้องรู้ผู้ประกอบการเพียงไม่กี่คนที่อธิบายไว้ใน "ตารางที่ 4.9 ผู้ประกอบการก่อสร้างเส้นทาง" ในหน้า 226 - 227 ตัวดำเนินการที่สำคัญที่สุดคือ (คอลัมน์แรกมีข้อกำหนดพิกัดสำหรับผู้ประกอบการที่สองประกอบด้วยผู้ประกอบการและที่สามคือชื่อผู้ประกอบการ ):

x y               m   moveto 

x y               l   lineto 

x y width height  re  rectangle

                  h   closepath

ในกรณีส่วนใหญ่ก็เพียงพอที่จะรู้ว่าตัวดำเนินการทั้งสี่สำหรับการกู้คืนข้อมูล

ตอนนี้คุณต้องนำเข้าไฟล์ outfile.pdf เป็นข้อความลงในบางโปรแกรมที่คุณสามารถจัดการข้อมูลได้ ฉันจะแสดงวิธีการที่จะทำมันด้วยMathematica

การนำเข้าไฟล์:

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

ตอนนี้ฉันคิดว่ากรณีที่ง่ายที่สุด: กราฟมีเส้นที่ประกอบด้วยส่วนสองจุดจำนวนมาก ในกรณีนี้แต่ละส่วนของบรรทัดจะถูกเข้ารหัสเช่นนี้

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]}]

คุณได้รับสิ่งนี้ (กระดาษที่ฉันใช้ประกอบด้วยสี่กราฟ):

พล็อต

แต่ละเซกเมนต์ที่อยู่ติดกันจะแบ่งกันหนึ่งจุด ดังนั้นในกรณีนี้คุณสามารถเปลี่ยนลำดับของกลุ่มที่อยู่ติดกันเป็นเส้นทาง:

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

ตอนนี้คุณสามารถเห็นภาพเส้นทางทั้งหมดแยกจากกัน:

Graphics[{Line /@ paths}]

จากตัวเลขนี้คุณสามารถเลือก (โดยการดับเบิลคลิก) Graphicsเส้นทางที่คุณกำลังมองหาตัวเลือกคัดลอกและวางกราฟิกใหม่ {1, 1, 1}สำหรับการแปลงมันย้อนกลับไปยังรายการของจุดที่คุณใช้องค์ประกอบ ตอนนี้เรามีจุดไม่ได้อยู่ในระบบพิกัดของกราฟ แต่ในระบบพิกัดของไฟล์ PDF เราจำเป็นต้องสร้างความสัมพันธ์ระหว่างพวกเขา

จากพล็อตดังกล่าวข้างต้นคุณเลือกเห็บด้วยมือ (ถือหุ้นShiftสำหรับการเลือกหลาย) Graphicsแล้วคัดลอกและวางใหม่ นี่คือวิธีที่คุณสามารถแยกพิกัดของเห็บแนวนอน:

ภาพหน้าจอ

ตอนนี้ตรวจสอบความแตกต่างระหว่างเห็บ:

Differences[reHorTicks]

จากความแตกต่างเหล่านี้คุณสามารถดูได้ว่าตำแหน่งของเห็บในไฟล์ PDF นั้นแม่นยำเพียงใด มันให้การประมาณข้อผิดพลาดที่แนะนำโดยการแปลงดาต้าพอยน์ดั้งเดิมเป็นกราฟเวกเตอร์ที่รวมอยู่ในไฟล์ PDF หากมีข้อผิดพลาดในการจัดตำแหน่งเห็บคุณสามารถลดข้อผิดพลาดโดยการปรับพิกัดของเห็บเป็นแบบเชิงเส้น ฟังก์ชันเชิงเส้นนี้สามารถใช้เพื่อรับพิกัดดั้งเดิมของจุดของเส้นทาง (ซึ่งอยู่ในระบบพิกัดของพล็อต)


2
Alexey คุณเขียนแต่ทุกวันนี้แนวปฏิบัติที่ดีคือการเผยแพร่กราฟในรูปแบบเวกเตอร์ คุณมีอ้างอิงที่ดีสำหรับการปฏิบัติที่ดีที่สุดรอบซึ่งรูปแบบเวกเตอร์ (s)? (เช่นฉันควรใช้ eps encapsulation ของไฟล์ svg ในต้นฉบับ LaTeX ของฉันหรือฉันควรจะส่งกราฟไปยัง LaTeX โดยตรงหรือไม่) ไชโย
Alexis

1
@Alexis ฉันอ้างถึงคำแนะนำของวารสารสมัยใหม่เพื่อให้กราฟในรูปแบบเวกเตอร์ วารสารต่าง ๆ ยอมรับชุดย่อยของรูปแบบเวกเตอร์ที่ต่างกัน โดยทั่วไปแล้วฉันคาดว่าคุณภาพที่ดีขึ้นเมื่อมีการแปลงจากรูปแบบหนึ่งไปอีกรูปแบบที่น้อยกว่า
Alexey Popkov

@Alexis ดังนั้นโดยทั่วไปฉันคาดว่าการจัดทำกราฟในรูปแบบ PostScript (EPS หรือ PDF) ควรเป็นตัวเลือกที่ดีที่สุด แต่คำตอบที่แน่นอนขึ้นอยู่กับซอฟต์แวร์ที่ใช้โดยผู้จัดพิมพ์ โปรดทราบว่าวารสารมักจะแนะนำให้แปลงกราฟใด ๆ ที่สร้างขึ้นโดยซอฟต์แวร์สร้างกราฟของคุณ ดังนั้นหากคุณสามารถส่งออกเป็น EPS ได้อาจเป็นตัวเลือกที่ดีที่สุด หากคุณสามารถส่งออก SVG ได้เท่านั้นให้ระบุ SVG หากบันทึกประจำวันยอมรับได้อย่าแปลงตัวคุณเป็นรูปแบบอื่น
Alexey Popkov

คำตอบที่เกี่ยวข้องอย่างมากกับรายละเอียดของขั้นตอนการมาติกา
Alexey Popkov







2

ฉันต้องทำเช่นนี้หลายครั้งในอาชีพของฉันในที่สุดฉันก็รวบรวมโปรแกรมจาวาสคริปต์ที่มีอยู่ที่นี่:

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

ขออภัย แต่คุณจะต้องคลิกทุกจุด แม้ว่าคุณจะสามารถใช้ปุ่มลูกศรซึ่งจะช่วยลดความเครียดที่ข้อมือ



1

สำหรับRผู้ใช้แพ็คเกจgrImport(ในCRAN ) สามารถนำเข้ากราฟิกแบบเวกเตอร์และแปลงเป็นวัตถุที่ R สามารถตีความได้ สันนิษฐานว่าสามารถแปลง PDF (หรือรูปแบบเวกเตอร์อื่น ๆ ที่น่าสนใจ) ให้เป็นรูปแบบ PostScript ซึ่งสามารถทำได้เช่นกับInkscape : นำเข้า ( File > Import) หน้า PDF ของคุณด้วยรูปของคุณลงใน Inkspace File > Save As > Save as type: > PostScript *.psและ เมื่อคุณมี*.psไฟล์ของคุณร่วงลงgrImportบทความสั้นนำเข้ากราฟิกแบบเวกเตอร์ส่วนที่เกี่ยวข้องมากขึ้นคือ '4.1 การคัดลอกข้อมูลจากภาพ '

คุณจะต้อง Ghostscript บนระบบปฏิบัติการของคุณ - พยายามที่จะดาวน์โหลดได้จากที่นี่

หมายเหตุหากคุณเรียกใช้ข้อผิดพลาด ghostscript 'สถานะ 127' เมื่อใดก็ตามให้เรียกgrImport::PostScriptTraceคำแนะนำจากที่นี่ซึ่งบอกให้ตั้งค่าพา ธ เป็น ghostscript บนเครื่องของคุณด้วยตนเอง

นี่คือตัวอย่างรหัส R เพื่อนำเข้าไฟล์ PostScript ไปยัง 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หลายหน้าแล้วคุณสามารถแยกเอกสารหลายหน้าด้วย นำเข้าไฟล์ PDF หน้าเดียวของคุณใน Ikscape และลบองค์ประกอบพิเศษใด ๆ (ข้อความพิเศษองค์ประกอบกราฟพิเศษ) สิ่งนี้จะช่วยให้งานของคุณเป็น R ง่ายขึ้นเมื่อพยายามจับพิกัดขององค์ประกอบกราฟที่คุณสนใจ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.