Inni odpowiadający zakładają, że masz do czynienia z obrazem rastrowym wykresu. Ale obecnie dobrą praktyką jest publikowanie wykresów w postaci wektorowej. W takim przypadku możesz osiągnąć znacznie wyższą dokładność odzyskanych danych, a nawet oszacować błąd odzyskiwania, jeśli pracujesz bezpośrednio z kodem wykresu wektorowego, bez konwersji go na obraz rastrowy.
Ponieważ artykuły są publikowane online jako pliki PDF, zakładam, że masz plik PDF, który zawiera wykres wektorowy z danymi, które chcesz odzyskać (uzyskać w formie liczbowej) i oszacować wprowadzony błąd odzyskiwania.
Przede wszystkim PDF to format wektorowy, który jest zasadniczo tekstowy (może być odczytany przez edytor tekstu). Problem polega na tym, że może (i prawie zawsze) zawierać skompresowane strumienie danych, które wymagają dekompresji w celu odczytania ich przez edytor tekstu. Te skompresowane strumienie danych zwykle zawierają potrzebne informacje.
Istnieje kilka sposobów dekompresji strumieni danych w celu konwersji pliku PDF na dokument tekstowy z czytelnym kodem PDF. Prawdopodobnie najprostszym sposobem jest użycie darmowego narzędzia QPDF z --stream-data=uncompress
opcją :
qpdf infile.pdf --stream-data=uncompress -- outfile.pdf
Niektóre inne sposoby opisano tutaj i tutaj .
Wygenerowany plik outfile.pdf można otworzyć za pomocą edytora tekstu. Teraz potrzebujesz PDF Reference Manual 1.7, aby zrozumieć, co widzisz. Nie panikuj w tej chwili! Musisz znać tylko kilku operatorów opisanych w „TABELI 4.9 Operatory budowy ścieżki” na stronach 226–227. Najważniejszymi operatorami są (pierwsza kolumna zawiera specyfikację współrzędnych dla operatora, druga zawiera operator, a trzecia to nazwa operatora ):
x y m moveto
x y l lineto
x y width height re rectangle
h closepath
W większości przypadków wystarczy znać tych czterech operatorów do odzyskiwania danych.
Teraz musisz zaimportować plik outfile.pdf jako tekst do jakiegoś programu, w którym możesz manipulować danymi. Pokażę, jak to zrobić z Mathematica .
Importowanie pliku:
pdfCode = Import["outfile.pdf", "Text"];
Teraz zakładam najprostszy przypadek: wykres zawiera linię, która składa się z wielu dwupunktowych segmentów. W takim przypadku każdy segment linii jest kodowany w następujący sposób:
268.79999 408.92975 m
272.39999 408.92975 l
Wyodrębnianie wszystkich takich segmentów z kodu PDF:
lines = StringCases[pdfCode,
StartOfLine ~~ x1 : NumberString ~~ " " ~~ y1 : NumberString ~~ " m\n" ~~
x2 : NumberString ~~ " " ~~ y2 : NumberString ~~ " l\n"
:> ToExpression@{{x1, y1}, {x2, y2}}];
Wizualizacja ich:
Graphics[{Line[lines]}]
Otrzymujesz coś takiego (praca, z którą pracuję zawiera cztery wykresy):
Każde dwa sąsiednie segmenty mają jeden punkt. W tym przypadku możesz przekształcić sekwencje sąsiednich segmentów w ścieżki:
paths = Split[lines, #1[[2]] == #2[[1]] &];
Teraz możesz wizualizować wszystkie ścieżki osobno:
Graphics[{Line /@ paths}]
Na tej figurze możesz wybrać (klikając dwukrotnie) szukaną ścieżkę, skopiować zaznaczenie grafiki i wkleić jako nową Graphics
. Aby przekonwertować go do tyłu na listę punktów, weź element {1, 1, 1}
. Teraz mamy punkty nie w układzie współrzędnych wykresu, ale w układzie współrzędnych pliku PDF. Musimy ustalić relacje między nimi.
Z powyższego wykresu wybierasz ręcznie kleszcze (przytrzymując Shift
dla wielokrotnego wyboru), a następnie kopiujesz je i wklej jako nowe Graphics
. Oto, w jaki sposób można wyodrębnić współrzędne poziomych kleszczy:
Teraz sprawdź różnice między kleszczami:
Differences[reHorTicks]
Na podstawie tych różnic można zobaczyć, jak dokładne jest umieszczanie znaczników w pliku PDF. Daje oszacowanie błędu wprowadzonego przez konwersję oryginalnych punktów danych na wykres wektorowy zawarty w pliku PDF. Jeśli występują znaczące błędy w pozycjonowaniu kleszczy, możesz zmniejszyć błąd, dopasowując współrzędne kleszczy do modelu liniowego. Tej funkcji liniowej można teraz użyć do uzyskania oryginalnych współrzędnych punktów ścieżki (czyli w układzie współrzędnych wykresu).