2017-06-29 4 views
1

Ich versuche facet_wrap in ggplot2 zu verwenden, um einen unterschiedlichen Zustand in jede Facette eines facettenreichen Plots zu mappen. Mein Code ist hier aufgelistet, wobei "Dataset" ein Datenrahmen ist, der eine Variable mit dem Namen "state" enthält, die die Namen der verschiedenen Zustände enthält, die durch Facetten zugeordnet werden sollen.Mapping verschiedener Zustände in R mit Facettenumbruch

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) 

Ich bin nicht in der Lage, jede Facette zu einer Karte eines anderen Staates zu bekommen. Stattdessen ist jede Facette eine Karte der gesamten Vereinigten Staaten mit den sechs aufgelisteten Staaten, die darauf erscheinen. Wenn jemand einen Weg kennt, dies zum Funktionieren zu bringen, wo jede Facette ein anderer Staat ist, würde ich es sehr schätzen. Ich bin mir ziemlich sicher, dass es damit zu tun hat, wie die 'Region' im Aufruf von map_data definiert ist, aber nichts, was ich versucht habe, funktioniert. Es ist möglich, dass dies nicht möglich ist, aber ich dachte, ich würde sehen, ob jemand eine Idee hat. Vielen Dank!

+0

Ihr Code nicht reproduzierbar ist, da 'datatest' fehlt. Bitte geben Sie einige Testdaten an. –

+0

Überprüfen Sie, ob das Datatest $ state eine Faktorvariable ist, andernfalls geben Sie es in eine Faktorvariable um und sehen Sie, ob es funktioniert. –

Antwort

3

Die Spalte state ist in der Rückkehr von map_data nicht vorhanden. Dort heißt die Spalte, nach der Sie suchen, region. Außerdem werden, zumindest in Ihrem Beispiel, keine Daten aus den Daten datatest geplottet. Also, Sie können es weglassen.

Dieser Code sollte funktionieren. Beachten Sie, dass ich scales = "free" hinzugefügt habe, da ich davon ausgehe, dass jeder Staat seine entsprechende Facette füllen soll.

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) 

Gibt enter image description here

Beachten Sie, dass die Seitenverhältnisse aus mit facet_wrap sein werden, da die Facetten der coord_map Kontrollen nicht umgehen kann. Um die Handlung besser zu machen, würde ich vorschlagen, jede Zustandskarte separat zu machen und dann plot_grid von cowplot zu verwenden, um sie zusammenzunähen. Beachten Sie, dass cowplot lädt ein Standard Thema, so dass Sie wollen, werden entweder auf dem Standard zurückgesetzt (mit theme_set) oder explizit ein Thema für die Plots setzen (wie ich hier zu tun):

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) 

gibt enter image description here

Wenn Wenn Sie Daten aus einer anderen Quelle einbeziehen möchten, müssen Sie sicherstellen, dass sie kompatibel ist. Insbesondere müssen Sie sicherstellen, dass die Spalte, die Sie facettieren möchten, in beiden Fällen dasselbe heißt.

wir uns vor, Sie die folgenden Daten, die Sie auf dem Grundstück hinzufügen möchten:

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

, die wie folgt aussieht:

 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 

Wenn Sie auf den Staat Facette wollen, müssen Sie Um es in das gleiche Format (dh, voller Name und Kleinbuchstaben) wie in den Kartendaten zu machen und rufen Sie die Spalte die gleiche Sache (region anstelle des Staates). Außerdem ist es am einfachsten, wenn Sie die Spaltennamen auch gleich machen.Hier habe ich Spalten am Hinzufügen der drei übereinstimmen, die von der map_data und das Hinzufügen einer region Säule aufgetragen werden, die die Facettierung ermöglichen:

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

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

Jetzt können Sie eine geom_point() Linie auf dem Grundstück hinzuzufügen, und es wird richtig Facette:

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) 

Gibt

enter image description here

Oder Sie können es zum cowplot Ansatz hinzufügen (beachten Sie, dass ich gerade title jetzt und überspringen die Facettierung).

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) 

gibt

enter image description here

+0

Danke - das funktioniert super. Ich muss den Plots Punkte aus Wetterdaten hinzufügen, aber wenn ich das tue, werden die Karten wieder auf den alten Weg zurückgesetzt. Wie füge ich Punkte zu diesen Plots hinzu und behalte sie in dem schönen facettierten Format, in dem sie sich befinden? – user8229029

+1

Aus diesem Grund müssen Sie reproduzierbare Daten und alle erforderlichen Teile angeben, um Ihre Frage zu beantworten. Ich habe einige Daten (aus dem Paket 'zipcode') genommen, um sie als Beispiel zu verwenden, und habe gezeigt, wie ich sie modifizieren kann, um das zu tun, wonach Sie fragen. –

+0

@ user8229029 - als Antwort auf Ihren jetzt gelöschten Kommentar: https://stackoverflow.com/help/someone-answers –

Verwandte Themen