【问题标题】:How to Plot a US state in R?如何在 R 中绘制美国州?
【发布时间】:2014-04-21 22:06:33
【问题描述】:

我可以在整个美国地图中绘制特定州的数据。但我只想用数据绘制州地图(俄克拉荷马州)。

如何在 R 中做到这一点?

ggplot() + 
 geom_polygon( data=all_states, aes(x=long, y=lat,group=group),colour="black", fill="white" )+
 geom_point(data=stations,aes(x=long,y=lat),,colour="red",)+
 ggtitle("Distribution of Flash Flood Events in CONUS")+
 xlab('Longitude')+
 ylab('Latitude')



dput(stations)
structure(list(coop = c(340017L, 340179L, 340256L, 340292L, 340548L, 
340593L, 340908L, 341243L, 341504L, 341724L, 341828L, 342678L, 
342912L, 342944L, 343497L, 343628L, 343821L, 343871L, 344055L, 
344204L, 344235L, 344298L, 344573L, 344766L, 344861L, 345063L, 
345509L, 345779L, 345855L, 346130L, 346139L, 346278L, 346629L, 
346638L, 346670L, 346926L, 346935L, 347012L, 347254L, 348501L, 
348677L, 349395L, 349422L, 349445L), lat = c(34.7864, 34.5903, 
34.2208, 34.1714, 36.7683, 36.8125, 36.7236, 36.8003, 35.1756, 
36.7747, 36.3225, 34.0003, 36.4194, 35.2164, 35.6267, 36.5914, 
35.8161, 35.585, 36.0942, 34.9894, 35.0567, 36.8589, 36.7222, 
36.9031, 35.8583, 34.6097, 34.8911, 35.505, 36.8833, 35.7781, 
36.2283, 36.8914, 36.1217, 35.4253, 35.6239, 34.7253, 36.6692, 
36.2886, 35.0539, 36.1175, 35.9369, 34.1747, 35.52, 35.4814), 
    long = c(-96.685, -99.3344, -95.615, -97.1294, -96.0261, 
    -100.5308, -102.4806, -99.6403, -98.5794, -98.3583, -95.5808, 
    -96.3686, -97.8747, -99.8628, -98.3225, -101.6181, -97.395, 
    -99.3953, -97.835, -99.0525, -96.3861, -101.2172, -97.7903, 
    -102.965, -97.9294, -98.4572, -99.5017, -96.9767, -94.8833, 
    -95.3339, -99.17, -97.0586, -98.315, -96.3033, -96.025, -97.2814, 
    -96.3472, -97.2897, -94.6264, -97.095, -94.9644, -97.9964, 
    -98.6986, -95.2039), elev = c(309.4, 420.6, 143.3, 268.2, 
    217.9, 751.3, 1259.7, 588.3, 451.4, 359.7, 179.2, 182.9, 
    379.5, 627.9, 487.7, 1008.9, 338.3, 554.7, 357.8, 474.3, 
    260.6, 912.9, 318.5, 1325.9, 320, 350.5, 486.2, 281.9, 245.4, 
    157.9, 576.1, 347.5, 370.3, 285, 197.2, 286.5, 254.5, 312.4, 
    134.1, 272.8, 259.1, 278, 493.2, 167.6), state = structure(c(1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = "OK", class = "factor"), 
    name = structure(1:44, .Label = c("ADA", "ALTUS IRIG RSCH STN", 
    "ANTLERS", "ARDMORE", "BARTLESVILLE MUNI AP", "BEAVER", "BOISE CITY 2 E", 
    "BUFFALO 2 SSW", "CARNEGIE 5 NE", "CHEROKEE", "CLAREMORE 2 ENE", 
    "DURANT", "ENID", "ERICK", "GEARY", "GOODWELL RSCH STN", 
    "GUTHRIE 5S", "HAMMON 3 SSW", "HENNESSEY 4 ESE", "HOBART MUNI AP", 
    "HOLDENVILLE 2SSE", "HOOKER", "JEFFERSON", "KENTON", "KINGFISHER", 
    "LAWTON", "MANGUM", "MEEKER 5 W", "MIAMI", "MUSKOGEE", "MUTUAL", 
    "NEWKIRK 1NW", "OKEENE", "OKEMAH", "OKMULGEE WTR WKS", "PAULS VALLEY 4 WSW", 
    "PAWHUSKA", "PERRY", "POTEAU WTR WKS", "STILLWATER 2 W", 
    "TAHLEQUAH", "WAURIKA", "WEATHERFORD", "WEBBERS FALLS 5 WSW"
    ), class = "factor")), .Names = c("coop", "lat", "long", 
"elev", "state", "name"), class = "data.frame", row.names = c(NA, 
-44L))

【问题讨论】:

    标签: r


    【解决方案1】:

    编辑。根据评论更新

    由于 Geekuna 使用的是ggplot,所以我给出了ggplot 的答案

     m = map_data('state', region = 'Oklahoma')
    
     ggplot() + 
     geom_polygon( data=m, aes(x=long, y=lat,group=group),colour="black", fill="white" )+
     geom_point(data=stations,aes(x=long,y=lat),,colour="red",)+
     geom_text(data=stations, aes(x=long, y=lat,label=name), size=2, hjust=-0.1) +
     ggtitle("Distribution of Flash Flood Events in CONUS")+
     xlab('Longitude')+
     ylab('Latitude')+
     coord_fixed()
    

    【讨论】:

    • 你的答案是对这个问题最干净和最直接的答案,但你应该始终在 ggplot 中将coord_fixed() 与地图一起使用,以避免出现失真。
    • 谢谢。你能帮我做一件小事吗?我想将车站的名称添加到地图中,并在“名称”中给出。我该怎么做?谢谢。
    【解决方案2】:

    您可以使用maps 包。地图的外观有很多简单的选项。这里有两个非常基本的。就这个问题而言,maps 包与ggplot2 没有太大区别,除了在maps 中编写代码更容易。

    > library(maps)
    > par(mfrow = c(1, 2))
    > map('state', region = 'Oklahoma')
    > map('county', region = 'Oklahoma')
    

    添加: 由于您添加了数据,因此这是一个夸张的图,假设数据称为dat

    > map('county', region = 'Oklahoma')
    > with(dat, points(lat ~ long, pch = 19, col = 'red'))
    

    【讨论】:

    • 如何修改现有代码以使用它?谢谢!
    • 请发布您的一些数据(使用dput(data)),我可以给您看。
    • 谢谢。我已经添加了数据。你能通过修改我的代码来帮助我在 ggplot 中做到这一点吗?谢谢。
    • 没有真正的区别。我的意思是,这是一张地图。 :)
    【解决方案3】:

    如果您还想显示州的县,您可以使用ggcounty 包。

    library(devtools)
    install_github(repo="hrbrmstr/ggcounty")
    library(ggcounty)
    
    ok <- ggcounty("Oklahoma")
    
    ok$gg
    

    在 OP 输入后编辑

    ok$gg +
      geom_point(data=stations,aes(x=long,y=lat),,colour="red",size=5)+
      ggtitle("Distribution of Flash Flood Events in CONUS")+
      xlab('Longitude')+
      ylab('Latitude')
    

    输出如下:

    您可能想要删除 xlab 和 ylab。我希望它对你有所帮助。

    【讨论】:

    • 你能帮我把它和ggplot代码整合起来吗?谢谢!图书馆看起来很棒。
    • 您好,我收到此错误: install.packages 中的警告:包“ggcounty”不可用(对于 R 版本 3.0.2)
    • 你需要安装包devtools。然后使用以下命令install_github(repo="hrbrmstr/ggcounty")。您可以使用install.packages("devtools") 安装开发工具。我更新了答案以包含您的数据。
    • 它不起作用。您应该将其作为 R 存储库发布。不过看起来棒极了。 install.packages 中的警告:包“install_github”不可用(对于 R 版本 3.0.2)
    • 你好像没有加载devtools。请尝试以下操作:install.packages("devtools"); library(devtools); install_github("hrbrmstr/ggcounty")
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-06
    • 2016-03-21
    • 2014-07-24
    • 2021-08-22
    • 1970-01-01
    • 2013-12-24
    • 2020-07-31
    相关资源
    最近更新 更多