【问题标题】:Plotting contours on an irregular grid在不规则网格上绘制等高线
【发布时间】:2013-10-12 21:17:58
【问题描述】:

我在 R 中浏览了一页又一页的等高线图(包括关于 stackoverflow 的许多提示),但没有成功。这是我的等高线数据,包括添加卢旺达地图(数据由经度、纬度和雨量的 14 个值组成,分别为 x、y 和 z):

Lon Lat Rain
28.92   -2.47   83.4
29.02   -2.68   144
29.25   -1.67   134.7
29.42   -2.07   174.9
29.55   -1.58   151.5
29.57   -2.48   224.1
29.6    -1.5    254.3
29.72   -2.18   173.9
30.03   -1.95   154.8
30.05   -1.6    152.2
30.13   -1.97   126.2
30.33   -1.3    98.5
30.45   -1.81   145.5
30.5    -2.15   151.3

这是我从 stackoverflow 尝试的代码:

datr <- read.table("Apr0130precip.txt",header=TRUE,sep=",")
x <- datr$x
y <- datr$y
z <- datr$z

require(akima)

fld <- interp(x,y,z)

par(mar=c(5,5,1,1))
filled.contour(fld)

插值失败。帮助将不胜感激。

【问题讨论】:

    标签: r ggplot2 contour


    【解决方案1】:

    这里有一些使用base R 图形和ggplot 的不同可能性。生成简单的等高线图和地图顶部的图。


    插值

    library(akima)
    fld <- with(df, interp(x = Lon, y = Lat, z = Rain))
    

    base R 绘图使用filled.contour

    filled.contour(x = fld$x,
                   y = fld$y,
                   z = fld$z,
                   color.palette =
                     colorRampPalette(c("white", "blue")),
                   xlab = "Longitude",
                   ylab = "Latitude",
                   main = "Rwandan rainfall",
                   key.title = title(main = "Rain (mm)", cex.main = 1))
    


    基本ggplot 替代使用geom_tilestat_contour

    library(ggplot2)
    library(reshape2)
    
    # prepare data in long format
    df <- melt(fld$z, na.rm = TRUE)
    names(df) <- c("x", "y", "Rain")
    df$Lon <- fld$x[df$x]
    df$Lat <- fld$y[df$y]
    
    ggplot(data = df, aes(x = Lon, y = Lat, z = Rain)) +
      geom_tile(aes(fill = Rain)) +
      stat_contour() +
      ggtitle("Rwandan rainfall") +
      xlab("Longitude") +
      ylab("Latitude") +
      scale_fill_continuous(name = "Rain (mm)",
                            low = "white", high = "blue") +
      theme(plot.title = element_text(size = 25, face = "bold"),
            legend.title = element_text(size = 15),
            axis.text = element_text(size = 15),
            axis.title.x = element_text(size = 20, vjust = -0.5),
            axis.title.y = element_text(size = 20, vjust = 0.2),
            legend.text = element_text(size = 10))
    


    ggplot 在由 ggmap 创建的 Google 地图上

    # grab a map. get_map creates a raster object
    library(ggmap)
    rwanda1 <- get_map(location = c(lon = 29.75, lat = -2),
                      zoom = 9,
                      maptype = "toner",
                      source = "stamen")
    # alternative map
    # rwanda2 <- get_map(location = c(lon = 29.75, lat = -2),
    #                   zoom = 9,
    #                   maptype = "terrain")
    
    # plot the raster map
    g1 <- ggmap(rwanda1)
    g1
    
    # plot map and rain data
    # use coord_map with default mercator projection
    g1 + 
      geom_tile(data = df, aes(x = Lon, y = Lat, z = Rain, fill = Rain), alpha = 0.8) +
      stat_contour(data = df, aes(x = Lon, y = Lat, z = Rain)) +
      ggtitle("Rwandan rainfall") +
      xlab("Longitude") +
      ylab("Latitude") +
      scale_fill_continuous(name = "Rain (mm)",
                            low = "white", high = "blue") +
      theme(plot.title = element_text(size = 25, face = "bold"),
            legend.title = element_text(size = 15),
            axis.text = element_text(size = 15),
            axis.title.x = element_text(size = 20, vjust = -0.5),
            axis.title.y = element_text(size = 20, vjust = 0.2),
            legend.text = element_text(size = 10)) +
      coord_map()
    


    ggplot 在从 shapefile 创建的地图上

    # Since I don't have your map object, I do like this instead:
    # get map data from
    # http://biogeo.ucdavis.edu/data/diva/adm/RWA_adm.zip
    # unzip files to folder named "rwanda"
    
    # read shapefile with rgdal::readOGR
    # just try the first out of three shapefiles, which seemed to work.
    # 'dsn' (data source name) is the folder where the shapefile is located
    # 'layer' is the name of the shapefile without the .shp extension.
    
    library(rgdal)
    rwa <- readOGR(dsn = "rwanda", layer = "RWA_adm0")
    class(rwa)
    # [1] "SpatialPolygonsDataFrame"
    
    # convert SpatialPolygonsDataFrame object to data.frame
    rwa2 <- fortify(rwa)
    class(rwa2)
    # [1] "data.frame"
    
    # plot map and raindata  
    ggplot() + 
      geom_polygon(data = rwa2, aes(x = long, y = lat, group = group),
                   colour = "black", size = 0.5, fill = "white") +
      geom_tile(data = df, aes(x = Lon, y = Lat, z = Rain, fill = Rain), alpha = 0.8) +
      stat_contour(data = df, aes(x = Lon, y = Lat, z = Rain)) +
      ggtitle("Rwandan rainfall") +
      xlab("Longitude") +
      ylab("Latitude") +
      scale_fill_continuous(name = "Rain (mm)",
                            low = "white", high = "blue") +
      theme_bw() +
      theme(plot.title = element_text(size = 25, face = "bold"),
            legend.title = element_text(size = 15),
            axis.text = element_text(size = 15),
            axis.title.x = element_text(size = 20, vjust = -0.5),
            axis.title.y = element_text(size = 20, vjust = 0.2),
            legend.text = element_text(size = 10)) +
      coord_map()
    


    当然可以使用the nice tools for spatial data in R 以更复杂的方式对您的降雨数据进行插值和绘图。考虑我的回答是一个相当快速和简单的开始。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-20
      • 1970-01-01
      • 2011-08-02
      • 1970-01-01
      • 1970-01-01
      • 2018-08-03
      • 1970-01-01
      相关资源
      最近更新 更多