使用facetted密度向ggplot添加文本

时间:2014-04-06 16:22:53

标签: r ggplot2 facet

我尝试使用ggplot创建密度图时遇到问题。 数据看起来有点像这里的例子。

require(ggplot2)
require(plyr)
mms <- data.frame(deliciousness = rnorm(100),
                  type=sample(as.factor(c("peanut", "regular")), 100, replace=TRUE),
                  color=sample(as.factor(c("red", "green", "yellow", "brown")), 100, replace=TRUE))


mms.cor <- ddply(.data=mms, .(type, color), summarize, n=paste("n =", length(deliciousness)))

plot <- ggplot(data=mms, aes(x=deliciousness)) + geom_density() + facet_grid(type ~ color) + geom_text(data=mms.cor, aes(x=1.8, y=5, label=n), colour="black", inherit.aes=FALSE, parse=FALSE)

使用标签标记每个刻面的效果非常好,除非每个刻面的刻度变化。有没有人知道当每个刻面的刻度不同时,如何将标签放在同一位置?

最佳, 丹尼尔

1 个答案:

答案 0 :(得分:3)

这样的东西?

plot <- ggplot(data=mms, aes(x=deliciousness)) +
  geom_density(aes(y=..scaled..)) + facet_grid(type ~ color) +
  geom_text(data=mms.cor, aes(x=1.2, y=1.2, label=n), colour="black")
plot

有一种方法可以通过ggplot在scales="free"内部设置限制,但它涉及黑客攻击grob(图形对象)。由于您似乎希望密度图具有相同的高度(???),因此您可以使用aes(y=..scaled...)执行此操作。然后设置标签的位置很简单。

编辑(对OP评论的回应)

这就是我对黑客grob的意思。请注意,这利用了gglpot使用的内部结构。问题是,随着新版本的发生,这可能随时发生变化(实际上它已经与旧版本不同)。因此无法保证此代码将来能够正常运行。

plot <- ggplot(data=mms, aes(x=deliciousness)) +
  geom_density() + 
  facet_grid(type ~ color, scales="free")
panels <- ggplot_build(plot)[["panel"]]
limits <- do.call(rbind,lapply(panels$ranges,
                               function(range)c(range$x.range,range$y.range)))
colnames(limits) <- c("x.lo","x.hi","y.lo","y.hi")
mms.cor <- cbind(mms.cor,limits)
plot + 
  geom_text(data=mms.cor, aes(x=x.hi, y=y.hi, label=n), hjust=1,colour="black")

基本思路是在没有文本的情况下生成plot ,然后使用ggplot_build(plot)构建图形对象。从中我们可以提取x和y限制,并将它们绑定到mms.cor数据框中的标签。现在使用这些限制使用文本渲染绘图。

请注意,这些图与我之前的答案不同,因为您没有在代码中使用set.seed(...)来生成数据集(我忘了添加它......)。