如何在ggvis中将数值映射到地图的fill属性?

时间:2016-03-19 20:52:32

标签: r ggplot2 ggvis

我使用以下代码在ggvis中绘制地图

首先,我使用坐标

下载json文件
us <- readOGR("http://eric.clst.org/wupl/Stuff/gz_2010_us_040_00_20m.json", "OGRGeoJSON")

然后我加强了数据集

map <- ggplot2::fortify(us)

我创建了一个我希望在地图中表示的值的数据集,从0到1标准化:

value <- data_frame(stateName=us$NAME, value=seq(1:52)/52)

最后,我(成功地)绘制了我的地图:

tbl_df(map)%>%
  filter(long>-130 & long<0) %>% 
  filter(lat>20) %>% 
  ggvis(~long, ~lat) %>%
  group_by(group, id) %>%
  layer_paths(strokeOpacity:=0.5, stroke:="#7f7f7f", fill:="#cc0000") %>%
  scale_numeric("y", domain=c(24,50)) %>% 
  scale_numeric("x", domain=c(-126,-72)) %>% 
  hide_legend("fill") %>%
  hide_axis("x") %>% 
  hide_axis("y") %>%
  set_options(width=400, height=600, keep_aspect=TRUE)

但是,因为对我来说所有过程都有点黑,所以我不知道如何有效地将数据集value中的值映射到ggvis映射。我想在fill属性上使用颜色渐变,但即使使用透明度也可以。

我想我应该告诉fortify()保留us$NAME,但是如何?

1 个答案:

答案 0 :(得分:0)

你在寻找类似的东西:

us@data$id = rownames(us@data)
us_class = fortify(us, region="id")
us.df = join(us_class, us@data, by="id")
value <- data_frame(NAME=us$NAME, value=seq(1:52)/52)
us.df <- join(us.df, value)

tbl_df(us.df)%>%
  filter(long>-130 & long<0) %>% 
  filter(lat>20) %>% 
  ggvis(~long, ~lat) %>%
  group_by(group, id) %>%
  layer_paths(strokeOpacity:=0.5, stroke:="#7f7f7f", fill:="#cc0000") %>%
  scale_numeric("y", domain=c(24,50)) %>% 
  scale_numeric("x", domain=c(-126,-72)) %>% 
  hide_legend("fill") %>%
  hide_axis("x") %>% 
  hide_axis("y") %>%
  set_options(width=400, height=600, keep_aspect=TRUE) %>%
  layer_paths(fill= ~value)

enter image description here