2017-09-02 241 views
3

導出的ggplot圖有可能得到很好的抗鋸齒功能嗎?我試過Cairo包以及幾個不同的設備,但他們似乎都有鋸齒邊緣。ggplot導出的抗鋸齒

library(ggplot2) 
library(Cairo) 

p <- ggplot(data.frame(x=1:5,y=1:5),aes(x=x,y=y))+ 
    geom_text(aes(2.5,2.5),label="Brown Fox bla bla..",size=5)+ 
    labs(x=NULL,y=NULL)+ 
    theme_bw()+ 
    theme(plot.background=element_blank(), 
     plot.margin = margin(c(0,0,0,0)), 
     axis.title = element_blank(), 
     axis.text = element_blank(), 
     axis.ticks = element_blank(), 
     axis.line = element_blank(), 
     panel.grid = element_blank(), 
     panel.border = element_blank(), 
     panel.background = element_blank()) 

png("test-nocairo.png",height=2,width=6,units="cm",res=300) 
print(p) 
dev.off() 

png("test-cairo.png",height=2,width=6,units="cm",res=300,type="cairo") 
print(p) 
dev.off() 

tiff("test-cairo.tiff",height=2,width=6,units="cm",res=300,type="cairo") 
print(p) 
dev.off() 

ggsave("test-ggsave.png",height=2,width=6,units="cm",dpi=300,type="cairo") 

png-nocairo PNG沒有開羅

png-cairo PNG開羅

tiff-cairo TIFF開羅

png-ggsave-cairo PNG ggsave開羅

對於我目的,重要的是圖像在300dpi時是PNG或TIFF(無損)。我知道我可以導出爲矢量格式(SVG,PDF等),然後使用另一個程序轉換爲PNG/TIFF,但這顯然是額外的工作。我很好奇,如果在R中有任何解決方案我可以忽略。

photoshop

作爲參考,以上是從Photoshop渲染的質量。 PNG Arial 14pt。

回答

1

好的。我可能在這裏偶然發現了一些東西。當我使用annotate而不是geom_text時,cairo抗鋸齒似乎可行。

p <- ggplot(data.frame(x=1:5,y=1:5),aes(x=x,y=y))+ 
    annotate("text",x=2.5,y=2.5,label="Brown Fox bla bla..",size=5)+ 
    labs(x=NULL,y=NULL)+ 
    theme_bw()+ 
    theme(plot.background=element_blank(), 
     plot.margin = margin(c(0,0,0,0)), 
     axis.title = element_blank(), 
     axis.text = element_blank(), 
     axis.ticks = element_blank(), 
     axis.line = element_blank(), 
     panel.grid = element_blank(), 
     panel.border = element_blank(), 
     panel.background = element_blank()) 

png("test-annotate-cairo.png",height=2,width=6,units="cm",res=300,type="cairo") 
print(p) 
dev.off() 

png-annotate-cairo

所以,好像geom_text是overplotting這可能是問題的相同的文字。我認爲這種重疊繪圖的事情在某個時刻是固定的。我認爲抗鋸齒還有改進的空間,但這比以前好得多。

+0

是的,用戶有誤,與抗鋸齒無關。 'geom_text'在你原來的代碼中,就像它應該的那樣。這就是爲什麼'註釋'存在。或者,爲文本圖層使用另一個數據集。 – baptiste