我有这个名为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")
Run Code Online (Sandbox Code Playgroud)
我希望能够基于State和Count创建地图热图.我使用qplot如下,但没有地图出现:
qplot(Latitude, Longitude, data=x, group=State , fill= Count, geom="polygon")
Run Code Online (Sandbox Code Playgroud)
如果我遗漏了什么想法?
像这样的东西?

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()
Run Code Online (Sandbox Code Playgroud)
您的数据集没有任何地图数据; 它似乎有各种状态的中心以及某些东西的数量.首先,您需要地图数据.一个来源是maps包.该map_data(...)函数将适当的地图数据(例如,每个状态的边界多边形的坐标)提取到states适合使用的数据帧中ggplot.states有列long,lat,group和region.region有州名(不幸的是,小写).
但这还不够:我们需要将数据框中的计数数据x与适当的状态相关联.我们这样做merge(...)(阅读文档).一个问题是返回的状态名称map_data(...)是小写,而您的州名称是大写的.所以我们region在你的数据框中添加一个列,它只是小写的州名.然后:
map.df <- merge(states,x, by="region", all.x=T)
Run Code Online (Sandbox Code Playgroud)
使用公共region列合并两个数据帧.包括all.x=T确保我们拥有所有州的数据,即使该州没有一行x.不幸的是merge(...)在by=...列上命令结果,所以我们必须重新建立原始顺序:
map.df <- map.df[order(map.df$order),]
Run Code Online (Sandbox Code Playgroud)
现在我们可以绘制地图了.在调用中,ggplot(...)我们将默认数据集设置为map.df和x和y美学(水平和垂直轴)为long和lat.设置group美学确保具有多个多边形(例如,岛)的状态正确渲染.geom_polygon渲染基于Counts列中填充的多边形map.df.geom_path()绘制国界.scale_fill_gradientn(...)将调色板设置为内置heat.colors调色板(红色到黄色),同时rev(...)反转顺序(因此我们得到黄色到红色).na.value=...将缺失值的颜色设置为非常浅的灰色.
编辑回应OP的评论
在地图上标注多边形总是很棘手,因为一些多边形(在您的情况下为状态)很小并且靠得很近,有些很大.这就是为什么用于传递定量信息(等值线图或制图)的地图几乎从不这样做(这里有一个例子,但注意它们在东北部的作用).所以底线,我建议你关闭州名.
话虽如此,添加它们相当简单,虽然不是特别漂亮.
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()
Run Code Online (Sandbox Code Playgroud)

这将使用添加状态名称的文本图层geom_text(...).调用geom_text(...)使用数据框,x(data=x),以及其中的纬度和经度值作为标签的位置,以及State文本本身的列.就像我说的,不漂亮......