2016-12-07 2 views
0

Je crée une carte choropleth pour les émissions de CO2 en Europe en utilisant ggplot2 et ggmap en R. La couleur de remplissage de chaque pays correspond à ses émissions de CO2. Les couleurs et la légende continue sont implémentées avec scale_fill_gradient. Cependant, j'aimerais aussi qu'un pays ait une couleur qui ne soit pas issue de la légende continue (pour une utilisation ultérieure dans une application Shiny). Je n'ai pas compris comment affecter scale_fill_gradient à l'une des multiples couches geom_polygon.Dégradé de couleur continu s'appliquant à un seul élément geom_polygon avec ggplot2 dans R

Voici ma carte initiale:

Initial map

Reproduire cette carte, télécharger les données cartographiques de http://www.naturalearthdata.com/http//www.naturalearthdata.com/download/50m/cultural/ne_50m_admin_0_countries.zip

Voici le code:

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 

Maintenant, je voudrais aime faire un pays une couleur différente (par exemple, bleu) qui n'est pas sur l'échelle de couleur continue comme indiqué dans la légende.

Je pensais pouvoir le faire en ajoutant une couche geom_polygon supplémentaire à la carte initiale. Pour le Danemark bleu, j'ai essayé ceci:

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

mais je reçois le message d'erreur: « Erreur: valeur discrète fournie à l'échelle continue » parce que les conflits « bleu » le remplissage avec scale_fill_gradient2. Existe-t-il un moyen de faire pointer scale_fill_gradient2 uniquement sur un jeu de données? Ou y a-t-il un autre moyen de s'attaquer à ce problème?

+1

Habituellement, il est conseillé de fournir des exemples [* minimaux * reproductibles] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example#answer-5963610). Je pense qu'il y a du ballast ici qui pourrait être abandonné. Vous auriez bien sûr à faire abstraction de votre problème spécifique alors ... A votre question: avez-vous essayé de mettre 'fill = 'blue'' en dehors du mappage' aes'? C'est à dire. 'geom_polygon (data = CO2MapSubset [CO2MapSubset $ id == 'NSP',], aes (x = long, y = lat, groupe = groupe), fill = 'bleu')'? "blue" est une valeur discrète, une chaîne, qui est fournie pour une échelle de remplissage continue (1,2,3 ...) .. – lukeA

+0

Merci. Cela a bien fonctionné. Je suppose que j'aurais pu supprimer tous mes commentaires, les bibliothèques utilisées et les limites de la carte. Je le ferai la prochaine fois. – fifthace

Répondre

1

Voici un exemple:

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

Allemagne overplotted en utilisant une couleur de remplissage rouge:

enter image description here

Vous pouvez adapter cet exemple pour répondre à vos besoins.