如何在ggplot2中控制具有不同比例的刻面图的ylim?

时间:2010-11-05 14:07:59

标签: r visualization ggplot2

在下面的示例中,如何为每个方面设置单独的ylim?

qplot(x, value,  data=df, geom=c("smooth")) + facet_grid(variable ~ ., scale="free_y")

在每个方面中,y轴采用不同的值范围,我希望每个方面都有不同的ylim。

对于我想看到的趋势,默认值ylims太长了。

4 个答案:

答案 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/facetscaleshttps://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