我想在ggplot密度图中添加额外的geoms,但不更改显示的数据限制,也不必通过自定义代码计算所需的限制.举个例子:
set.seed(12345)
N = 1000
d = data.frame(measured = ifelse(rbernoulli(N, 0.5), rpois(N, 100), rpois(N,1)))
d$fit = dgeom(d$measured, 0.6)
ggplot(d, aes(x = measured)) + geom_density() + geom_line(aes(y = fit), color = "blue")
ggplot(d, aes(x = measured)) + geom_density() + geom_line(aes(y = fit), color = "blue") + coord_cartesian(ylim = c(0,0.025))
在第一个图中,拟合曲线(非常严重地拟合“测量”数据)模糊了测量数据的形状:
我想裁剪绘图以包含来自第一个geom的所有数据,但是裁剪拟合曲线,如第二个图:
虽然我可以使用coord_cartesian生成第二个图,但这有两个缺点:
>我必须通过自己的代码计算限制(这很麻烦且容易出错)
>通过我自己的代码计算限制与分面不兼容.使用coord_cartesian提供per-facet轴限制是不可能的(AFAIK).然而,我需要将情节与facet_wrap(scales =“free”)结合起来
如果在计算坐标限制时不考虑第二个geom,那么可以实现所需的输出 – 是否可以在不计算自定义R代码中的限制的情况下实现?
这个问题
R: How do I use coord_cartesian on facet_grid with free-ranging axis是相关的,但没有令人满意的答案.
最佳答案 你可以尝试的一件事是缩放适合度并使用geom_density(aes(y = ..scaled ..)
缩放适合0到1之间:
d$fit_scaled <- (d$fit - min(d$fit)) / (max(d$fit) - min(d$fit))
使用fit_scaled和..scaled ..:
ggplot(d, aes(x = measured)) +
geom_density(aes(y = ..scaled..)) +
geom_line(aes(y = fit_scaled), color = "blue")
这可以与facet_wrap()结合使用:
d$group <- rep(letters[1:2], 500) #fake group
ggplot(d, aes(x = measured)) +
geom_density(aes(y = ..scaled..)) +
geom_line(aes(y = fit_scaled), color = "blue") +
facet_wrap(~ group, scales = "free")
一个不缩放数据的选项:
您可以使用http://www.cookbook-r.com/Graphs/Multiple_graphs_on_one_page_(ggplot2)/中的multiplot()函数
multiplot <- function(..., plotlist=NULL, file, cols=1, layout=NULL) {
library(grid)
plots <- c(list(...), plotlist)
numPlots = length(plots)
if (is.null(layout)) {
layout <- matrix(seq(1, cols * ceiling(numPlots/cols)),
ncol = cols, nrow = ceiling(numPlots/cols))
}
if (numPlots==1) {
print(plots[[1]])
} else {
grid.newpage()
pushViewport(viewport(layout = grid.layout(nrow(layout), ncol(layout))))
for (i in 1:numPlots) {
matchidx <- as.data.frame(which(layout == i, arr.ind = TRUE))
print(plots[[i]], vp = viewport(layout.pos.row = matchidx$row,
layout.pos.col = matchidx$col))
}
}
}
使用此功能,您可以将两个图组合在一起,从而更容易阅读它们:
multiplot(
ggplot(d, aes(x = measured)) +
geom_density() +
facet_wrap(~ group, scales = "free"),
ggplot(d, aes(x = measured)) +
geom_line(aes(y = fit), color = "blue") +
facet_wrap(~ group, scales = "free")
)
这会给你:
如果你想比较彼此相邻的组,你可以在multiplot()中使用facet_grid()而不是facet_wrap()和cols = 2:
multiplot(
ggplot(d, aes(x = measured)) +
geom_density() +
facet_grid(group ~ ., scales = "free"),
ggplot(d, aes(x = measured)) +
geom_line(aes(y = fit), color = "blue") +
facet_grid(group ~ ., scales = "free"),
cols = 2
)
它看起来像这样: