我如何强制ggplot的geom_tile填充每个方面?

Rya*_*son 7 r ggplot2

我正在使用ggplot的geom_tile做一个因子面对的2-D密度图.每个方面的比例从所有数据的最小值到所有数据的最大值,但每个方面中的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)
Run Code Online (Sandbox Code Playgroud)

面

运行代码,您将看到两个方面.一个方面显示"无限"随机正态分布的密度图.第二个方面显示一个随机法线截断,位于原点周围的2x2方格内."有限"刻面中的几何体将被限制在这个小盒子内,而不是填充刻面.

last_plot() +
  scale_x_continuous(limits=c(-5,5)) + 
  scale_y_continuous(limits=c(-5,5))
Run Code Online (Sandbox Code Playgroud)

指定的限制

最后三行绘制了具有指定x和y限制的相同数据,并且我们看到在这种情况下,两个facet都没有将tile部分扩展到边缘.

有没有办法强制每个方面的geom_tile延伸到facet的整个范围?

jor*_*ran 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))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

编辑

鉴于OP的澄清,通过简单地手动设置面板背景,这里有一个选项:

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())
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述