#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 я вижу — пожалуйста, ознакомьтесь с моим обновлением