могу ли я отобразить ячейки фрейма данных такими, какие они есть, с цветами?

#r #ggplot2

#r #ggplot2

Вопрос:

У меня есть следующий фрейм данных (df). Я хочу создать график, который показывает одинаковые позиции ячеек в фрейме данных и имеет цвет каждой ячейки в зависимости от значения (-1: 1). если значение равно нулю, тогда цвет синий, если значение равно 1 или -1, тогда значение красное.

 df<- structure(list(`0` = 1:8, `1` = c(0.885, 0.695, 0.828, 0.888, 
0.823, 0.231, 0.599, 0.153), `2` = c(0.834, 0.68, 0.857, 0.802, 
0.734, 0.205, 0.62, 0.044), `3` = c(0.854, 0.66, 0.83, 0.829, 
0.729, 0.159, 0.559, 0.081), `4` = c(0.87, 0.583, 0.778, 0.853, 
0.75, 0.087, 0.515, -0.011), `5` = c(0.922, 0.739, 0.787, 0.805, 
0.635, -0.017, 0.498, -0.204), `6` = c(0.815, 0.535, 0.833, 0.784, 
0.803, 0.092, 0.502, -0.419), `7` = c(0.859, 0.517, 0.8, 0.829, 
0.557, 0.22, 0.368, -0.42), `8` = c(0.86, 0.701, 0.701, 0.786, 
0.567, 0.414, 0.324, -0.396), `9` = c(0.774, 0.781, 0.805, 0.862, 
0.405, 0.852, 0.1, -0.448), `10` = c(0.869, 0.788, 0.837, 0.838, 
0.481, 0, -0.072, -0.48), `11` = c(0.816, 0.795, 0.807, 0.744, 
0.217, 0, 0.096, -0.346), `12` = c(0.829, 0.792, 0.774, 0.778, 
0.003, 0, 0, 0), `13` = c(0.799, 0.84, 0.775, 0.66, -0.024, 0, 
0, 0), `14` = c(0.842, 0.765, 0.852, 0.679, 0, 0, 0, 0), `15` = c(0.804, 
0.811, 0.818, 0.468, 0, 0, 0, 0), `16` = c(0.801, 0.757, 0.715, 
0.091, 0, 0, 0, 0), `17` = c(0.807, 0.786, 0.799, -0.042, 0, 
0, 0, 0), `18` = c(0.595, 0.795, 0.73, 0, 0, 0, 0, 0), `19` = c(0.822, 
0.789, 0.623, 0, 0, 0, 0, 0), `20` = c(0.829, 0.822, 0.048, 0, 
0, 0, 0, 0), `21` = c(0.805, 0.788, -0.205, 0, 0, 0, 0, 0), `22` = c(0.788, 
0.791, -0.065, 0, 0, 0, 0, 0), `23` = c(0.839, 0.786, -0.217, 
0, 0, 0, 0, 0), `24` = c(0.804, 0.815, 0, 0, 0, 0, 0, 0), `25` = c(0.789, 
0.784, 0, 0, 0, 0, 0, 0), `26` = c(0.754, 0.787, 0, 0, 0, 0, 
0, 0), `27` = c(0.832, 0.741, 0, 0, 0, 0, 0, 0), `28` = c(0.846, 
0.778, 0, 0, 0, 0, 0, 0), `29` = c(0.797, 0.69, 0, 0, 0, 0, 0, 
0), `30` = c(0.843, 0.644, 0, 0, 0, 0, 0, 0), `31` = c(0.825, 
0.622, 0, 0, 0, 0, 0, 0), `32` = c(0.824, 0.726, 0, 0, 0, 0, 
0, 0), `33` = c(0.749, 0.493, 0, 0, 0, 0, 0, 0), `34` = c(0.774, 
-0.082, 0, 0, 0, 0, 0, 0), `35` = c(0.652, -0.255, 0, 0, 0, 0, 
0, 0), `36` = c(0.833, 0, 0, 0, 0, 0, 0, 0), `37` = c(0.795, 
0, 0, 0, 0, 0, 0, 0), `38` = c(0.864, 0, 0, 0, 0, 0, 0, 0), `39` = c(0.226, 
0, 0, 0, 0, 0, 0, 0)), row.names = c(NA, -8L), class = "data.frame")
 

Ответ №1:

У вас нет ячеек, которые равны -1 или 1, поэтому нет ни одной, которая была бы красной. Вы не упомянули, какого цвета должны быть ячейки, если они не равны -1, 0 или 1, поэтому я оставил их белыми:

 library(ggplot2)
library(tidyr)
library(dplyr)

pivot_longer(df, -1) %>% 
   mutate(name = factor(as.numeric(name), 
                        sort(unique(as.numeric(name))))) %>%
   ggplot(aes(name, `0`, fill = ifelse(value == 0, "blue",
                                  ifelse(abs(value) == 1, "red", "white"))))   
   geom_tile(color = "black")  
   scale_y_reverse(breaks = seq(nrow(df)), expand = c(0, 0))  
   scale_x_discrete(position = "top")  
   scale_fill_identity()  
   coord_equal()  
   theme_classic()  
   theme(axis.line = element_blank(),
         axis.title = element_blank(),
         legend.position = "none")
 

введите описание изображения здесь


Редактировать

Обновление на основе комментария от OP:

 library(ggplot2)
library(tidyr)
library(dplyr)

pivot_longer(df, -1) %>% 
   mutate(name = factor(as.numeric(name), 
                        sort(unique(as.numeric(name))))) %>%
   ggplot(aes(name, `0`, fill = value))   
   geom_tile(color = "black")  
   scale_y_reverse(breaks = seq(nrow(df)), expand = c(0, 0))  
   scale_x_discrete(position = "top")  
   scale_fill_gradient2(low = "red", mid = "blue", high = "red",
                        breaks = c(-1, 0, 1), limits = c(-1, 1))  
   coord_equal()  
   theme_classic()  
   theme(axis.line = element_blank(),
         axis.title = element_blank())
         legend.position = "none")
 

введите описание изображения здесь

Комментарии:

1. Это отличный график. Я хочу, чтобы цвет постепенно менялся с синего (равен нулю) на красный (если 1 или -1). таким образом, если значение находится между ними, оно принимает значение в зависимости от интенсивности (ноль не является интенсивным, 1 и -1 очень интенсивны).

2. @mustafa я вижу — пожалуйста, ознакомьтесь с моим обновлением