我正在尝试生成美国地图,其中每个州都可以使用以下颜色之一:
EScolors <- c("#7aad42","#4a77bb","#f7931e","#d3dfbd","#787878")
我创建了一个数据框states_info,以匹配每个状态的颜色。
head(states_info)
State.Code region St_Abbr Num_Estab colors
1 1 alabama AL 13123 #f7931e
3 4 arizona AZ 18053 #f7931e
4 5 arkansas AR 9154 #4a77bb
5 6 california CA 143937 #787878
6 8 colorado CO 21033 #d3dfbd
7 9 connecticut CT 17176 #f7931e
我已经尝试了各种方法来使每种状态的颜色正确,但我的代码无效。 (顺便说一句,&#34;颜色&#34;是一个因子变量,包含特定颜色的十六进制值)
方法1:
地图(&#39;状态&#39;,填充= TRUE,COL = states_info $颜色)
我得到了一张地图,但状态的颜色不正确。这种方法可能需要匹配,但我无法弄明白。
方法2:我通过将每个州的纬度和经度与我的state_info数据帧合并来绘制地图来创建数据框
states_location <- map_data("state")
map.df <- merge(states_location,states_info, by=intersect(states_location$region, states_info$region), all=TRUE)
map.df <- map.df[order(map.df$order),]
ggplot(map.df, aes(x=long,y=lat,group=group))+
geom_polygon(aes(fill=region.x))+
geom_path()+
scale_color_hue(states_info$colors)
此方法使用自己的颜色渐变生成地图,而不是我指定的颜色。我究竟做错了什么? 谢谢。
答案 0 :(得分:2)
让ggplot2为你努力工作:
library(ggplot2)
read.table(text="State.Code region St_Abbr Num_Estab colors
1 1 alabama AL 13123 #f7931e
3 4 arizona AZ 18053 #f7931e
4 5 arkansas AR 9154 #4a77bb
5 6 california CA 143937 #787878
6 8 colorado CO 21033 #d3dfbd
7 9 connecticut CT 17176 #f7931e",
stringsAsFactors=FALSE, header=TRUE, comment.char="") -> df
usa_map <- map_data("state")
gg <- ggplot()
gg <- gg + geom_map(data=usa_map, map=usa_map,
aes(long, lat, map_id=region),
color="#2b2b2b", size=0.15, fill=NA)
gg <- gg + geom_map(data=df, map=usa_map,
aes(fill=colors, map_id=region),
color="#2b2b2b", size=0.15)
gg <- gg + scale_color_identity()
gg <- gg + coord_map("polyconic")
gg <- gg + ggthemes::theme_map()
gg
答案 1 :(得分:0)
使用基本地图包可能有点棘手。各州的秩序和命名并不标准,有几个州有不止一个地区,即纽约的曼哈顿岛。需要稍加操作才能正确标记/着色地图 在这个解决方案中,我创建了一个数据帧状态列表来保存状态名称,岛和索引。然后将其与您的数据框state_info合并,然后绘制。
#function to split strings an return a dataframe
strtodf<-function (list){
slist<-strsplit(list, ":")
x<-sapply(slist, FUN= function(x) {x[1]})
y<-sapply(slist, FUN= function(x) {x[2]})
df<-data.frame(state=x, island=y, stringsAsFactors = FALSE)
return(df)
}
#user defined coloring scheme
# Example data for to test solution
colors<- c("#7aad42","#4a77bb","#f7931e","#d3dfbd","#787878")
region<-c("washington", "new york", "virginia", "pennsylvania", "ohio")
states_info<-data.frame(region, colors)
# End of example data
#dataframe to hold state names for mapping purposes
library(maps)
maplist<-map("state", namesonly = TRUE, plot=FALSE)
statelist<-strtodf(maplist) #convert to dataframe
statelist$row<-as.numeric(rownames(statelist)) #index column
#merge the data from and resort into proper order
statelist<-merge(statelist, states_info, by.x = "state", by.y="region", sort=FALSE, all.x=TRUE)
statelist<-statelist[order(statelist$row),]
#plot the map
maplist<-map("state", fill=TRUE, col=statelist$colors)