如何强制ggplot的geom_tile填充每个facet?

7

我正在使用ggplot的geom_tile函数制作一个2D密度图,通过一个因素进行分组。每个分组的比例尺从所有数据的最小值到所有数据的最大值,但是每个分组中的geom_tile只能延伸到该分组中绘制的数据范围。

以下是示例代码,它展示了这个问题:

library(ggplot2)

data.unlimited <- data.frame(x=rnorm(500), y=rnorm(500))
data.limited <- subset(data.frame(x=rnorm(500), y=rnorm(500)), x<1 & y<1 & x>-1 & y>-1)

mydata <- rbind(data.frame(groupvar="unlimited", data.unlimited),
                data.frame(groupvar="limited", data.limited))

ggplot(mydata) +
  aes(x=x,y=y) +
  stat_density2d(geom="tile", aes(fill = ..density..), contour = FALSE) +
  facet_wrap(~ groupvar)

facet

运行代码,你会看到两个图表。其中一个图表显示了一个“无限制”的随机正态分布的密度图。第二个图表显示了一个随机正态分布,被截断为在原点周围2x2的正方形内。在“受限制”的图表中,geom_tile将被限制在这个小框内而不是填充整个图表。

last_plot() +
  scale_x_continuous(limits=c(-5,5)) + 
  scale_y_continuous(limits=c(-5,5))

指定的极限

这最后三行代码使用指定的x和y轴极限绘制相同的数据,我们可以看到在这种情况下,两个面板都没有将瓷砖区域延伸到边缘。

有什么方法可以强制每个面板中的geom_tile扩展到整个面板的范围吗?

1个回答

15
我认为您正在寻找scales = "free"expand = c(0,0)的组合:
ggplot(mydata) +
  aes(x=x,y=y) +
  stat_density2d(geom="tile", aes(fill = ..density..), contour = FALSE) +
  facet_wrap(~ groupvar,scales = "free") + 
  scale_x_continuous(expand = c(0,0)) + 
  scale_y_continuous(expand = c(0,0))

图片描述在这里

编辑

根据提问者的澄清,以下是通过手动设置面板背景的一种选项:

ggplot(mydata) +
  aes(x=x,y=y) +
  stat_density2d(geom="tile", aes(fill = ..density..), contour = FALSE) +
  facet_wrap(~ groupvar) + 
  scale_fill_gradient(low = "blue", high = "red") + 
  opts(panel.background = theme_rect(fill = "blue"),panel.grid.major = theme_blank(),
       panel.grid.minor = theme_blank())

enter image description here


不,我希望所有的方面都具有相同的比例尺。基本上,我只想在有限的一侧的2x2框外部显示纯蓝色,以表示那里没有密度。换句话说,我不希望比例尺缩小到数据范围内,我只想用geom_tile覆盖整个区域而不改变比例尺。 - Ryan C. Thompson
在这种情况下,最好手动设置面板背景。我会更新一个例子... - joran
@Ryan - 你也可以在这里查看另一个选项(https://dev59.com/a2w05IYBdhLWcg3w_Guw),不过我认为那假设你已经掌握了密度值。 - joran

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接