R ggplot2映射问题,自动丢失状态信息

时间:2014-03-28 16:09:52

标签: r ggplot2 mapping geocoding

我在ggplot2中考虑解决这个地理映射问题时遇到了问题。问题是ggplot没有填写某些州的数据并将其留空。这是有道理的,因为这些州根据我的填充没有任何价值。

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), ]

然后直接进入地图

2 个答案:

答案 0 :(得分:2)

因此,这是一个常见问题。通常,等值区域映射需要某种地图数据与包含用于设置多边形填充颜色的信息的数据集的合并。在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)

返回第一个参数的所有行(&#34; x&#34;参数),与第二个参数中匹配状态的任何数据合并(左连接)。缺失值设置为NA

具有NA值的多边形(状态)的填充颜色默认设置为grey50,但可以通过将以下调用添加到绘图定义来更改:

scale_fill_gradient(na.value="red")

答案 1 :(得分: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,])

在运行绘图代码之前,您可以执行此类检查,以自动填充所有缺失状态的零渗透数据框(当然,您的“zeros.data”数据框必须包含您的其他列原始数据框,填充了NA或绘制所需的任何数据。