Есть ли способ создать границы вокруг прямоугольников в ggplot2 с помощью geom_raster?

Я создаю визуализацию отсутствующих данных, немного изменяя часть кода из функции missmap в пакете Amelia. Я хочу нарисовать границы вокруг своих прямоугольников, но не могу найти способ сделать это в 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)

Вместо этого используйте geom_tile. geom_raster быстрее, но более ограничено.

Axeman 30.05.2019 16:28
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
1
1 965
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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)

Created on 2019-05-30 by the reprex package (v0.3.0)

Если вы получаете зазубрины в верхнем левом углу (обсуждается здесь и видно на графике выше), вы можете обновить версию 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)

Created on 2019-05-30 by the reprex package (v0.3.0)

Если вы добавите третью переменную (например, столбец) в свой фрейм данных, вы получите что-то вроде этого:

Спасибо @Lyngbakr! Это очень близко к тому, что мне нужно. Однако мне нужны линии не вокруг каждой ячейки, а вокруг каждой переменной. Есть ли способ сделать это? Другими словами, один большой красный прямоугольник вокруг «столбца» var1 и такой же большой красный прямоугольник вокруг «столбца» var2, но без горизонтальных линий между верхом и низом а именно.

Emily Bovee 30.05.2019 17:46

@EmilyBovee Извините, я неправильно понял. Я обновил свой ответ.

Lyngbakr 30.05.2019 18:30

Это так здорово. Большое спасибо!! Я попробую.

Emily Bovee 31.05.2019 16:07

Другие вопросы по теме