在RGoogleMaps中找不到有关轴标签的以下问题的任何文档:
library(RgoogleMaps)
datas <- structure(list(LAT = c(37.875, 37.925, 37.775, 37.875, 37.875),
LON = c(-122.225, -122.225, -122.075, -122.075, -122.025)),
.Names = c("LAT", "LON"), class = "data.frame",
row.names = c(1L, 2L, 3L, 4L, 5L))
# Get bounding box.
boxt <- qbbox(lat = datas$LAT, lon = datas$LON)
MyMap <- GetMap.bbox(boxt$lonR, boxt$latR, destfile = "Arvin12Map.png",
maptype = "mobile")
PlotOnStaticMap(MyMap, lat = datas$LAT, lon = datas$LON,
axes = TRUE, mar = rep(4, 4))
当我在计算机上运行时,水平轴的范围为300W至60E,但两者之间的刻度线不是线性间隔的(300W,200W,100W,0、100E,160W,60W)。
另外,垂直轴从300S线性移动到300N。看来,无论我为数据提供什么数据,轴始终都以这种方式标记。
我的问题是:
1.使用此代码的其他计算机上是否会出现此问题?
2.有人对此有解释吗?
和
3.有人可以建议一种获取正确的轴标签的方法(假设这些标签“不正确”,但也许我在某种程度上误解了绘图!)?
感谢您的时间。
最佳答案
是
正如@Andrie所建议的,这似乎是一个错误。当为axes = TRUE
时,由degAxis()
调用的PlotOnStaticMap()
函数提取由axTicks()
找到的漂亮刻度线的x和y图坐标。 degAxis()
期望这些坐标位于地图的坐标系中,但rGoogleMaps会将它们作为像素坐标返回,该坐标是从中心原点算出的。绘图尺寸为640 x 640时,漂亮的刻度线分别在E-W和N-S方向上分配给-300,-200,-100、0,100、200、300。您最终得到300W,200W,100W,0、100E,160W,60W,因为degreeLabelsEW()
调用的degAxis()
函数假定,在给定的经度必须在[-180,180]内的情况下,任何高于180的经度都是实际上在西半球(例如200E是西半球向东20度,即160W)。不知道为什么它在荒谬的N,S和W坐标下无法达到类似的效果。
一种快速的解决方法,继续您的MyMap
对象:
PlotOnStaticMap(MyMap, lat = datas$LAT, lon = datas$LON,
axes = FALSE, mar = rep(4.5, 4))
# x-axis
xrange <- MyMap$BBOX$ur[2] - MyMap$BBOX$ll[2]
xticklength <- xrange / (length(axTicks(1)) - 1)
xticklabs <- seq(MyMap$BBOX$ll[2], MyMap$BBOX$ur[2], xticklength)
xticklabs <- parse(text = paste(sprintf('%.2f', abs(xticklabs)),
ifelse(xticklabs < 0, '*degree*W', '*degree*E'), sep=''))
axis(1, at=axTicks(1), xticklabs, cex.axis=0.8)
# y-axis
yrange <- MyMap$BBOX$ur[1] - MyMap$BBOX$ll[1]
yticklength <- yrange / (length(axTicks(2)) - 1)
yticklabs <- seq(MyMap$BBOX$ll[1], MyMap$BBOX$ur[1], yticklength)
yticklabs <- parse(text = paste(sprintf('%.2f', abs(yticklabs)),
ifelse(yticklabs < 0, '*degree*S', '*degree*N'), sep=''))
axis(2, at=axTicks(2), yticklabs, cex.axis=0.8, las=1)
关于r - RGoogleMaps轴,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6258408/