通过坐标的堆图:`stat_密度2d()`计算失败

问题描述 投票:0回答:1

我正在尝试根据坐标创建热图。我的数据如下所示:

data<-structure(list(Date.Time = c("2024-04-06 10:35:30", "2024-04-06 10:40:30", 
                               "2024-04-06 10:45:30", "2024-04-06 10:50:30", "2024-04-06 10:35:30", 
                               "2024-04-06 10:40:30", "2024-04-06 10:45:30", "2024-04-06 10:50:30", 
                               "2024-04-06 10:35:30", "2024-04-06 10:40:30", "2024-04-06 10:45:30", 
                               "2024-04-06 10:50:30", "2024-04-06 10:35:30", "2024-04-06 10:40:30", 
                               "2024-04-06 10:45:30", "2024-04-06 10:50:30", "2024-04-06 10:35:30", 
                               "2024-04-06 10:40:30", "2024-04-06 10:45:30", "2024-04-06 10:50:30", 
                               "2024-04-06 10:35:30", "2024-04-06 10:40:30", "2024-04-06 10:45:30", 
                               "2024-04-06 10:50:30", "2024-04-06 10:35:30", "2024-04-06 10:40:30", 
                               "2024-04-06 10:45:30", "2024-04-06 10:50:30", "2024-04-06 10:35:30", 
                               "2024-04-06 10:40:30", "2024-04-06 10:45:30", "2024-04-06 10:50:30", 
                               "2024-04-06 10:35:30", "2024-04-06 10:40:30", "2024-04-06 10:45:30", 
                               "2024-04-06 10:50:30"), Index = c(101L, 101L, 101L, 101L, 103L, 
                                                                 103L, 103L, 103L, 104L, 104L, 104L, 104L, 105L, 105L, 105L, 105L, 
                                                                 107L, 107L, 107L, 107L, 108L, 108L, 108L, 108L, 109L, 109L, 109L, 
                                                                 109L, 110L, 110L, 110L, 110L, 111L, 111L, 111L, 111L), Test1 = c(478L, 
                                                                                                                                  888L, 552L, 502L, 626L, 913L, 727L, 636L, 637L, 11928L, 836L, 
                                                                                                                                  615L, 740L, 1209L, 941L, 660L, 973L, 1266L, 700L, 840L, 441L, 
                                                                                                                                  8028L, 616L, 659L, 538L, 8639L, 612L, 496L, 812L, 999L, 768L, 
                                                                                                                                  542L, 460L, 1488L, 597L, 691L), Test2 = c(1L, 7L, 0L, 3L, 0L, 
                                                                                                                                                                            0L, 0L, 0L, 0L, 112L, 0L, 0L, 1L, 7L, 3L, 2L, 0L, 0L, 0L, 0L, 
                                                                                                                                                                            4L, 2029L, 1L, 8L, 1L, 48L, 1L, 0L, 2L, 4L, 5L, 3L, 2L, 1L, 0L, 
                                                                                                                                                                            0L), Test3 = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 
                                                                                                                                                                                           0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 95L, 1L, 0L, 0L, 3L, 0L, 
                                                                                                                                                                                           0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), Long = c(-14449.287, -14449.287, 
                                                                                                                                                                                                                                         -14449.287, -14449.287, -14449.278, -14449.278, -14449.278, -14449.278, 
                                                                                                                                                                                                                                         -14449.257, -14449.257, -14449.257, -14449.257, -14449.29, -14449.29, 
                                                                                                                                                                                                                                         -14449.29, -14449.29, -14449.287, -14449.287, -14449.287, -14449.287, 
                                                                                                                                                                                                                                         -14449.246, -14449.246, -14449.246, -14449.246, -14449.273, -14449.273, 
                                                                                                                                                                                                                                         -14449.273, -14449.273, -14449.27, -14449.27, -14449.27, -14449.27, 
                                                                                                                                                                                                                                         -14449.27, -14449.27, -14449.27, -14449.27), Lat = c(4537.509, 
                                                                                                                                                                                                                                                                                              4537.509, 4537.509, 4537.509, 4537.51, 4537.51, 4537.51, 4537.51, 
                                                                                                                                                                                                                                                                                              4537.485, 4537.485, 4537.485, 4537.485, 4537.516, 4537.516, 4537.516, 
                                                                                                                                                                                                                                                                                              4537.516, 4537.505, 4537.505, 4537.505, 4537.505, 4537.478, 4537.478, 
                                                                                                                                                                                                                                                                                              4537.478, 4537.478, 4537.499, 4537.499, 4537.499, 4537.499, 4537.497, 
                                                                                                                                                                                                                                                                                              4537.497, 4537.497, 4537.497, 4537.506, 4537.506, 4537.506, 4537.506
                                                                                                                                                                                                                                         )), class = "data.frame", row.names = c(NA, -36L))

按照写在here的建议,我重新组织了我的数据并尝试生成图表。

df1<-data.frame(long = rep(data$Long, data$Test1),
                lat = rep(data$Lat, data$Test1),
                time = rep(data$Date.Time, data$Test1),
                index = rep(data$Index, data$Test1))
df2<-data.frame(long = rep(data$Long, data$Test2),
                lat = rep(data$Lat, data$Test2),
                time = rep(data$Date.Time, data$Test2),
                index = rep(data$Index, data$Test2))
df3<-data.frame(long = rep(data$Long, data$Test3),
                lat = rep(data$Lat, data$Test3),
                time = rep(data$Date.Time, data$Test3),
                index = rep(data$Index, data$Test3))

ggplot(df2, aes(x=long, y=lat)) +
  lims(x=c(-14449.4, -14449.1), y=c(4537.4, 4537.65))+
  coord_cartesian(xlim=c(-14449.3, -14449.23), ylim=c(4537.45, 4537.53)) +
  stat_density2d(aes(fill=..level.., alpha=..level..),
                 geom="polygon") +
  scale_fill_gradientn(colors=rev(brewer.pal(7, "Spectral"))) +
  facet_wrap(~time, nrow=2)

10:40:30 时间戳的 Test2 (df2) 未填充并导致错误消息:

Warning message:
Computation failed in `stat_density2d()`
Caused by error in `MASS::kde2d()`:
! bandwidths must be strictly positive

df2 heatmaps

1.) 我在here读到,这是由于

stat_density2d()
使用了
MASS::kde2d
,它使用
MASS::bandwidth.nrd(df2$long)
来计算带宽。它从第一个分位数 (25%) 中减去第三个分位数 (75%)。这个差异需要大于 0。使用
MASS::bandwidth.nrd(df2$long)
quantile(df2$long)
,我的分位数如下所示:

bandwidth.nrd(df2$long)    
[1] 0

quantile(df2$long)
           0%       25%       50%       75%      100% 
    -14449.29 -14449.25 -14449.25 -14449.25 -14449.25 

我能做些什么来解决这个问题吗?

2.) 为什么图例中的红色标记为 1600,而 10:45:30 图表上的最高值为 5?

感谢您的见解!

r heatmap stat-density2d
1个回答
0
投票

您似乎在使用 ggplot2 根据坐标数据生成热图时遇到了一些挑战。让我们解决您的问题并提供一些指导:

带宽计算错误:警告消息表明 stat_密度2d 的带宽计算失败,因为带宽计算为 0。当数据范围非常小或数据点非常接近时,通常会发生这种情况。一种可能的解决方案是手动将 stat_密度2d 中的带宽参数设置为较小的正值以覆盖自动计算。您可以尝试将 geom_密度_2d_band(bandwidth = 0.1) 添加到 ggplot 代码中以指定固定带宽值。 图例标签不正确:当未向scale_fill_gradientn 函数提供正确的值范围时,可能会出现图例标签显示“1600”而不是正确的最大值的问题。确保使用scale_fill_gradientn中的limits参数指定填充比例的限制。例如,limits = c(0, 5) 应将色标限制在数据中存在的值的范围内。 这是包含这些建议的 ggplot 代码的更新版本:

https://fajasfits.com/collections/waist-trainers

这些调整应该有助于解决您在从坐标数据生成热图时遇到的问题。如果您仍然遇到困难,请随时寻求进一步的帮助!

© www.soinside.com 2019 - 2024. All rights reserved.