在下面的示例中,如何为每个方面设置单独的ylim?
qplot(x, value, data=df, geom=c("smooth")) + facet_grid(variable ~ ., scale="free_y")
在每个方面中,y轴采用不同的值范围,我希望每个方面都有不同的ylim。
对于我想看到的趋势,默认值ylims太长了。
答案 0 :(得分:12)
不久前这是brought up on the ggplot2 mailing list。你要求的目前是不可能的,但我认为它正在进行中。
答案 1 :(得分:5)
据我所知,这还没有在ggplot2中实现。然而,一个解决方法 - 将为您提供超出ggplot自动提供的ylims - 是添加“人工数据”。要减少ylims,只需删除不想绘图的数据(参见和示例)。
以下是一个例子:
让我们设置一些您想要绘制的虚拟数据
df <- data.frame(x=rep(seq(1,2,.1),4),f1=factor(rep(c("a","b"),each=22)),f2=factor(rep(c("x","y"),22)))
df <- within(df,y <- x^2)
我们可以使用折线图进行绘图
p <- ggplot(df,aes(x,y))+geom_line()+facet_grid(f1~f2,scales="free_y")
print(p)
假设我们想让y从第一行的-10开始,第二行的0开始,所以我们在(0,-10)的左上图和(0,0)低点添加一个点。左图:
ylim <- data.frame(x=rep(0,2),y=c(-10,0),f1=factor(c("a","b")),f2=factor(c("x","y")))
dfy <- rbind(df,ylim)
现在通过将x比例限制在1和2之间,不会绘制这些添加点(给出警告):
p <- ggplot(dfy,aes(x,y))+geom_line()+facet_grid(f1~f2,scales="free_y")+xlim(c(1,2))
print(p)
同样适用于通过在x值范围之外的x值处添加y值较高的点来扩展上边距。
如果你想减少ylim,这将不起作用,在这种情况下,对数据进行子集化将是一个解决方案,例如将上行限制在你可以使用的-10到1.5之间:
p <- ggplot(dfy,aes(x,y))+geom_line(subset=.(y < 1.5 | f1 != "a"))+facet_grid(f1~f2,scales="free_y")+xlim(c(1,2))
print(p)
答案 2 :(得分:1)
实际上,现在有两个软件包可以解决该问题:
https://github.com/zeehio/facetscales和https://github.com/teunbrand/ggh4x。
我建议使用ggh4x
,因为它具有非常有用的工具,例如多面网格(具有2个定义行或列的变量),按需在每个面上缩放x和y轴,以及多种填充和色标。
对于您的问题,解决方案将如下所示:
library(ggh4x)
scales <- list(
# Here you have to specify all the scales, one for each facet row in your case
scale_y_continuous(limits = c(2,10),
scale_y_continuous(breaks = c(3, 4))
)
qplot(x, value, data=df, geom=c("smooth")) +
facet_grid(variable ~ ., scale="free_y") +
facetted_pos_scales(y = scales)
答案 3 :(得分:0)
我有一个函数 facet_wrap
的例子ggplot(mpg, aes(displ, hwy)) +
geom_point() +
facet_wrap(vars(class), scales = "free",
nrow=2,ncol=4)
以上代码生成的情节为: my level too low to upload an image, click here to see plot