我在ggplot2中考虑解决这个地理映射问题时遇到了问题。问题是ggplot没有填写某些州的数据并将其留空。这是有道理的,因为这些州根据我的填充没有任何价值。
我知道我可以为这些状态添加行,只需用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), ]
然后直接进入地图
答案 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或绘制所需的任何数据。