56

在向绘图添加注释文本时,我注意到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)

在此处输入图像描述

4

2 回答 2

82

geom_text,尽管没有直接使用agedata.frame 中的任何内容,但仍将其用作其数据源。因此,它在绘图上放置了 20 个“Average=42.3”副本,每行一个。正是多次覆盖使它看起来如此糟糕。 旨在将文本放在信息来自 data.frame 的图上(在原始调用geom_text中直接或间接给出)。专为像您这样的简单一次性添加而设计(它创建一个,负责数据源)。ggplotannotategeom_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)

在此处输入图像描述

于 2012-06-08T17:00:40.583 回答
23

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

从 docs?geom_textcheck_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 出色答案的评论中发布的答案。我只是想让这个答案更明显!

于 2019-06-06T23:32:08.957 回答