在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.48207head(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), ]然后直接进入地图绘制。
发布于 2014-03-28 23:35:36
所以这是一个常见的问题。通常,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“参数)的所有行,并与第二个参数(左联接)中的匹配状态中的任何数据合并。缺失值设置为NA。
NA值的多边形(状态)的填充颜色默认设置为grey50,但可以通过向绘图定义添加以下调用来更改:
scale_fill_gradient(na.value="red")发布于 2014-03-28 17:16:12
您不能为缺少的状态添加一个检查,并为它们添加行(插入值为零)到数据帧中吗?一个简单的例子:
# 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“数据框架必须包括原始数据框架中的其他列,其中填充了NAs或绘图所需的任何数据。
https://stackoverflow.com/questions/22717892
复制相似问题