根据频率用符号绘制地理地图

时间:2011-12-01 11:52:51

标签: r gis qgis

我想根据县内疾病的频率绘制一个具有n个正方形的地理地图。像这样的人: enter image description here

但是我无法弄清楚如何用R或qGIS做到这一点。 谢谢你们的帮助。

2 个答案:

答案 0 :(得分:7)

首先编写一个名为'stackbox'的小函数,在正确的位置绘制(使用“rect”)堆栈的正方形。

这是该功能的第一行:

stackbox <- function(x,y,n,size,maxheight=5){
  • 其中'size'是盒子的高度和宽度,'maxheight'可以让你有一个5高或10高的堆栈。

然后为每个有案件的县调用该函数。

你究竟在哪里坚持这个过程?

这是完整的功能:

stackbox <- function(x,y,n,size,maxheight=5,...){
  stackheight = seq(0,n,by=maxheight)
  stackheight=diff(unique(c(stackheight,n)))

  for(col in 1:length(stackheight)){
    xl=rep(x+(col-1)*size,stackheight[col]) - (length(stackheight)/2)*size
    yb=y+size*((1:stackheight[col])-1) - (max(stackheight)/2)*size
    xr=xl+size
    yt=yb+size
    rect(xl,yb,xr,yt,...)
  }
}

示例:

plot(1:10)
for(i in 1:10){
 stackbox(i,i,i,3,size=.1,col="red",border="white")
}

要在地图上执行此操作,您需要sp和maptools包,以及包含数据的shapefile或其他地理空间数据源:

africa=readShapeSpatial(file.path(mapLib,"africa.shp"))
plot(africa,border="gray")
coords=coordinates(africa)
for(i in 1:nrow(africa)){
  if(cases[i]>0){
    stackbox(coords[i,1],coords[i,2],africa$cases[i],1,border="#606060",col="#0083FE")
  }
}

Map using stacked boxes

我选择的颜色看起来有点像你原来的颜色。请注意,这些框是在绘图坐标中,所以我必须将它们设为0.1度。您可能希望将地图转换为欧几里德投影(使用包中的spTransform:gdal),然后它们将在这些单位中并且正确平方。

如你原来那样做一些不错的文字标签会很棘手......

答案 1 :(得分:5)

作为替代方案,我建议使用气泡图,使用点几何图形使用ggplot2非常容易。帮助页面(http://had.co.nz/ggplot2/geom_point.html)的一个示例:

p <- ggplot(mtcars, aes(wt, mpg)) 
p + geom_point(aes(size = qsec)) 

导致:

ggplot bubble plot

气泡的大小代表测量的量。该示例不使用地理坐标,但可以轻松使用它们。 ggplot2包还支持添加空间多边形作为附加层,例如,使用geom_path。 coord_map的帮助文件显示了一些使用地图数据的示例。另请参见fortify函数将SpatialPolygons对象转换为data.frame(ggplot2需要它)。