2013-05-21 8 views
6

Podczas generowania wykresów rozproszenia wielu punktów w R (na przykład przy użyciu ggplot()) może być wiele punktów, które znajdują się za innymi i wcale nie są widoczne. Na przykład patrz poniższy wykres:Zmniejsz rozmiar pliku PDF za pomocą filtrowania ukrytych obiektów.

enter image description here

Jest to wykres punktowy od kilkuset tysięcy punktów, ale większość z nich znajduje się za innych punktach. Problem polega na tym, że podczas rzutowania danych wyjściowych do pliku wektorowego (na przykład pliku PDF), niewidoczne punkty powodują, że rozmiar pliku jest tak duży, a także zwiększa się wykorzystanie pamięci i procesora podczas przeglądania pliku.

Prostym rozwiązaniem jest rzutowanie obrazu na bitmapę (na przykład TIFF lub PNG), ale tracą one jakość wektorową i mogą być jeszcze większe. Próbowałem niektórych kompresorów PDF online, ale wynik był tego samego rozmiaru co mój oryginalny plik.

Czy istnieje jakieś dobre rozwiązanie? Na przykład jakiś sposób filtrowania punktów, które nie są widoczne, prawdopodobnie podczas generowania wykresu lub po nim, edytując plik PDF?

+4

Zalecanym rozwiązaniem jest wykres sześciokątny. Jednak w kolorze sześciokąta kolor wskazuje liczbę wartości w każdym pojemniku i wydaje się, że używasz koloru do czegoś innego. – Roland

+0

+1 dla heksbina. Inne opcje to 'sunflowerplot' i' bigvis' package: https://github.com/hadley/bigvis – Ben

+0

@Roland Tak, ponieważ odgadłeś, że kolory punktów są znaczące, więc dla mojego przypadku hexbin nie jest dobrym rozwiązaniem – Ali

Odpowiedz

11

Na początek można zrobić coś takiego:

set.seed(42) 
DF <- data.frame(x=x<-runif(1e6),y=x+rnorm(1e6,sd=0.1)) 
plot(y~x,data=DF,pch=".",cex=4) 

enter image description here

rozmiar PDF: 6334 KB

DF2 <- data.frame(x=round(DF$x,3),y=round(DF$y,3)) 
DF2 <- DF[!duplicated(DF2),] 
nrow(DF2) 
#[1] 373429 
plot(y~x,data=DF2,pch=".",cex=4) 

enter image description here

rozmiar PDF: 2373 KB

Zaokrąglenie pozwala kontrolować liczbę wartości, które chcesz usunąć. Tę zmianę należy zmienić tylko w celu obsługi różnych kolorów.

+0

Możemy najpierw podzielić wartości X i Y na minimalną odległość poziomą/pionową, którą chcemy między punktami, zaokrąglić, a następnie odfiltrować duplikaty: 'temp <- round (DF2/.1); DF2 <- DF2 [! Zduplikowany (temp),] ' – Ali

+0

+1 za świetny pomysł zaokrąglania! To było świetne rozwiązanie, znacznie zmniejszyło mój rozmiar pliku PDF. Bardzo dziękuję – Ali

0

Myślę, że można to zrobić po pewnym przetwarzaniu pliku PDF. W Linuksie, jeśli będę musiał zmniejszyć pdf, zrobiłbym

pdf2ps input.pdf output.ps 
ps2pdf output.ps output.pdf 

który z jakiegoś powodu działa całkiem sprawnie.

Możesz zobaczyć dyskusję pod numerem https://askubuntu.com/questions/113544/how-to-reduce-pdf-filesize.

+0

Thanks, ale są one dokładnie tego samego rozmiaru, prawdopodobnie dlatego, że początkowy plik PDF jest plikiem wektorowym, a nie bitmapowym. Próbowałem kilku rozwiązań twojego linku ask-ubuntu. – Ali

4

Po prostu zapisanie wykresu jako pliku o wysokiej rozdzielczości png bardzo drastycznie zmniejszy rozmiar, zachowując przy tym jakość wystarczającą. Przynajmniej nigdy nie miałem czasopism narzekać na którekolwiek z png, które im wysłałem, tylko pamiętaj, żeby użyć> 600 dpi.

Powiązane problemy