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")