你如何根据一些价值创建美国国家热图?

时间:2014-06-26 23:24:30

标签: r ggplot2

我有一个名为x:

的数据框
dput(tail(x,20))
structure(list(State = structure(c(22L, 58L, 2L, 33L, 75L, 16L, 
26L, 17L, 14L, 76L, 19L, 7L, 1L, 41L, 67L, 31L, 35L, 21L, 20L, 
69L), .Label = c("Texas", "New York", "Florida", "Illinois", 
"Georgia", "Kentucky", "Tennessee", "California", "Alabama", 
"Indiana", "Bayern", "Michigan", "Arizona", "Pennsylvania", "Hawaii", 
"Ohio", "Oregon", "Nairobi Area", "South Carolina", "Wisconsin", 
"West Virginia", "New Jersey", "Maryland", "Colorado", "Missouri", 
"Oklahoma", "District of Columbia", "Minnesota", "Massachusetts", 
"Louisiana", "Virginia", "Connecticut", "North Carolina", "Ile-de-France", 
"Washington", "Sichuan", "Arkansas", "Nevada", "Idaho", "Al Balqa'", 
"Utah", "Maine", "Kansas", "Iowa", "Mississippi", "Ontario", 
"Montana", "New Hampshire", "Nebraska", "Cordoba", "London, City of", 
"Cavite", "Armed Forces Europe, Middle East, & Canada", "Ar Riyad", 
"Quintana Roo", "Zurich", "Lombardia", "New Mexico", "Alberta", 
"Ho Chi Minh", "Cortes", "Delaware", "Distrito Federal", "Ad Dawhah", 
"Distrito Nacional", "Arbil", "Vermont", "Toscana", "Wyoming", 
"Andhra Pradesh", "Puebla", "Marrakech-Tensift-Al Haouz", "Delhi", 
"Beijing", "North Dakota", "Rhode Island"), class = "factor"), 
    Count = c(152, 3, 926, 20, 1, 167, 26, 25, 51, 1, 6, 13, 
    633, 14, 1, 60, 47, 14, 46, 1), Latitude = c(40.298904, 34.840514, 
    42.165724, 35.630066, 47.52891, 40.388781, 35.565342, 44.57202, 
    40.590752, 41.680893, 33.856893, 35.747845, 31.054487, 40.150032, 
    44.045877, 37.769335, 47.400902, 38.491226, 44.268544, 42.755965
    ), Longitude = c(-74.521013, -106.248483, -74.948052, -79.806417, 
    -99.784012, -82.764916, -96.928919, -122.070939, -77.209755, 
    -71.511782, -80.945011, -86.692343, -97.56346, -111.862433, 
    -72.710689, -78.169968, -121.490493, -80.954452, -89.616509, 
    -107.302488)), .Names = c("State", "Count", "Latitude", "Longitude"
), row.names = 30:49, class = "data.frame")

我希望能够根据State和Count创建地图热图。我使用qplot如下,但没有地图出现:

qplot(Latitude, Longitude, data=x, group=State , fill= Count, geom="polygon")

如果我遗漏了什么想法?

1 个答案:

答案 0 :(得分:6)

这样的东西?

x$region <- tolower(x$State)
library(ggplot2)
library(maps)
states <- map_data("state")
map.df <- merge(states,x, by="region", all.x=T)
map.df <- map.df[order(map.df$order),]
ggplot(map.df, aes(x=long,y=lat,group=group))+
  geom_polygon(aes(fill=Count))+
  geom_path()+ 
  scale_fill_gradientn(colours=rev(heat.colors(10)),na.value="grey90")+
  coord_map()

您的数据集没有任何地图数据;它似乎有各种状态的中心以及某些东西的数量。首先,您需要地图数据。一个来源是maps包。 map_data(...)函数将适当的地图数据(例如,每个状态的边界多边形的坐标)提取到适合在states中使用的数据帧ggplot中。 states包含longlatgroupregion列。 region具有州名(不幸的是,小写)。

但这还不够:我们需要将数据框x中的计数数据与相应的状态相关联。我们使用merge(...)执行此操作(请阅读文档)。一个问题是map_data(...)返回的状态名称是小写的,而您的州名称是大写的。因此,我们在您的数据框中添加一列region,它只是小写的州名。然后:

map.df <- merge(states,x, by="region", all.x=T)

使用公共region列合并两个数据框。包括all.x=T确保我们拥有所有状态的数据,即使x中没有该行的状态。很遗憾merge(...)会在by=...列上对结果进行排序,因此我们必须重新建立原始订单:

map.df <- map.df[order(map.df$order),]

现在我们可以绘制地图了。在对ggplot(...)的调用中,我们将默认数据集设置为map.df,将x和y美学(水平和垂直轴)设置为longlat。设置group美学确保具有多个多边形(例如,岛)的状态可以正确渲染。 geom_polygon根据Counts中的map.df列呈现填充的多边形。 geom_path()绘制州界限。 scale_fill_gradientn(...)将调色板设置为内置heat.colors调色板(红色到黄色),而rev(...)则调整顺序(因此我们得到黄色到红色)。 na.value=...将缺失值的颜色设置为非常浅的灰色。

编辑对OP评论的回应

在地图上标注多边形总是很棘手,因为一些多边形(在您的情况下为状态)很小并且靠得很近,而有些则很大。这就是为什么用于传递定量信息(等值线图或制图)的地图几乎从不这样做的原因(这里是an example that does,但请注意他们在东北部所做的事情)。所以底线,我建议你关闭州名。

话虽如此,添加它们相当简单,虽然不是特别漂亮。

ggplot(map.df, aes(x=long,y=lat,group=group))+
  geom_polygon(aes(fill=Count))+
  geom_path()+ 
  geom_text(data=x, aes(x=Longitude,y=Latitude, group=NA, label=State), 
            size=2.5, vjust=0.5, hjust=0.5)+
  scale_fill_gradientn(colours=rev(heat.colors(10)),na.value="grey90")+
  coord_map()

使用geom_text(...)添加带有州名的文本图层。对geom_text(...)的调用会使用您的数据框x,(data=x)以及其中的纬度和经度值作为标签的位置,以及State列文本本身。就像我说的,不漂亮......