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

eip*_*i10 37 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)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

Bri*_*ggs 65

geom_text尽管没有直接从agedata.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)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • 另一个简单的解决方法是在`geom_text`中使用arguement`ch​​eck_overlap = TRUE` (7认同)

Ric*_*loo 6

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

从文档?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) 
Run Code Online (Sandbox Code Playgroud)

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