ggplot2:是否修复了geom_text()生成的锯齿状,质量差的文本?

时间:2012-06-08 16:41:01

标签: r ggplot2

在绘图中添加注释文本时,我注意到geom_text()生成了难看的锯齿状文本,而annotate()生成了流畅,漂亮的文本。有谁知道为什么会发生这种情况,如果有办法解决它?我知道我可以在这里使用annotate(),但有些情况下geom_text()更可取,我想找一个修复程序。另外,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

2 个答案:

答案 0 :(得分:63)

geom_text尽管没有直接使用age data.frame中的任何内容,但仍然将其用作数据源。因此,它正在放置20份"平均值= 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

答案 1 :(得分:4)

尝试geom_text(..., check_overlap = TRUE) *

在文档?geom_text中,check_overlap说:

  

如果为TRUE,则不会绘制与同一图层中先前文本重叠的文本。

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() +
  stat_bin(binwidth=1) +
  geom_text(aes(41, 5.2, label=paste("Average = ", round(mean(age),1))), 
            size=12, 
            check_overlap = TRUE) 

* 这实质上是Dave Gruenewald在评论Brian出色答案时发表的答案。我只是想让这个答案更明显!