Нужно наложить две разные тепловые карты - PullRequest
0 голосов
/ 30 октября 2019

Я пытаюсь наложить два разных гексагональных тепловых графика, один из которых показывает вероятность интродукции вида, а другой показывает, занимает ли этот вид этот район или нет. По сути, все уже занятые шестиугольники должны быть черными, тогда как все остальные шестиугольники должны отображать вероятность введения.

Вот некоторые неуклюжие выборочные данные.

df <- data.frame(latitude = rep(seq(1,10,1),10), 
                 longitude = rep(1:10, each=10),
                 already_there = rbinom(100,1,0.1), 
                 introduction_probability = rbinom(100,100,0.5)/100)


Я попытался просто добавить geom_hexаргумент с пределом счетчика, установленным в 1, так что как только мы получим какие-либо вхождения внутри шестиугольника, он станет черным.

ggplot(data=df) + 
  stat_summary_hex(aes(x = longitude, 
                      y = latitude,
                      z = introduction_probability),
                      binwidth = c(2,2)) +
  scale_fill_gradient2(mid="yellow", high="red",
                       breaks=seq(0,1,0.25),
                       limits=c(0,1)) +
  geom_hex(aes(x = longitude, 
                y = latitude,
                z = already_there),
            binwidth=c(2,2)) + 
  scale_fill_gradient2(mid="gray", high="black",
            breaks=seq(0,1,0.25), limits=c(0,1))

Но, конечно, вторая команда заполнения просто переопределяет первую. Есть идеи, как это решить? Альтернативы приветствуются. Я попытался написать ручную функцию для вставки предложения ifelse, чтобы получить другой результат, если шестиугольник уже занят, но не повезло.

1 Ответ

0 голосов
/ 31 октября 2019

Для второго geom_hex вам нужно filter данных, чтобы просто включить строки, где они присутствуют. Если количество присутствий важно, то ggnewscale::new_scale_fill может помочь.

library(tidyverse)
ggplot(data=df, aes(x = longitude, y = latitude)) + 
  stat_summary_hex(aes(z = introduction_probability), binwidth = c(2,2)) +
  scale_fill_gradient2(mid="yellow", high="red", breaks=seq(0,1,0.25), limits=c(0,1)) +
  geom_hex(data = filter(df, already_there == 1), binwidth=c(2,2), fill = "black")
...