Những người trả lời khác cho rằng bạn đối phó với hình ảnh raster của đồ thị. Nhưng ngày nay, cách làm tốt là xuất bản đồ thị dưới dạng vector. Trong trường hợp này, bạn có thể đạt được độ chính xác cao hơn của dữ liệu đã phục hồi và thậm chí ước tính lỗi khôi phục nếu bạn làm việc trực tiếp với mã của biểu đồ vectơ, mà không chuyển đổi nó thành hình ảnh raster.
Vì các bài báo được xuất bản trực tuyến dưới dạng tệp PDF, tôi giả sử rằng bạn có tệp PDF chứa biểu đồ vectơ với dữ liệu bạn muốn khôi phục từ đó (ở dạng số) và ước tính lỗi khôi phục được giới thiệu.
Trước hết, PDF là một định dạng vector về cơ bản là văn bản (có thể được đọc bởi một trình soạn thảo văn bản). Vấn đề là nó có thể (và hầu như luôn luôn) chứa các luồng dữ liệu nén mà không cần phải nén để đọc chúng bằng trình soạn thảo văn bản. Những luồng dữ liệu nén này thường chứa thông tin chúng ta cần.
Có một số cách để giải nén luồng dữ liệu để chuyển đổi tệp PDF thành tài liệu văn bản với mã PDF có thể đọc được. Có lẽ cách đơn giản nhất là sử dụng tiện ích QPDF miễn phí với --stream-data=uncompress
tùy chọn :
qpdf infile.pdf --stream-data=uncompress -- outfile.pdf
Một số cách khác được mô tả ở đây và ở đây .
Outfile.pdf được tạo có thể được mở bằng trình soạn thảo văn bản. Bây giờ bạn cần PDF Reference Guide 1.7 để hiểu những gì bạn thấy. Đừng hoảng sợ vào lúc này! Bạn chỉ cần biết một vài toán tử được mô tả trong "BẢNG 4.9 Toán tử xây dựng đường dẫn" trên trang 226 - 227. Các toán tử quan trọng nhất là (cột đầu tiên chứa thông số tọa độ cho toán tử, cột thứ hai chứa toán tử và cột thứ ba là tên toán tử ):
x y m moveto
x y l lineto
x y width height re rectangle
h closepath
Trong hầu hết các trường hợp, việc biết bốn toán tử này để khôi phục dữ liệu là đủ.
Bây giờ bạn cần nhập tệp outfile.pdf dưới dạng văn bản vào một số chương trình nơi bạn có thể thao tác dữ liệu. Tôi sẽ chỉ cho bạn cách làm với Mathicala .
Nhập tệp:
pdfCode = Import["outfile.pdf", "Text"];
Bây giờ tôi giả sử trường hợp đơn giản nhất: biểu đồ chứa một dòng bao gồm nhiều phân đoạn hai điểm. Trong trường hợp này, mỗi phân đoạn của dòng được mã hóa như thế này:
268.79999 408.92975 m
272.39999 408.92975 l
Trích xuất tất cả các phân đoạn như vậy từ mã PDF:
lines = StringCases[pdfCode,
StartOfLine ~~ x1 : NumberString ~~ " " ~~ y1 : NumberString ~~ " m\n" ~~
x2 : NumberString ~~ " " ~~ y2 : NumberString ~~ " l\n"
:> ToExpression@{{x1, y1}, {x2, y2}}];
Hình dung chúng:
Graphics[{Line[lines]}]
Bạn nhận được một cái gì đó như thế này (bài báo tôi đang làm việc có chứa bốn biểu đồ):
Mỗi hai đoạn liền kề chia sẻ một điểm. Vì vậy, trong trường hợp này, bạn có thể biến các chuỗi của các phân đoạn liền kề thành các đường dẫn:
paths = Split[lines, #1[[2]] == #2[[1]] &];
Bây giờ bạn có thể hình dung tất cả các đường dẫn riêng biệt:
Graphics[{Line /@ paths}]
Từ hình này, bạn có thể chọn (bằng cách nhấp đúp) vào đường dẫn bạn đang tìm, sao chép lựa chọn đồ họa và dán như mới Graphics
. Để chuyển đổi nó lạc hậu vào danh sách các điểm bạn lấy phần tử {1, 1, 1}
. Bây giờ chúng ta có các điểm không nằm trong hệ tọa độ của đồ thị mà trong hệ tọa độ của tệp PDF. Chúng ta cần thiết lập mối quan hệ giữa họ.
Từ âm mưu trên, bạn chọn tick bằng tay (giữ Shift
cho nhiều lựa chọn), sau đó sao chép chúng và dán như mới Graphics
. Đây là cách bạn có thể trích xuất tọa độ của dấu ngang:
Bây giờ hãy kiểm tra sự khác biệt giữa các dấu tick:
Differences[reHorTicks]
Từ những khác biệt này, bạn có thể thấy chính xác vị trí của bọ ve trong tệp PDF. Nó đưa ra ước tính lỗi được đưa ra bằng cách chuyển đổi các biểu dữ liệu gốc thành biểu đồ vectơ có trong tệp PDF. Nếu có lỗi đáng kể trong định vị bọ ve, bạn có thể giảm lỗi bằng cách khớp tọa độ của bọ ve với mô hình tuyến tính. Hàm tuyến tính này bây giờ có thể được sử dụng để lấy tọa độ gốc của các điểm của đường dẫn (đó là trong hệ tọa độ của ô).