R: как назначить цвета для определенных значений - PullRequest
1 голос
/ 24 марта 2019

У меня есть пара матриц 10х10, которые заполнены пятью значениями, а именно: 0, 0,5, 1, 1,5 и 2. Не все матрицы имеют все эти значения.

Я хочу сделать графикис одинаковыми значениями всегда с одинаковыми цветами.У меня есть пять определенных цветов, которые я хочу связать с определенными значениями, а именно:

  • 0: "белый
  • 0.5:" голубой "
  • 1:"синий "
  • 1.5:" lightpink1 "
  • 2:" красный "

В настоящее время код выглядит следующим образом:

example_mat <- matrix(sample(c(0,0.5,1,1.5,2),100, replace = TRUE), nrow = 10, ncol = 10)

# make rotate function for plot
rotate <- function(x) t(apply(x, 2, rev))

# plot 
image(rotate(example_mat), col=c("white","light blue","blue","lightpink1","red"), xaxt= "n", yaxt= "n")
grid(nx = 10, ny = 10, col = "black", lty = "solid")
box(which = "plot", lty = "solid")

Это привело к следующему графику:

Plot

Это, кажется, работает хорошо, за исключением того, что у меня есть много этих графиков, а иногда и не все 5 значений (0, 0,5, 1, 1,5 и 2) присутствуют в матрице, и затем он присваивает значениям разные цвета. Как сделать так, чтобы на этом графике всегда были одинаковые цвета для одинаковых значений?

Ответы [ 3 ]

2 голосов
/ 24 марта 2019

Используя базу R, для функции image, выполняющей работу, есть параметр zlim.

set.seed(42)
example_mat1 <- matrix(sample(c(0,0.5,1,1.5,2),100, replace = TRUE), nrow = 10, ncol = 10)
example_mat2 <- example_mat1
example_mat2[example_mat2 == 2] = 0 # remove one of the values

# make rotate function for plot
rotate <- function(x) t(apply(x, 2, rev))

# plot 
image(rotate(example_mat1), col=c("white","light blue","blue","lightpink1","red"), zlim=c(0,2), xaxt= "n", yaxt= "n")
grid(nx = 10, ny = 10, col = "black", lty = "solid")
box(which = "plot", lty = "solid")

image(rotate(example_mat2), col=c("white","light blue","blue","lightpink1","red"), zlim=c(0,2), xaxt= "n", yaxt= "n")
grid(nx = 10, ny = 10, col = "black", lty = "solid")
box(which = "plot", lty = "solid")

Это дает следующие графики ...

With all values With 2.0 changed to 0

2 голосов
/ 24 марта 2019

Одним из способов будет использование ggplot и предварительное определение цвета заливки для каждой плитки на основе ее значения.

#Define colors using named vector
mycols = c(white = 0, lightblue = 0.5, blue = 1, pink = 1.5, red = 2)

#DATA
set.seed(42)
example_mat = matrix(sample(c(0,0.5,1,1.5,2),100, replace = TRUE), nrow = 10, ncol = 10)

rotate <- function(x) t(apply(x, 2, rev))
m1 = rotate(example_mat)

library(ggplot2)

#Convert to long format
d = data.frame(Values = as.vector(m1),
               fillcol = names(mycols[match(m1, mycols)]),
               X = as.vector(row(m1)),
               Y = as.vector(col(m1)))

graphics.off()
ggplot(d, aes(x = X, y = Y)) +
    geom_tile(color = "black", fill = d$fillcol) +
    theme_light() +
    coord_equal()

enter image description here

1 голос
/ 24 марта 2019

Я бы подошел к этому с парой функций 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)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...