【发布时间】:2019-02-14 16:58:51
【问题描述】:
我已经为此制定了一个解决方案,但它很丑陋、临时且不可概括;我认为必须有更好的方法。我们的研究区域分为 100mx100m 块的网格,列名为 3-8,行名为 C-J。每个块分为四个样方,每个样方又分为四个子样方,因此子方的名称类似于“4F23”;划分模式如下所示:
11 12 21 22
13 14 23 24
31 32 41 42
33 34 43 44
不同的数据集使用三种分辨率中的任何一种,所以我想要一些可以处理“4F”、“4F1”和“4F34”的东西。为了在该区域的热图/叶绿素中显示值,我需要一种方法来表示该嵌套方案与 ggplot 更正交——或者更好的是,告诉 ggplot 一些东西,以便它知道如何解释部分标签本身。我想要的是一种简单的方法来绘制我们任何研究的地图。我能想到的最好办法是使用翻译函数来生成 XY 并将它们绑定到数据框。
toyDF <- tibble(SECT = c('3E1', '5G3', '8H4'), HT = c(22,6,15))
# Translator function
SACoords <- function(sqr) {
sqVec <- substring(sqr, seq(1, nchar(sqr), 1), seq(1, nchar(sqr), 1))
rws <- 'JIHGFEDC'
cl <- (as.integer(sqVec[1]) - 3) * 100
rw <- (as.integer(gregexpr(sqVec[2], rws)) - 1) * 100
qd <- ifelse(!is.na(sqVec[3]),
list(c(0,50), c(50,50), c(0,0), c(50,0))[as.integer(sqVec[3])],
c(0,0))
sq <- ifelse(!is.na(sqVec[4]),
list(c(0,25), c(25,25), c(0,0), c(25,0))[as.integer(sqVec[4])],
c(0,0))
coords <- data.frame(c(cl, rw), qd, sq)
rowSums(coords, na.rm=TRUE)
}
#> SACoords('8C24') # Test
#[1] 575 750 # Yes
# Mash in the coordinates (as lists)
toyXY <- toyDF %>%
mutate(coords = sapply(SECT, SACoords, simplify=FALSE))
# Got the coords in, but as lists -- difficult to work with;
# but can't mutate() into two columns with one operation, so
# redo it this ungainly way:
toyXY[,4:5] <- matrix(unlist(sapply(toyDF$SECT, SACoords)),
ncol=2, byrow=TRUE)
names(toyXY)[4:5] <- c('Xcoor', 'Ycoor')
# And finally to plot (in reality many observations per SECT)
toyXY %>% group_by(SECT) %>%
mutate(MHT = mean(HT)) %>%
ggplot(aes(xmin=Xcoor, xmax=Xcoor + 50, ymin=Ycoor, ymax=Ycoor+50)) +
geom_rect(aes(fill = MHT))
有了完整的数据集,这正是我想要的结果,但这很糟糕。我最想要的(我认为)是让我的SACoords() 成为一个转换,我可以插入到ggplot(aes()) 调用中,这样它就可以有效地理解SECT 标签,希望允许我改用geom_raster geom_rect 并避免 xmin/xmax 及其笨拙的常数,这些常数必须根据给定研究的分辨率进行调整。下一个最好的可能是学习地图的模板表示 - 2d 矩阵,24x32?列表列表的6x8矩阵? - 但我不知道如何告诉 ggplot 阅读它。还是我真的应该将所有这些都封装在一个可以处理所有事情的更大函数中?
【问题讨论】:
-
我认为您正在寻找
geom_tile而不是geom_rect,但您的数据集中与不同SECT标签对应的部分是否会重叠? -
@Z.Lin 在我的 rtfm 中,
geom_tile只是使用(x,y,w,h)而不是 '(xmin,xmax,ymin,ymax)` - 在这种情况下,这是一个稍微烦人的计算。不,谢天谢地,没有重叠——它是一个简单的网格,只有这个分层分段问题。在任何一项研究中,我们总是只使用一个级别的部分,所以它总是平铺的正方形。 -
看看我的回答是否适合你。我已经排除了
MHT =mean(HT)` 部分,因为如果部分之间没有重叠,则不需要它,但如果您愿意,可以将其添加回来。 -
是的,
mean(HT)部分在这里毫无意义。在真实数据中,每个 SECT 都有很多观察结果,而不仅仅是一个,所以mean()只是作为我正在绘制的那种值的一个例子。不过对于玩具箱来说,是的,是多余的。
标签: r ggplot2 heatmap cartesian-coordinates