连续颜色渐变,适用于R中带有ggplot2的单个geom_polygon元素

时间:2016-12-07 13:21:53

标签: r ggplot2 ggmap

我正在使用R中的ggplot2和ggmap创建欧洲二氧化碳排放量的等值线图。每个国家的填充颜色与其二氧化碳排放量相对应。颜色和连续图例使用scale_fill_gradient实现。但是,我还希望一个国家的颜色不是来自连续图例(以后在Shiny应用程序中使用)。我还没有弄清楚如何将scale_fill_gradient仅应用于多个geom_polygon图层之一。

这是我的初始地图:

Initial map

要重现此地图,请从http://www.naturalearthdata.com/http//www.naturalearthdata.com/download/50m/cultural/ne_50m_admin_0_countries.zip

下载地图数据

以下是代码:

library(maptools)
library(ggplot2)
library(ggmap)

# read in a world map
WorldMap <- readShapePoly(fn="ne_50m_admin_0_countries/ne_50m_admin_0_countries")

# reduce shape file to a filtered data frame
WorldMapDf <- fortify(WorldMap,region='iso_a2')

# read in CO2 emissions
GEO <- c('FR','AT','BE','DE','DK','FI','GB','IE','NL','NO','SE')
CO2 <- c(59.5,86.9,137.4,425.8,303.9,353.2,380.3,427.0,476.4,1.8,47.6)
CO2_df <- data.frame(GEO,CO2)

# the range of values that the colour scale should cover
colorbar_range <- range(CO2_df$CO2)
mean_price <- mean(colorbar_range)

# merge map polygons with electricity CO2 emissions
CO2Map <- merge(WorldMapDf, CO2_df, by.x="id", by.y="GEO", all.x = T)
CO2Map <- CO2Map[order(CO2Map$order),]

#limit data to main Europe
europe.limits <- data.frame(matrix(c(35.50,-11.43,70,31.11),nrow=2,ncol=2,byrow = T))
names(europe.limits) <- c('lat','long')
CO2MapSubset <- subset(CO2Map, long > min(europe.limits$lon) & long < max(europe.limits$lon) & lat > min(europe.limits$lat) & lat < max(europe.limits$lat))

# create x and y limits
xrange <- c(min(CO2MapSubset$long),max(CO2MapSubset$long))
yrange <- c(min(CO2MapSubset$lat),max(CO2MapSubset$lat))

initial_map <- ggplot(data=CO2MapSubset) + # data layer
  geom_polygon(aes(x=long, y=lat, group=group, fill=CO2)) +
  coord_map(projection = "mercator",xlim=xrange,ylim=yrange) +
  scale_fill_gradient2(low='gold',mid = "white",high='firebrick2',na.value = "lightgrey",midpoint=mean_price,limits=colorbar_range, name='CO2 (g/kWh)') +
  geom_path(aes(x=long, y=lat, group=group), color='black',size=0.2)

# display map
initial_map

现在,我想让一个国家的颜色不同(例如,蓝色)不是连续色标,如图例所示。

我想我可以通过在初始地图中添加额外的geom_polygon图层来实现这一目标。为了使丹麦成为蓝色,我尝试了这个:

map_with_selected_country <- initial_map +
  geom_polygon(data = CO2MapSubset[CO2MapSubset$id == 'DK',], aes(x=long, y=lat, group=group, fill='blue'))

但是我收到错误消息:'错误:提供给连续缩放的离散值',因为填充'blue'与scale_fill_gradient2冲突。有没有办法让scale_fill_gradient2只指向一个数据集?或者还有另一种解决这个问题的方法吗?

1 个答案:

答案 0 :(得分:2)

以下是一个例子:

library(ggplot2)
map <- map_data("world")
map$value <- setNames(sample(1:50, 252, T), unique(map$region))[map$region]
p <- ggplot(map, aes(long, lat, group=group, fill=value)) + 
  geom_polygon() + 
  coord_quickmap(xlim = c(-50,50), ylim=c(25,75))
p + geom_polygon(data = subset(map, region=="Germany"), fill = "red")

德国使用红色填充颜色过度绘制:

enter image description here

您可以根据自己的需要调整此示例。