【问题标题】:Plot colored map with continuous color legend绘制带有连续颜色图例的彩色地图
【发布时间】:2019-01-09 21:45:45
【问题描述】:

我想绘制一张世界地图,其中包含根据其价值观着色的国家/地区。我在这里找到Plot map with values for countries as color in R? 第二个答案对我来说可能是一个很好的解决方案。特别是,我想用连续的颜色图例重现第二个答案中的第二个情节(见下文),但我没有成功。在plotme函数中不知在哪里添加如下代码:

gg <- gg + scale_fill_gradient2(low = pal[1],
                                mid = pal[palSz/2],
                                high = pal[palSz],
                                midpoint = (max(ddf$value) + min(ddf$value)) / 2,
                                name="value")

我尝试用上面的代码替换下面的代码,但得到错误“离散值提供给连续刻度”:

gg <- gg + scale_fill_manual(values=colorRampPalette(brewer.pal(9, 'Reds'))(length(ddf$value)), 
                               name="Country")

谁能帮忙重现剧情?

【问题讨论】:

    标签: r ggplot2 legend


    【解决方案1】:

    您添加它而不是之前的填充比例 (scale_fill_manual)。但除此之外,您还需要将声明 fill=brk 替换为 fill=value。然后它应该工作。总而言之,新功能将如下所示(大部分是复制the linked answer):

    library(RColorBrewer)
    library(maptools)
    library(ggplot2)
    
    data(wrld_simpl)
    
    ddf = read.table(text="
                     country value
                     'United States' 10
                     'United Kingdom' 30
                     'Sweden' 50
                     'Japan' 70
                     'China' 90
                     'Germany' 100
                     'France' 80
                     'Italy' 60
                     'Nepal' 40
                     'Nigeria' 20", header=TRUE)
    
    # Pascal had a #spiffy solution that is generally faster
    
    plotPascal <- function() {
    
      pal <- colorRampPalette(brewer.pal(9, 'Reds'))(length(ddf$value))
      pal <- pal[with(ddf, findInterval(value, sort(unique(value))))]
    
      col <- rep(grey(0.8), length(wrld_simpl@data$NAME))
      col[match(ddf$country, wrld_simpl@data$NAME)] <- pal
    
      plot(wrld_simpl, col = col)
    
    }
    
    plotme <- function() {
    
      # this lets us use the contry name vs 3-letter ISO
      wrld_simpl@data$id <- wrld_simpl@data$NAME
    
      wrld <- fortify(wrld_simpl, region="id")
      wrld <- subset(wrld, id != "Antarctica") # we don't rly need Antarctica
    
      gg <- ggplot()
    
      # setup base map
      gg <- gg + geom_map(data=wrld, map=wrld, aes(map_id=id, x=long, y=lat), fill="white", color="#7f7f7f", size=0.25)
    
      # add our colored regions
      gg <- gg + geom_map(data=ddf, map=wrld, aes(map_id=country, fill=value),  color="white", size=0.25)
    
      # this sets the scale and, hence, the legend
      pal <- colorRampPalette(brewer.pal(9, 'Reds'))(length(ddf$value))
      palSz <- 10 # not sure what you really want/need for this range  
      gg <- gg + scale_fill_gradient2(low = pal[1],
                                      mid = pal[palSz/2],
                                      high = pal[palSz],
                                      midpoint = (max(ddf$value) + min(ddf$value)) / 2,
                                      name="value")
    
      # this gives us proper coords. mercator proj is default
      gg <- gg + coord_map()
      gg <- gg + labs(x="", y="")
      gg <- gg + theme(plot.background = element_rect(fill = "transparent", colour = NA),
                       panel.border = element_blank(),
                       panel.background = element_rect(fill = "transparent", colour = NA),
                       panel.grid = element_blank(),
                       axis.text = element_blank(),
                       axis.ticks = element_blank(),
                       legend.position = "right")
      gg
    
    }
    
    plotme()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-31
      • 2018-01-26
      • 1970-01-01
      • 2015-08-27
      • 1970-01-01
      • 1970-01-01
      • 2016-07-24
      相关资源
      最近更新 更多