R 地图ggplot2“按状态填充”缺少地图上的某些区域
我正在使用R 地图ggplot2“按状态填充”缺少地图上的某些区域,r,plot,ggplot2,maps,R,Plot,Ggplot2,Maps,我正在使用maps和ggplot2可视化每个州不同年份的特定犯罪数量。我正在使用的数据集是由FBI制作的,可以从他们的网站下载,也可以从他们的网站下载(如果你不想下载数据集,我不怪你,但它太大了,无法复制和粘贴到这个问题中,包括一小部分数据集也没有帮助,因为没有足够的信息来重新创建图表) 这个问题看起来容易,描述起来难 正如你所看到的,加利福尼亚州和其他几个州一样,缺少了一大块土地。以下是生成此绘图的代码: # load libraries library(maps) library(ggpl
maps
和ggplot2
可视化每个州不同年份的特定犯罪数量。我正在使用的数据集是由FBI制作的,可以从他们的网站下载,也可以从他们的网站下载(如果你不想下载数据集,我不怪你,但它太大了,无法复制和粘贴到这个问题中,包括一小部分数据集也没有帮助,因为没有足够的信息来重新创建图表)
这个问题看起来容易,描述起来难
正如你所看到的,加利福尼亚州和其他几个州一样,缺少了一大块土地。以下是生成此绘图的代码:
# load libraries
library(maps)
library(ggplot2)
# load data
fbi <- read.csv("http://www.hofroe.net/stat579/crimes-2012.csv")
fbi <- subset(fbi, state != "United States")
states <- map_data("state")
# merge data sets by region
fbi$region <- tolower(fbi$state)
fbimap <- merge(fbi, states, by="region")
# plot robbery numbers by state for year 2012
fbimap12 <- subset(fbimap, Year == 2012)
qplot(long, lat, geom="polygon", data=fbimap12,
facets=~Year, fill=Robbery, group=group)
这就是fbi
数据的样子:
long lat group order region subregion
1 -87.46201 30.38968 1 1 alabama <NA>
2 -87.48493 30.37249 1 2 alabama <NA>
3 -87.52503 30.37249 1 3 alabama <NA>
4 -87.53076 30.33239 1 4 alabama <NA>
5 -87.57087 30.32665 1 5 alabama <NA>
6 -87.58806 30.32665 1 6 alabama <NA>
Year Population Violent Property Murder Forcible.Rape Robbery
1 1960 3266740 6097 33823 406 281 898
2 1961 3302000 5564 32541 427 252 630
3 1962 3358000 5283 35829 316 218 754
4 1963 3347000 6115 38521 340 192 828
5 1964 3407000 7260 46290 316 397 992
6 1965 3462000 6916 48215 395 367 992
Aggravated.Assault Burglary Larceny.Theft Vehicle.Theft abbr state region
1 4512 11626 19344 2853 AL Alabama alabama
2 4255 11205 18801 2535 AL Alabama alabama
3 3995 11722 21306 2801 AL Alabama alabama
4 4755 12614 22874 3033 AL Alabama alabama
5 5555 15898 26713 3679 AL Alabama alabama
6 5162 16398 28115 3702 AL Alabama alabama
然后,我沿着区域
合并了这两个集合。我试图绘制的子集是
region Year Robbery long lat group
8283 alabama 2012 5020 -87.46201 30.38968 1
8284 alabama 2012 5020 -87.48493 30.37249 1
8285 alabama 2012 5020 -87.95475 30.24644 1
8286 alabama 2012 5020 -88.00632 30.24071 1
8287 alabama 2012 5020 -88.01778 30.25217 1
8288 alabama 2012 5020 -87.52503 30.37249 1
... ... ... ...
关于如何在没有这些难看的缺失点的情况下创建此情节,您有什么想法吗?我使用了您的代码。我能告诉你的一件事是,当你使用
merge
时,发生了一些事情。我使用geom_path
绘制了州地图,并确认了原始地图数据中不存在两条奇怪的线。一、 然后,通过玩merge
和internal\u-join
进一步调查了这个案例merge
和internal\u join
在这里做同样的工作。然而,我发现了一个不同。当我使用merge
时,顺序改变了;数字顺序不对。内部连接的情况并非如此。下面你会看到一些关于加州的数据。你的方法是正确的。但是merge
不知何故对您不利。不过,我不知道为什么函数会改变顺序
library(dplyr)
### Call US map polygon
states <- map_data("state")
### Get crime data
fbi <- read.csv("http://www.hofroe.net/stat579/crimes-2012.csv")
fbi <- subset(fbi, state != "United States")
fbi$state <- tolower(fbi$state)
### Check if both files have identical state names: The answer is NO
### states$region does not have Alaska, Hawaii, and Washington D.C.
### fbi$state does not have District of Columbia.
setdiff(fbi$state, states$region)
#[1] "alaska" "hawaii" "washington d. c."
setdiff(states$region, fbi$state)
#[1] "district of columbia"
### Select data for 2012 and choose two columns (i.e., state and Robbery)
fbi2 <- fbi %>%
filter(Year == 2012) %>%
select(state, Robbery)
问题在于合并的参数顺序
fbimap <- merge(fbi, states, by="region")
fbimap+1谢谢@jazzurro,效果很好。你知道internal\u join
与merge
有什么不同吗?@epwalsh我修改了我的答案。看一看<代码>合并
和内部连接
执行相同的工作。但前者搞乱了专栏的秩序。你会在上面看到的。很有趣。。。我想internal\u join
更健壮。@epwalsh我不知道发生了什么。但是,internal\u join
为您做了正确的事情。如果您将来会遇到类似的情况,您可能希望避免merge
。
fbimap <- merge(fbi, states, by="region")
fbimap <- merge(states, fbi, by="region")