首页 文章

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

提问于
浏览
4

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

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

2 回答

  • 5

    首先编写一个名为“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")
    }
    

    要在 Map 上执行此操作,您需要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度 . 您可能希望将 Map 转换为欧几里德投影(使用包中的spTransform:gdal)然后它们将在这些单位中并且正确平方 .

    像你原来那样做一些漂亮的文字标签会很棘手......

  • 7

    作为替代方案,我建议使用气泡图,使用点几何使用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的帮助文件显示了一些使用 Map 数据的示例 . 另请参见fortify函数将SpatialPolygons对象转换为data.frame(ggplot2需要) .

相关问题