有没有办法用geom_raster在ggplot2中的矩形周围创建边框?

Emi*_*vee 2 r ggplot2

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

我找到了函数“borders()”,但这似乎与地图工作有关。我也尝试使用 geom_rect,但这似乎需要我指定 mins 和 maxes。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)
Run Code Online (Sandbox Code Playgroud)

Lyn*_*akr 6

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

reprex 包(v0.3.0)于 2019 年 5 月 30 日创建

如果您在左上角出现缺口(在此处讨论并在上图中很明显),您可能需要更新到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)
Run Code Online (Sandbox Code Playgroud)

reprex 包(v0.3.0)于 2019 年 5 月 30 日创建

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