2012-06-08 32 views
27

將註釋文字添加到繪圖時,我注意到geom_text()產生了難看的鋸齒形文字,而annotate()產生了平滑,漂亮的文字。有誰知道爲什麼會發生這種情況,如果有任何解決方法?我知道我可以在這裏使用annotate(),但可能有些情況下geom_text()是可取的,我希望找到解決辦法。此外,geom_text()不能意圖給予看起來不好看的文字,所以無論我做錯了什麼,或者我遇到了某種微妙的副作用。ggplot2:是否有解決由geom_text()生成的參差不齊的文本?

下面是一些假數據和生成圖形的代碼,以及顯示結果的圖像。

library(ggplot2) 
age = structure(list(age = c(41L, 40L, 43L, 44L, 40L, 42L, 44L, 45L, 
     44L, 41L, 43L, 40L, 43L, 43L, 40L, 42L, 43L, 44L, 43L, 41L)), 
     .Names = "age", row.names = c(NA, -20L), class = "data.frame") 
ggplot(age, aes(age)) + 
    geom_histogram() + 
    scale_x_continuous(breaks=seq(40,45,1)) + 
    stat_bin(binwidth=1, color="black", fill="blue") + 
    geom_text(aes(41, 5.2, 
      label=paste("Average = ", round(mean(age),1))), size=12) + 
    annotate("text", x=41, y=4.5, 
      label=paste("Average = ", round(mean(age$age),1)), size=12) 

enter image description here

+0

使用結構是好的,但不要忘記分配:''''年齡= structure' '''。我編輯了你的例子。 –

+0

我的解決方法是,我生成'ggplot'中的所有重要元素,然後生成'ggsave(file =「plot.eps」)'並使用Adobe Illustrator或其他矢量圖形程序編輯出版品質數字。 – Maiasaura

回答

51

geom_text,儘管沒有直接使用任何從age data.frame,仍然使用它的數據源。因此,它將20個「Average = 42.3」的副本放在該圖上,每行一個。這是多重覆蓋,使它看起來很糟糕。 geom_text旨在將文本放在信息來自data.frame(它直接或間接地在原始ggplot調用中給出)的圖上。 annotate專爲簡單的一次性添加而設計(它會創建一個geom_text,負責處理數據源)。

如果你真的想用geom_text(),只是重置數據源:

ggplot(age, aes(age)) + 
    scale_x_continuous(breaks=seq(40,45,1)) + 
    stat_bin(binwidth=1, color="black", fill="blue") + 
    geom_text(aes(41, 5.2, 
      label=paste("Average = ", round(mean(age$age),1))), size=12, 
      data = data.frame()) + 
    annotate("text", x=41, y=4.5, 
      label=paste("Average = ", round(mean(age$age),1)), size=12) 

enter image description here

+0

很好理解'geom_text()'是如何工作的。感謝您的幫助Brian。 – eipi10

+0

+1 Brian,一個寫得很好的圖解答案和有用的提示重新註釋()的例子。 –

+0

自從您重置數據後,它應該不是'geom_text'的'mean(age $ age)'嗎? – colinfang

相關問題