rworldmap包 - 将xlim保持在一系列地图中,但左边区域正在变化

时间:2013-12-10 00:47:16

标签: r maps rworldmap

我正在尝试创建一系列地图组成的动画。在这个动画的一个阶段,我需要保持地图的左端,并且只能将其向右延伸。为此,我保持xlim下限固定并仅更改xlim上限。

library(rworldmap)

worldMap <- getMap(resolution = "high")

fixedLatitude <- c(36.76, 38.76)

# Fixed lower limit of the X axis
fixedMinLongitude <- 20.64
# Varying the upper limit of the X axis 
maxLongitudes <- seq(22.64, 22.78498, length.out = 4)
longitudes <- lapply(maxLongitudes, function(x) c(fixedMinLongitude, x))

countMaps <- 1
for (ln in longitudes){
  png(paste("test", countMaps, ".png", sep = ""))
  mapCountryData(worldMap,
                 xlim = ln,
                 ylim = fixedLatitude,
                 addLegend = F, mapTitle = "")

  dev.off()
  countMaps <- countMaps + 1
}

我预计地图左边的区域在四个数字中不会改变。也就是说,这些轮廓不会从地图上切掉。但是result I got was this

在这些序列中,可以看到左侧岛屿的边缘正在改变,因为地图向右“行走”,而不仅仅是按我预期的那样向右倾斜。

我哪里错了?

一个更极端的例子(垂直线)

library(rworldmap)

worldMap <- getMap(resolution = "high")

fixedLatitude <- c(36.76, 38.76)

# Fixed lower limit of the X axis
fixedMinLongitude <- 20.64
# Varying the upper limit of the X axis 
maxLongitudes <- seq(22, 25, length.out = 4)
longitudes <- lapply(maxLongitudes, function(x) c(fixedMinLongitude, x))

proportionLeftSpace <- seq(0,0, length.out = 4)
countMaps <- 1
for (ln in longitudes){
  png(paste("test", countMaps, ".png", sep = ""))
  mapCountryData(worldMap,
                  xlim = ln,
                  ylim = fixedLatitude,
                  addLegend = F, mapTitle = "")
 abline(v = ln)

 plotRegionMinX <- par("usr")[1]
 spaceBeforeXlim <-  ln[1] -  plotRegionMinX
 onePercentXAxis <- diff(ln)/100
 proportionLeftSpace[countMaps] <- spaceBeforeXlim/onePercentXAxis 

 dev.off()
 countMaps <- countMaps + 1
}

proportionLeftSpace

The result.

在这个例子中,第一个和第二个地图之间的过渡有我提到的问题,但是,其他地图之间的过渡是我想要的。

根据安迪的建议,我添加了垂直线条。这表明第一张地图中xlim的下限与“情节区域”之间的距离更大。为了证实这一点,我添加了proportionLeftSpace变量,用于存储底部xlim之前剩余空间的百分比。结果是:

39.28339  4.00000  4.00000  4.00000

因此,第一张地图中xlim之前的空间比其他地图高10倍。

1 个答案:

答案 0 :(得分:0)

@celacanto太棒了!感谢问题的澄清,并帮助我准确理解R&amp;因此rworldmap处理绘图范围。

您问题的简短回答: 在第一个图中左侧xlim和左侧图边界之间存在较大的间隙,因为ylim相对于xlim较大,因此确定了图的比例。如下图所示,ylim确定了上面两个图中的比例,xlim确定了下面2个图中的比例。

larger x border because ylim determines scale in upper two plots

解决方案是使ylim相对于xlim更小,如下面的代码所示,这应该意味着左图边框不会像在此图中那样移动: x border constant because xlim determines scale in all plots

library(rworldmap)

#worldMap <- getMap(resolution = "high")
#this makes it quicker & illustrates the same thing
worldMap <- getMap(resolution="low")

#fixedLatitude <- c(36.76, 38.76)
#making the latitudinal difference smaller
#so that the longitudinal difference always determines map scale
fixedLatitude <- c(36.76, 37.76)

# Fixed lower limit of the X axis
fixedMinLongitude <- 20.64
# Varying the upper limit of the X axis 
maxLongitudes <- seq(22, 25, length.out = 4)
longitudes <- lapply(maxLongitudes, function(x) c(fixedMinLongitude, x))

#create blank object to store left space
proportionLeftSpace <- seq(0,0, length.out = 4)

#alternative to put all 4 plots together on windows, comment out png & dev.off
#windows()
#op <- par(mfrow = c(2, 2))

countMaps <- 1
for (ln in longitudes){
  png(paste("xlimtest", countMaps, ".png", sep = ""))
  mapCountryData(worldMap,
                 xlim = ln,
                 ylim = fixedLatitude,
                 addLegend = F, mapTitle = "")


  abline(v=ln)
  abline(h=fixedLatitude)

  #from celacanto
  plotRegionMinX <- par("usr")[1]
  spaceBeforeXlim <-  ln[1] -  plotRegionMinX
  onePercentXAxis <- diff(ln)/100
  proportionLeftSpace[countMaps] <- spaceBeforeXlim/onePercentXAxis

  dev.off()
  countMaps <- countMaps + 1
}

proportionLeftSpace

在此示例中,proportionLeftSpace以常量4,4,4,4形式出现,这是R的默认设置。

希望有所帮助,祝你好运!