Ваши данные не полностью полны, чтобы составить тепловую карту. У вас нет единственного значения для каждой комбинации X и Y.
Здесь я воспроизвожу ваш пример, выполнив:
DF <- data.frame(X = runif(100,0,100),
Y = runif(100,0,100),
sum = sample(0:30,100, replace =TRUE))
Вы можете построить их как точку:
ggplot(DF,aes(x = X, y = Y, color= sum))+
geom_point()
Еще одна возможность, если вы хотите создать тепловую карту, это создать несколько групповых интервалов (0-10 / 10-20 / ...) , Вы можете сделать это, используя cut
функции:
library(dplyr)
DF <- DF %>% mutate(CutX = cut(X,seq(0,100, by = 10)),
CutY = cut(Y,seq(0,100, by = 10)))
X Y sum CutX CutY
1 19.48048 79.1970915 17 (10,20] (70,80]
2 42.47574 34.1226793 10 (40,50] (30,40]
3 43.99754 25.7454872 7 (40,50] (20,30]
4 90.88465 0.3961523 18 (90,100] (0,10]
5 46.26645 38.0338865 25 (40,50] (30,40]
6 93.15978 59.9426569 15 (90,100] (50,60]
Затем вам нужно расширить этот фрейм данных для каждой комбинации X и Y, выполнив:
Expand_DF <- expand.grid(CutX = unique(DF$CutX), CutY = unique(DF$CutY))
Expand_DF$Sum <-NA
CutX CutY Sum
1 (10,20] (70,80] NA
2 (40,50] (70,80] NA
3 (90,100] (70,80] NA
4 (30,40] (70,80] NA
5 (80,90] (70,80] NA
6 (70,80] (70,80] NA
Наконец, вы можно связать их вместе, и если несколько значений находятся в одном и том же интервале, вы можете вычислить среднее значение и, наконец, построить их в ggplot, выполнив:
library(dplyr)
library(ggplot2)
DF %>% bind_rows(.,Expand_DF) %>%
group_by(CutX, CutY) %>%
summarise(Sum = mean(sum,na.rm = TRUE)) %>%
ggplot(aes(x = CutX, y = CutY, fill = Sum))+
geom_tile(color = "black")+
scale_fill_gradient(na.value = "white")
Это отвечает на ваш вопрос?