Я бы подошел к этому с парой функций dplyr
и tidyr
, чтобы создать фрейм данных, соответствующий форме для ggplot2
, а затем использовать плитку ggplot2
. Я рассматриваю столбец значений как символ, чтобы сделать его явно дискретным. Если бы у вас было больше значений, вы могли бы вместо этого использовать cut
для разбиения на уровни факторов.
Во-первых, я создал именованный вектор цветов, который войдет в scale_fill_manual
- цвета - это векторные элементы, а соответствующие числа - это имена, как и ожидаемая установка для аргумента values
шкалы.
library(ggplot2)
library(dplyr)
library(tidyr)
set.seed(324)
example_mat <- matrix(sample(c(0,0.5,1,1.5,2),100, replace = TRUE), nrow = 10, ncol = 10)
colors <- c("white", "lightblue", "blue", "lightpink1", "red") %>%
setNames(c(0, 0.5, 1, 1.5, 2))
Затем, чтобы изменить данные для построения графика, я создаю фрейм данных, добавляю номера строк и преобразую в длинную форму с помощью gather
. Автоматические имена столбцов были заданы как V1
, V2
, ..., поэтому я извлекаю числовую часть этого текста с помощью регулярного выражения \\d+
, чтобы получить номера столбцов.
rotate <- function(x) t(apply(x, 2, rev))
mat_long <- rotate(example_mat) %>%
as_tibble() %>%
mutate(row = row_number()) %>%
gather(key = col, value = value, -row) %>%
mutate(col = stringr::str_extract(col, "\\d+") %>% as.numeric())
mat_long
#> # A tibble: 100 x 3
#> row col value
#> <int> <dbl> <dbl>
#> 1 1 1 1
#> 2 2 1 1.5
#> 3 3 1 1.5
#> 4 4 1 2
#> 5 5 1 1.5
#> 6 6 1 0.5
#> 7 7 1 0
#> 8 8 1 1
#> 9 9 1 0.5
#> 10 10 1 0.5
#> # … with 90 more rows
Тогда построение графиков будет довольно простым, значения будут рассматриваться как символы, а для заливки задана именованная цветовая палитра.
ggplot(mat_long, aes(x = col, y = row, fill = as.character(value))) +
geom_tile(color = "black") +
scale_fill_manual(values = colors) +
theme_void()

Создано в 2019-03-24 пакетом Представить (v0.2.1)