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:
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?
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
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