调整geom_tile大小以移除边距效果

时间:2015-10-13 11:30:24

标签: r ggplot2

我尝试可视化各种随机抽样方法,这些方法严格在单位正方形(x,y)内生成[0,1]x[0,1]对。我的想法是通过将正方形划分为更小的正方形并计算每个正方形内的点来展示均匀性。我将这些计数存储在不同大小的矩阵中,例如

cells1 <- structure(c(0, 1, 0, 0, 1, 0, 2, 3, 1, 1, 0, 1, 0, 0, 2, 0, 2, 
0, 1, 1, 2, 1, 0, 0, 3, 1, 2, 1, 1, 1, 0, 1, 3, 2, 2, 1, 1, 2, 
0, 0, 0, 1, 0, 2, 1, 3, 0, 0, 1, 1, 2, 1, 1, 2, 1, 0, 1, 0, 2, 
0, 0, 0, 3, 1, 1, 2, 0, 0, 1, 2, 0, 1, 0, 0, 1, 3, 0, 3, 3, 1, 
1, 0, 0, 0, 0, 1, 1, 2, 0, 3, 0, 2, 0, 1, 1, 3, 4, 0, 1, 5, 1, 
1, 1, 0, 0, 5, 0, 4, 2, 0, 0, 1, 1, 2, 0, 1, 3, 1, 0, 3, 2, 0, 
1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 2, 1, 3, 1, 0, 0, 
2, 2, 1, 1, 0, 2, 1, 1, 2, 0, 1, 0, 2, 1, 0, 0, 2, 0, 0, 0, 0, 
1, 0, 0, 1, 1, 2, 1, 2, 1, 1, 2, 0, 3, 1, 2, 1, 0, 0, 1, 1, 1, 
1, 2, 1, 0, 1, 1, 0, 1, 1, 0, 0, 2, 1, 1, 1, 1, 1, 4, 1, 0, 0, 
0, 1, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 2, 1, 3, 0, 1, 3, 0, 0, 0, 
1, 3, 1, 0, 1, 1, 1, 2, 1, 2, 2, 1, 1, 2, 0, 0, 1, 2, 0, 1, 2, 
1, 2, 1, 0, 0, 1, 1, 2), .Dim = c(16L, 16L))

cells2 <- structure(c(16, 16, 16, 16, 16, 16, 16, 16, 16, 17, 16, 16, 16, 
15, 16, 16), .Dim = c(4L, 4L))

当然,我考虑过geom_tile,我当前的代码如下。

plot_step <- function(cells, filename = NULL) {
  library(ggplot2)
  library(reshape2)
  plot_data <- melt(cells, varnames = c("x", "y"))
  # transform from index to tile position
  plot_data$x <- (plot_data$x - 1) / max(plot_data$x - 1)
  plot_data$y <- (plot_data$y - 1) / max(plot_data$y - 1)
  ggplot(plot_data, aes(x, y, fill = value)) +
    geom_tile() +
    geom_text(aes(label = value)) +
    theme_bw() +
    scale_fill_gradient(low="white", high="red") +
    guides(fill = FALSE)
}

plot_step(cells1); plot_step(cells2)

enter image description here

enter image description here

除了小问题,它几乎是我想要的。理想情况下,注释转换和平铺大小相结合应该产生一个完全覆盖整个单位正方形的图像,而不会挂在零或高于一致。

我用第二张照片的优秀手绘技巧突出了所需的余量。我对可以针对不同尺寸(cells1cells2普遍使用的解决方案感兴趣,例如,挂出的方式不同)。它可能是一个轻微的数据转换或geom_tile的一些调整,或者两者兼而有之。

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:1)

瓷砖总是位于质心的位置。解决方案是为每个轴计算一组断点和标签。

n.x <- length(unique(plot_data$x))
x.breaks <- seq(-nx / 2, 1 + nx/2, length = 5)
x.labels <- seq(0, 1, length = 5)
scale_x_continuous(breaks = x.breaks, labels = x.label)

您可能还想添加coord_fixed()。它会给你方形瓷砖。

答案 1 :(得分:1)

基于@Thierry的想法,我能够以下列方式调整轴:

plot_step <- function(cells, filename = NULL) {
  library(ggplot2)
  library(reshape2)
  plot_data <- melt(cells, varnames = c("x", "y"))
  n <- ncol(cells)
  # here's the adjustment
  br <- seq(1 - 0.5, n + 0.5, length = 5)
  lab <- seq(0, 1, length = 5)
  ggplot(plot_data, 
         aes(x, y, fill = value)) +
    geom_tile() +
    geom_text(aes(label = value)) +
    theme_bw() +
    scale_fill_gradient(low = "white", high = "red") +
    guides(fill = FALSE) + 
    scale_x_continuous(breaks = br, labels = lab) +
    scale_y_continuous(breaks = br, labels = lab) 
}

这适用于所有切片大小(例如,在我的示例中为cells1cells2)。这是样本图片:

enter image description here