Вот подход с ggplot и dplyr.
Сначала я преобразую данные в длинный формат, по одной букве на строку таблицы, с числовым столбцом и координатами строки.
library(dplyr); library(ggplot2)
ltrs_tidy <- alpha_ltrs %>%
rownames_to_column(var = "row") %>%
mutate_all(as.character) %>%
tidyr::gather(col, ltr, -row) %>%
mutate_at(vars(c("row", "col")),
~str_remove(., "r|c") %>% as.integer)
Затем я вычисляю, какие цвета использовать, добавляя новый столбец, показывающий значение строки 2 для этого столбца, и затем определяю правила в операторе case_when
.
ltrs_tidy2 <- ltrs_tidy %>%
left_join(ltrs_tidy %>% filter(row == 2) %>% select(col, ltr_row2 = ltr), by = "col") %>%
mutate(fill_calc = case_when(
row == 1 ~ "white",
row == 2 ~ "blue",
ltr %in% c(".") ~ "white",
ltr == ltr_row2 ~ "blue",
TRUE ~ "red"
))
Наконец, я рисую заштрихованные geom_tile
и geom_text
в каждом месте.
ggplot(ltrs_tidy2, aes(col, row, label = ltr, fill = fill_calc)) +
geom_tile(alpha = 0.5) +
geom_text(size = 2.5, family = "mono") +
scale_y_reverse() +
scale_fill_identity() +
coord_fixed(ratio = 2) +
theme_minimal()