适用于 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 层之一。
这是我的初始地图:
下载地图数据
代码如下:
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")
德国使用红色填充颜色过度绘制:
您可以调整此示例以满足您的需要。
我正在使用 R 中的 ggplot2 和 ggmap 创建欧洲 CO2 排放的等值线图。每个国家/地区的填充颜色与其 CO2 排放量相对应。颜色和连续图例使用 scale_fill_gradient 实现。但是,我也希望单个国家/地区的颜色不是来自连续图例(供以后在 Shiny 应用程序中使用)。我还没有弄清楚如何让 scale_fill_gradient 只应用于多个 geom_polygon 层之一。
这是我的初始地图:
代码如下:
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")
德国使用红色填充颜色过度绘制:
您可以调整此示例以满足您的需要。