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

Continuous colour gradient that applies to a single geom_polygon element with ggplot2 in R

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

这是我的初始地图:

要复制此地图,请从 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'))

但我收到错误消息:'Error: Discrete value supplied to continuous scale' 因为填充 'blue' 与 scale_fill_gradient2 冲突。有没有办法让 scale_fill_gradient2 只指向一个数据集?或者有其他方法可以解决这个问题吗?

这是一个例子:

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")

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

您可以调整此示例以满足您的需要。