Я создаю визуализацию отсутствующих данных, немного изменяя часть кода из функции 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)
Как предполагает @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, но без горизонтальных линий между верхом и низом а именно.
@EmilyBovee Извините, я неправильно понял. Я обновил свой ответ.
Это так здорово. Большое спасибо!! Я попробую.
Вместо этого используйте
geom_tile
.geom_raster
быстрее, но более ограничено.