2013-05-21 24 views
6

Trong khi tạo các ô phân tán nhiều điểm trong R (ví dụ: ggplot()), có thể có nhiều điểm nằm phía sau các đối tượng khác và không hiển thị. Ví dụ thấy cốt truyện dưới đây:Giảm kích thước tệp PDF của lô bằng cách lọc các đối tượng ẩn

enter image description here

Đây là một biểu đồ phân tán của vài trăm ngàn điểm, nhưng hầu hết trong số đó là đằng sau các điểm khác. Vấn đề là khi đưa đầu ra vào một tệp vectơ (ví dụ một tệp PDF), các điểm vô hình sẽ làm cho kích thước tệp quá lớn và tăng mức sử dụng bộ nhớ và cpu trong khi xem tệp.

Một giải pháp đơn giản là đưa đầu ra vào ảnh bitmap (ví dụ TIFF hoặc PNG), nhưng chúng mất chất lượng véc tơ và có thể lớn hơn về kích thước. Tôi đã thử một số máy nén PDF trực tuyến, nhưng kết quả có cùng kích thước với tệp gốc của tôi.

Có giải pháp nào tốt không? Ví dụ một số cách để lọc các điểm không hiển thị, có thể trong quá trình tạo cốt truyện hoặc sau đó bằng cách chỉnh sửa tệp PDF?

+4

Giải pháp được khuyến nghị là một âm mưu lục giác. Tuy nhiên, trong một âm mưu hexbin màu cho biết số lượng các giá trị trong mỗi thùng và bạn dường như sử dụng màu sắc cho cái gì khác. – Roland

+0

+1 cho hexbin. Các tùy chọn khác là 'sunflowerplot' và gói' bigvis': https://github.com/hadley/bigvis – Ben

+0

@Roland Có, khi bạn đoán màu sắc của các điểm có ý nghĩa, vì vậy đối với trường hợp hexbin của tôi không phải là giải pháp tốt – Ali

Trả lời

11

Như một sự khởi đầu bạn có thể làm một cái gì đó như thế này:

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

kích thước 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

kích thước PDF: 2373 KB

Với làm tròn, bạn có thể kiểm soát số lượng giá trị bạn muốn xóa. Bạn chỉ cần sửa đổi điều này để xử lý các màu khác nhau.

+0

Đầu tiên chúng ta có thể chia các giá trị X và Y thành khoảng cách ngang/dọc tối thiểu mà chúng ta mong muốn giữa các điểm, làm tròn nó và sau đó lọc ra các bản sao: 'temp <- round (DF2/.1); DF2 <- DF2 [! Duplicate (temp),] ' – Ali

+0

+1 cho ý tưởng tuyệt vời về làm tròn! Đây là giải pháp cực kỳ tuyệt vời, giảm đáng kể kích thước PDF của tôi. Cảm ơn nhiều – Ali

0

Tôi nghĩ rằng nó có thể được thực hiện với một số chế biến sau của tệp pdf. Trong linux, nếu tôi phải giảm một pdf, tôi sẽ làm

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

vì một số lý do hoạt động khá hiệu quả.

Bạn có thể xem một số cuộc thảo luận tại https://askubuntu.com/questions/113544/how-to-reduce-pdf-filesize.

+0

Cảm ơn, nhưng họ là chính xác cùng kích thước, có thể bởi vì các tập tin PDF ban đầu là một vector và không bitmap tập tin. Tôi đã thử một số giải pháp của liên kết hỏi-ubuntu của bạn. – Ali

4

Đơn giản chỉ cần lưu cốt truyện dưới dạng tệp có độ phân giải cao png sẽ giảm kích thước rất lớn, trong khi vẫn giữ chất lượng tốt hơn đủ. Ít nhất tôi chưa bao giờ có các tạp chí phàn nàn về bất kỳ png nào tôi gửi cho họ, chỉ cần đảm bảo sử dụng> 600 dpi.