Тепловая карта R ggplot2, принудительное дискретное масштабирование с настраиваемым диапазоном, добавление сетки на карту

Я создал ниже тепловую карту

тепловая карта

для которого я использовал этот код:

library(ggplot2)
library(reshape2)

winners_min_expd0 <- matrix(c(NA, 2, 2, 3, NA, 3, 2, 2, NA), nrow=3, ncol=3, byrow = T)
colnames(winners_min_expd0) <- c("homophily","heterophily","preferential")
rownames(winners_min_expd0) <- c("homophily","heterophily","preferential")
melted_min_expd0 <- melt(winners_min_expd0)
colnames(melted_min_expd0) <- c("winning", "looses", "times")
p_min_expd0 <- ggplot(melted_min_expd0, aes(looses, winning)) +
   geom_tile(aes(fill = times), colour = "white") +
   scale_fill_gradient(low = "white", high = "red") +
   ggtitle("Min function, exp decay off") +
   scale_y_discrete(limits=c("preferential", "heterophily", "homophily")) +
   xlab("(x) looses against (y)") + ylab("(y) winning over (x)")
p_min_expd0

Я хотел бы:

  • перемасштабировать полосу «раз» в диапазон <0:5>, я понимаю, что нет значений {0,1,4,5}, но я хотел бы иметь этот диапазон
  • сделайте шкалу тепла «times» дискретной, что означает один сплошной цвет для одного числа, например. 5 = hot red, 4 = red и т. д. (возможный дубликат: тепловая карта ggplot2 с цветами для ранжированных значений), такие диапазоны, как <0,1), приемлемы, но я предпочитаю одиночные натуральные числа на шкале (вместо диапазонов значений)
  • добавьте тонкую сетку на тепловую карту, чтобы все плитки (включая белые) разделялись ею
  • изменить серый цвет значений NA на более светло-серый

Помощь приветствуется, а также более короткий код.
Спасибо!


person oski86    schedule 03.07.2015    source источник


Ответы (1)


Вот некоторые модификации

p_min_expd0 <- ggplot(melted_min_expd0, aes(looses, winning)) +
   geom_tile(aes(fill = cut(times, breaks=0:5, labels=1:5)), colour = "grey") +
   ggtitle("Min function, exp decay off") +
   scale_y_discrete(limits=c("preferential", "heterophily", "homophily")) +
   scale_fill_manual(drop=FALSE, values=colorRampPalette(c("white","red"))(5), na.value="#EEEEEE", name="Times") + 
   xlab("(x) looses against (y)") + ylab("(y) winning over (x)")

Поскольку вам нужна дискретная шкала, вы можете позаботиться о своих первых двух «пожеланиях», выполнив преобразование самостоятельно с помощью cut(). Это делает дискретную переменную из непрерывной. Поскольку сейчас мы используем декретную шкалу, мы должны сами установить цветовую шкалу с помощью параметра scale_fill_manual. Цвет «сетки» задается параметром colour= в geom_tile. Цвет NA устанавливается с помощью scale_fill_maual(na.value=).

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

person MrFlick    schedule 03.07.2015
comment
Я заметил, что мой вопрос был отклонен. Как вы думаете, я недостаточно исследовал или, может быть, я использовал неподходящий стиль письма? Я хотел бы стать лучшим пользователем SO. Спасибо за предложения. - person oski86; 03.07.2015
comment
По сути, вы просто опубликовали длинный список правок, которые нужно внести в свой сюжет, и попросили кого-нибудь сделать это за вас. На каждую из этих задач, вероятно, уже есть ответ здесь, на SO. Это просто задать только один, четко сфокусированный вопрос за раз и показать, что вы приложили усилия, чтобы ответить на него самостоятельно. но вы проделали хорошую работу, включая воспроизводимый пример, который очень полезен. - person MrFlick; 03.07.2015