2017-06-29 22 views
1

我正嘗試在ggplot2中使用facet_wrap將不同狀態映射到多面情節的每個刻面。我的代碼在這裏列出,其中'dataset'是一個數據框,其中包含一個名爲'state'的變量,其中包含我想由facet映射的不同狀態的名稱。使用刻麪包裝映射R中的不同狀態

library(maps) 
library(ggplot2) 

states <- c('Oklahoma','Arizona','Washington','North  
Dakota','Michigan','Florida') 

map <- ggplot(data=datatest) + geom_polygon(data=map_data 
('state',region=datatest$state),aes 
(x=long,y=lat,group=group),colour='black',fill='white') + 
facet_wrap(~state,ncol=3) 

我無法讓每個方面都成爲不同狀態的地圖。相反,每個方面都是整個美國的地圖,其中列出了六個列出的州。如果有人知道如何讓這個工作在每個方面都是不同的狀態,我將不勝感激。我很確定它與調用map_data時定義的「區域」有關,但我嘗試過的任何操作都沒有成功。這可能無法完成,但我想我會看看有沒有人有想法。謝謝!

+0

你的代碼是不可複製的,因爲'datatest'丟失。請提供一些測試數據。 –

+0

檢查datatest $ state是否是因子變量,否則將其轉換爲因子變量並查看它是否有效。 –

回答

3

state不存在從map_data返回。在那裏,你正在尋找的列被稱爲region。此外,至少在您的示例中,從datatest數據中沒有繪製數據。所以,你可以省略它。

此代碼應該工作。請注意,我添加了scales = "free",因爲我假設您希望每個州都填充相應的方面。

ggplot(map_data('state',region=states) 
     , aes(x=long,y=lat,group=group)) + 
    geom_polygon(colour='black',fill='white') + 
    facet_wrap(~region 
      , scales = "free" 
      , ncol=3) 

給出enter image description here

注意,縱橫比將是關閉使用facet_wrap因爲小面不能處理coord_map控件。爲了使情節更好,我建議分別製作每張狀態圖,然後使用cowplot中的plot_grid將它們拼接在一起。需要注意的是cowplot加載默認的主題,所以你會想要麼重新設置您的默認(與theme_set)或明確設置一個主題爲圖(如我在這裏做的):

sepStates <- 
    lapply(states, function(thisState){ 
    ggplot(map_data('state',region=thisState) 
      , aes(x=long,y=lat,group=group)) + 
     geom_polygon(colour='black',fill='white') + 
     facet_wrap(~region) + 
     coord_map() + 
     theme_void() 
    }) 


library(cowplot) 
plot_grid(plotlist = sepStates) 

enter image description here

如果你想包含來自其他來源的數據,你需要確保它是兼容的。尤其是,您需要確保您想要基於的分欄在兩者中都被稱爲相同的事物。

讓我們想象一下,你有你想要添加的情節如下數據:它看起來像這樣

datatest <- 
structure(list(zip = c("85246", "85118", "85340", "34958", "33022", 
"32716", "49815", "48069", "48551", "58076", "58213", "58524", 
"73185", "74073", "73148", "98668", "98271", "98290"), city = c("Chandler", 
"Gold Canyon", "Litchfield Park", "Jensen Beach", "Hollywood", 
"Altamonte Springs", "Channing", "Pleasant Ridge", "Flint", "Wahpeton", 
"Ardoch", "Braddock", "Oklahoma City", "Sperry", "Oklahoma City", 
"Vancouver", "Marysville", "Snohomish"), state = c("AZ", "AZ", 
"AZ", "FL", "FL", "FL", "MI", "MI", "MI", "ND", "ND", "ND", "OK", 
"OK", "OK", "WA", "WA", "WA"), latitude = c(33.276539, 33.34, 
33.50835, 27.242402, 26.013368, 28.744752, 46.186913, 42.472235, 
42.978995, 46.271839, 48.204374, 46.596608, 35.551409, 36.306323, 
35.551409, 45.801586, 48.093129, 47.930902), longitude = c(-112.18717, 
-111.42, -112.40523, -80.224613, -80.144217, -81.22328, -88.04546, 
-83.14051, -83.713124, -96.608142, -97.30774, -100.09497, -97.407537, 
-96.02081, -97.407537, -122.520347, -122.21614, -122.03976)), .Names = c("zip", 
"city", "state", "latitude", "longitude"), row.names = c(NA, 
-18L), class = c("tbl_df", "tbl", "data.frame")) 

 zip    city state latitude longitude 
    <chr>    <chr> <chr> <dbl>  <dbl> 
1 85246   Chandler AZ 33.27654 -112.18717 
2 85118  Gold Canyon AZ 33.34000 -111.42000 
3 85340 Litchfield Park AZ 33.50835 -112.40523 
4 34958  Jensen Beach FL 27.24240 -80.22461 
5 33022   Hollywood FL 26.01337 -80.14422 
6 32716 Altamonte Springs FL 28.74475 -81.22328 
7 49815   Channing MI 46.18691 -88.04546 
8 48069 Pleasant Ridge MI 42.47223 -83.14051 
9 48551    Flint MI 42.97899 -83.71312 
10 58076   Wahpeton ND 46.27184 -96.60814 
11 58213   Ardoch ND 48.20437 -97.30774 
12 58524   Braddock ND 46.59661 -100.09497 
13 73185  Oklahoma City OK 35.55141 -97.40754 
14 74073   Sperry OK 36.30632 -96.02081 
15 73148  Oklahoma City OK 35.55141 -97.40754 
16 98668   Vancouver WA 45.80159 -122.52035 
17 98271  Marysville WA 48.09313 -122.21614 
18 98290   Snohomish WA 47.93090 -122.03976 

如果你想刻面的狀態,你需要使其成爲與地圖數據中相同的格式(即全名和小寫),並將該列稱爲同一事物(region而不是狀態)。另外,如果你使列名完全相同,這也是最簡單的。在這裏,我將列正在從map_data繪製的三個賽並添加region列,將允許磨製:

stateList <- 
    setNames(tolower(state.name), state.abb) 

datatest$lat <- datatest$latitude 
datatest$long <- datatest$longitude 
datatest$group <- NA 
datatest$region <- stateList[datatest$state] 

現在,你可以在geom_point()行添加到情節,它會面正確:

ggplot(map_data('state',region=states) 
     , aes(x=long,y=lat,group=group)) + 
    geom_polygon(colour='black',fill='white') + 
    geom_point(data = datatest) + 
    facet_wrap(~region 
      , scales = "free" 
      , ncol=3) 

給人

enter image description here

或者,您可以將其添加到cowplot方法(請注意,我現在只是在標題中跳過這一切)。

sepStates <- 
    lapply(states, function(thisState){ 
    ggplot(map_data('state',region=thisState) 
      , aes(x=long,y=lat,group=group)) + 
     geom_polygon(colour='black',fill='white') + 
     geom_point(data = datatest[datatest$region == tolower(thisState), ]) + 
     ggtitle(thisState) + 
     coord_map() + 
     theme_void() + 
     theme(plot.title = element_text(hjust = 0.5)) 
    }) 

plot_grid(plotlist = sepStates) 

enter image description here

+0

謝謝 - 這個作品很棒。我需要從天氣數據中添加點到地塊,但是當我這樣做時,地圖會再次回到舊的方式。我如何給這些情節添加點,並將它們保持在它們所處的美好的多面格式中? – user8229029

+1

這就是爲什麼你需要提供可重複的數據和解決你的問題所需的所有部分。我將一些數據(來自'zipcode'包)作爲例子,並展示瞭如何修改它以完成你所要求的內容。 –

+0

@ user8229029 - 迴應您現在刪除的評論:https://stackoverflow.com/help/someone-answers –