2014-03-28 2 views
1

ggplot2에서이 지리적 매핑 문제를 해결하는 방법에 대해 생각하고 있습니다. 문제는 ggplot이 일부 주에서는 데이터를 채우지 않고 비워 두는 것입니다. 이러한 상태는 필자의 필을 기반으로하지 않으므로 의미가 있습니다.R ggplot2 매핑 문제, 누락 된 상태 정보 자동화

Map

는 내가 아마도 그 상태에 대한 행을 추가 그냥 0으로 그들을 채울 수 알고 있지만 값이 그 상태는 시간이 지남에 따라 변경해야합니다. 이번 달에이 달에 문자 그대로 파일을 저장하고 실행해야하는 사람은 누구나 자동으로 업데이트하려고하므로이 항목을 독자적으로 업데이트하고 싶습니다.

완벽한 세계에서 값이없는 상태는 축에 "침투가 없음"으로 다르게 표시됩니다.

GGplot 코드 :

내 데이터의
map<- ggplot(penetration_levels,aes(long,lat,group=region,fill=Penetration),)+geom_polygon()+coord _equal()+scale_fill_gradient2(low="red",mid="white",high="green",midpoint=.25) 
map 
map<-map+geom_point(
data=mydata, aes(x=long, y=lat,group=1,fill=0, size=Annualized.Opportunity), 
color="gray6") + 
scale_size(name="Total Annual Opportunity-Millions",range=c(2,4)) 
map<-map+theme(plot.title = element_text(size = 12,face="bold")) 
map 

머리와

head(mydata) 
Sold.To.Customer   City State Annualized.Opportunity   location   lat  long 
21   10000110  NEW YORK NY    12.142579  NEW YORK,NY  40.71435 -74.00597 
262   10016487 FORT LAUDERDALE FL    12.087310 FORT LAUDERDALE,FL 26.12244 -80.13732 
349   11001422  ALLEN PARK MI    10.910575  ALLEN PARK,MI 42.25754 -83.21104 
19   10000096   ALTON IL    10.040067   ALTON,IL 38.89060 -90.18428 
477   11067228  BAY CITY TX    10.030829  BAY CITY,TX 28.98276 -95.96940 
230   10014909  BETHPAGE NY    9.320271  BETHPAGE,NY 40.74427 -73.48207 
head(penetration_levels) 
State region  long  lat group order subregion state  To  From Total Penetration 
17 AL alabama -87.46201 30.38968  1  1  <NA> AL 10794947 12537359 23332307 0.462661 
18 AL alabama -87.48493 30.37249  1  2  <NA> AL 10794947 12537359 23332307 0.462661 
22 AL alabama -87.52503 30.37249  1  3  <NA> AL 10794947 12537359 23332307 0.462661 
36 AL alabama -87.53076 30.33239  1  4  <NA> AL 10794947 12537359 23332307 0.462661 
37 AL alabama -87.57087 30.32665  1  5  <NA> AL 10794947 12537359 23332307 0.462661 
65 AL alabama -87.58806 30.32665  1  6  <NA> AL 10794947 12537359 23332307 0.462661 

병합 침투 :

#geocode 
geocode<-geocode(mydata$location) 
mydata$lat<-geocode$lat 
mydata$long<-geocode$lon 
#create us map and graph 
states<-map_data("state") 
#merge states 
states<-merge(states,statelookup,by="region") 
penetration_levels<-merge(states,penetration_levels,by="State") 
penetration_levels<- penetration_levels[order(penetration_levels$order), ] 

그 다음은 D 간다 지도 플롯으로 직접

+0

가'penetration_levels'를 생성 한 코드를보기 .내 생각 엔이 데이터 프레임에는 "침투가없는"상태의 폴리곤이 없으므로 아무 것도 플롯되지 않습니다. – jlhoward

+0

전체 코드가 100k 라인을 넘었으므로이 코드를 많이 게시하고 싶지는 않습니다. 당신은 정확합니다, 그 주에 대한 정보가 없습니다. 내 문제는이 코드를 인계받는 사람이 누락 된 상태에 대한 데이터를 수동으로 입력해야한다는 것입니다. – NJ13

+0

아마도 모양 파일 인'fortify (...)'로 시작한 다음 데이터 세트와 병합하여 '침투'열. 병합 직전과 직후에 코드를 게시하십시오. – jlhoward

답변

2

일반적으로 choropleth 맵에는 맵 데이터 병합이 필요합니다 OP의 경우에는 다음과 같이 수행됩니다 :

states <- map_data("state") 
states <- merge(states,statelookup,by="region") 
penetration_levels <- merge(states,penetration_levels,by="State") 

문제는 penetration_levels는 누락 States있는 경우,이 행 병합에서 제외 될 것이다 (데이터베이스 용어에서, 이것은 이너 가입이다). 따라서지도를 렌더링 할 때 해당 다각형이 누락됩니다. 상기 용액을 사용하는 것이다

penetration_levels <- merge(states,penetration_levels,by="State",all.x=T) 

이 (이하 "X"인수) 제 인수의 모든 행을 반환 번째 인수 상태를 일치으로부터 데이터 병합 (a 가입 왼쪽). 누락 된 값은 NA으로 설정됩니다.

NA 값 폴리곤의 채우기 색 (상태가) grey50에 기본적으로 설정되어 있지만, 플롯 정의에 다음 호출을 추가하여 변경할 수 있습니다

scale_fill_gradient(na.value="red") 
0

누락 된 상태에 대한 검사를 추가하고 데이터 프레임에 행을 추가 할 수 있습니까? 간단한 예 : 당신은 당신의 플로팅 코드를 실행하기 전에이 같은 검사를 할 수

# Create a generic data frame with zeros for penetration 
zeros.data = data.frame(State=as.character(state.abb), penetration=0) 

# Create a simplified analogue of your data 
penetration_levels = data.frame(State=as.character(state.abb[1:30]), 
           penetration=runif(30,0.1,1)) 

# Get values for missing states 
missing.states = setdiff(state.abb, unique(penetration_levels$State)) 

# Get required data for missing states. 
penetration_levels = rbind(penetration_levels, 
          zeros.data[zeros.data$State %in% missing.states,]) 

자동으로 누락 된 모든 상태에 대해 0 침투하여 데이터 프레임을 작성합니다 (물론 당신의 "zeros.data"데이터 프레임은 것 NAs로 채우거나 다른 플로팅에 필요한 데이터로 다른 열을 포함해야합니다.