使用矩阵图 (matplot) 作为地图和位置作为位置
Using a matrix plot (matplot) as map and positions as locations
我有兴趣使用矩阵图作为田野地图,并将矩阵中的某些位置用作特定植物(田野内的位置)。
我正在使用此数据:
Field<-matrix(1:1240,nrow = 40,ncol = 31)
SampTreatment<- sample(Field,6,replace = F) # Results: 388 155 582 405 1173 165
SampControl<- sample(Field,6,replace = F) # Results: 848 270 1159 1050 1177 1184
我正在尝试使用以下方法绘制它:
matplot(Field,col = 1,pch = 1,lty = 1)
points(SampControl,col= 'blue',pch=19,cex=1.5)
points(SampTreatment,col= 'red',pch=17,cex=1.5)
并获得:
问题是情节似乎没有在正确的地方显示位置。
首先,您可能想像这样创建矩阵,
n <- 6; m <- 4
(field <- matrix(seq_len(n), n, m))
# [,1] [,2] [,3] [,4]
# [1,] 1 1 1 1
# [2,] 2 2 2 2
# [3,] 3 3 3 3
# [4,] 4 4 4 4
# [5,] 5 5 5 5
# [6,] 6 6 6 6
并且,正如评论中已经建议的那样,sample
x 和 y 坐标。只需将过程包装在 small 函数中即可。
sampfun <- \(size, mat) {
stopifnot(size*2 <= prod(dim(mat)))
s <- matrix(,size*2, 2, dimnames=list(NULL, c('x', 'y')))
for (i in seq_len(size*2)) {
repeat {
x <- sample(ncol(mat), 1, replace=TRUE)
y <- sample(nrow(mat), 1, replace=TRUE)
s[i, ] <- cbind(x, y)
if (!any(duplicated(s[1:i,,drop=FALSE]))) break
}
}
return(list(treated=s[1:size, ], control=s[-(1:size), ]))
}
set.seed(42)
(samp <- sampfun(6, field))
# $treated
# x y
# [1,] 1 5
# [2,] 1 1
# [3,] 2 4
# [4,] 2 2
# [5,] 1 4
# [6,] 3 3
#
# $control
# x y
# [1,] 3 4
# [2,] 4 3
# [3,] 2 1
# [4,] 2 6
# [5,] 3 6
# [6,] 4 6
现在请注意,matplot
转置,因此您还需要 t
转置。最好我们使用自定义 axis
es 来避免分数。
png('test.png')
matplot(t(field), col=1, pch=1, xlab='x', ylab='y', main='Field', xaxt='n', yaxt='n')
axis(1, seq_len(ncol(field))); axis(2, seq_len(nrow(field)))
points(samp$control, col='blue', pch=19, cex=1.5)
points(samp$treated, col='red', pch=17, cex=1.5)
## optional legend
legend(par()$usr[1], par()$usr[3] - .5, legend=c('treated', 'control'),
col=c('red', 'blue'), pch=c(17, 19), bty='n', horiz=TRUE, cex=.9, xpd=TRUE)
dev.off()
我有兴趣使用矩阵图作为田野地图,并将矩阵中的某些位置用作特定植物(田野内的位置)。 我正在使用此数据:
Field<-matrix(1:1240,nrow = 40,ncol = 31)
SampTreatment<- sample(Field,6,replace = F) # Results: 388 155 582 405 1173 165
SampControl<- sample(Field,6,replace = F) # Results: 848 270 1159 1050 1177 1184
我正在尝试使用以下方法绘制它:
matplot(Field,col = 1,pch = 1,lty = 1)
points(SampControl,col= 'blue',pch=19,cex=1.5)
points(SampTreatment,col= 'red',pch=17,cex=1.5)
并获得:
问题是情节似乎没有在正确的地方显示位置。
首先,您可能想像这样创建矩阵,
n <- 6; m <- 4
(field <- matrix(seq_len(n), n, m))
# [,1] [,2] [,3] [,4]
# [1,] 1 1 1 1
# [2,] 2 2 2 2
# [3,] 3 3 3 3
# [4,] 4 4 4 4
# [5,] 5 5 5 5
# [6,] 6 6 6 6
并且,正如评论中已经建议的那样,sample
x 和 y 坐标。只需将过程包装在 small 函数中即可。
sampfun <- \(size, mat) {
stopifnot(size*2 <= prod(dim(mat)))
s <- matrix(,size*2, 2, dimnames=list(NULL, c('x', 'y')))
for (i in seq_len(size*2)) {
repeat {
x <- sample(ncol(mat), 1, replace=TRUE)
y <- sample(nrow(mat), 1, replace=TRUE)
s[i, ] <- cbind(x, y)
if (!any(duplicated(s[1:i,,drop=FALSE]))) break
}
}
return(list(treated=s[1:size, ], control=s[-(1:size), ]))
}
set.seed(42)
(samp <- sampfun(6, field))
# $treated
# x y
# [1,] 1 5
# [2,] 1 1
# [3,] 2 4
# [4,] 2 2
# [5,] 1 4
# [6,] 3 3
#
# $control
# x y
# [1,] 3 4
# [2,] 4 3
# [3,] 2 1
# [4,] 2 6
# [5,] 3 6
# [6,] 4 6
现在请注意,matplot
转置,因此您还需要 t
转置。最好我们使用自定义 axis
es 来避免分数。
png('test.png')
matplot(t(field), col=1, pch=1, xlab='x', ylab='y', main='Field', xaxt='n', yaxt='n')
axis(1, seq_len(ncol(field))); axis(2, seq_len(nrow(field)))
points(samp$control, col='blue', pch=19, cex=1.5)
points(samp$treated, col='red', pch=17, cex=1.5)
## optional legend
legend(par()$usr[1], par()$usr[3] - .5, legend=c('treated', 'control'),
col=c('red', 'blue'), pch=c(17, 19), bty='n', horiz=TRUE, cex=.9, xpd=TRUE)
dev.off()