我正在使用ggplot的geom_tile进行二维切面的密度图。每个构面的标度从所有数据的最小值到所有数据的最大值,但是每个构面中的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)




运行代码,您将看到两个方面。一个方面显示了“无限”随机正态分布的密度图。第二个方面显示了一个随机法线,该法线被截断为位于原点周围的2x2正方形内。 “受限”构面中的geom_tile将被限制在此小盒子内,而不是填充构面。

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




最后三行绘制具有指定x和y限制的相同数据,并且在这种情况下,我们没有看到任何小平面都将图块部分扩展到边缘。

是否有任何方法可以强制每个构面中的geom_tile扩展到构面的整个范围?

最佳答案

我认为您正在寻找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))




编辑

给出了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())

08-19 09:50