我尝试使用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)
使用标签标记每个刻面的效果非常好,除非每个刻面的刻度变化。有没有人知道当每个刻面的刻度不同时,如何将标签放在同一位置?
最佳, 丹尼尔
答案 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(...)
来生成数据集(我忘了添加它......)。