在绘图中添加注释文本时,我注意到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)
答案 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)
答案 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出色答案时发表的答案。我只是想让这个答案更明显!