有没有一种方法可以使用geom_raster在ggplot2中的矩形周围创建边框?

时间:2019-05-30 14:23:18

标签: r ggplot2

我通过稍微调整Amelia包中missmap函数中的一些代码来创建丢失数据的可视化。我想在矩形周围绘制边框,但是我找不到在ggplot2中做到这一点的方法。

我找到了函数“ borders()”,但这似乎与地图工作有关。我也尝试使用geom_rect,但似乎需要我指定最小值和最大值。 Geom_raster似乎完全可以满足我的需要,但是我不知道如何指定边框。

此示例代码创建了我正在想象的可视化,但是在“真实”版本中我有更多的变量,并且我希望能够用一行勾勒出每个变量(var1,var2等)的轮廓。边框)。

#Dataset
missmap_data_test <- data.frame(var1 = c(11, 26, NA, NA, 15),
                                var2 = c(NA, NA, 0, NA, 1))

#Create Function
ggplot_missing <- 

function(x){
  x %>% 
    is.na %>%
    melt %>%
    ggplot(data = .,
           aes(x = Var2,
               y = Var1)) +
    geom_raster(aes(fill = value)) +
    scale_fill_grey(name = "",
                    labels = c("Present","Missing")) +
    theme_minimal() + 
    theme(axis.text.x  = element_text(angle=90, hjust=1)) + 
    labs(x = "Variables in Dataset",
         y = "Observations")
}

#Feed the function my new data
ggplot_missing(missmap_data_test)

1 个答案:

答案 0 :(得分:1)

正如@Axeman建议的那样,geom_tile可以完成这项工作。我已经更新了您的代码,以在下面提供示例。在这里,colour定义边框的颜色,而size定义边框的厚度。

#Dataset
missmap_data_test <- data.frame(var1 = c(11, 26, NA, NA, 15),
                                var2 = c(NA, NA, 0, NA, 1))

# Load libraries
library(dplyr)
library(ggplot2)
library(reshape2)

#Create Function
ggplot_missing <- function(x){
    x %>% 
      is.na %>%
      melt %>%
      ggplot(data = .,
             aes(x = Var2,
                 y = Var1)) +
      geom_tile(aes(fill = value), colour = "#FF3300", size = 2) +
      scale_fill_grey(name = "",
                      labels = c("Present","Missing")) +
      theme_minimal() + 
      theme(axis.text.x  = element_text(angle=90, hjust=1)) + 
      labs(x = "Variables in Dataset",
           y = "Observations")
  }

#Feed the function my new data
ggplot_missing(missmap_data_test)

reprex package(v0.3.0)于2019-05-30创建

如果在左上角有凹口(已讨论here,并且在上图中很明显),则可能需要更新为ggplot2的开发版本。即devtools::install_github("tidyverse/ggplot2")。例如,将上面的图与下面的图进行比较:


更新

我认为这是一个玩具示例,因此我尝试提出一种通用解决方案。在这里,我创建了一个名为boxy的函数,该函数将基于原始数据帧为geom_rect创建一个数据帧。

#Dataset
missmap_data_test <- data.frame(var1 = c(11, 26, NA, NA, 15),
                                var2 = c(NA, NA, 0, NA, 1))

# Function for making box data frame
boxy <- function(df){
  data.frame(xmin = seq(0.5, ncol(df) - 0.5),
             xmax = seq(1.5, ncol(df) + 0.5),
             ymin = 0.5, ymax = nrow(df) + 0.5)
}

# Load libraries
library(dplyr)
library(ggplot2)
library(reshape2)

#Create Function
ggplot_missing <- function(x){
  df_box <- boxy(x)
  df_rast <- x %>% is.na %>% melt

  ggplot() +
  geom_raster(data = df_rast,
              aes(x = Var2,
                  y = Var1,
                  fill = value)) +
  geom_rect(data = df_box, 
            aes(xmin = xmin, xmax = xmax,
                ymin = ymin, ymax = ymax),
            colour = "#FF3300", fill = NA, size = 3) + 
  scale_fill_grey(name = "",
                  labels = c("Present","Missing")) +
  theme_minimal() + 
  theme(axis.text.x  = element_text(angle = 90, hjust = 1)) + 
  labs(x = "Variables in Dataset",
       y = "Observations")
}

#Feed the function my new data
ggplot_missing(missmap_data_test)

reprex package(v0.3.0)于2019-05-30创建

如果在数据框中添加第三个变量(即列),则会得到以下内容: