2017-02-27 5 views
1

J'essaie de dessiner un nuage de points, puis de superposer des polygones et de remplir les polygones avec des couleurs spécifiques dans ggplot 2 et j'ai quelques difficultés à obtenir les bonnes couleurs pour le remplissage. Je peux dessiner le nuage de points et les polygones, colorier le nuage de points et la bordure des polygones, mais quand j'essaie de remplir les polygones, ils sortent toujours des couleurs différentes ou me donnent des erreurs.Comment remplir les couleurs correctement dans geom_polygon dans ggplot?

Mes données ressemble à ceci,

id  lat  long group 
Ak 0.5109300 30.43713  1 
Ak 0.5109300 30.43713  2 
An 0.4709994 30.43434  1 
An 0.4860330 30.44015  2 
At 0.4956100 30.44610  2 
At 0.4938700 30.44640  2 
At 0.4837816 30.44658  3 
Be 0.4932194 30.43455  3 
Bo 0.4922330 30.44582  1 
Bo 0.4922330 30.44582  3 
cb 0.4929994 30.44486  5 
de 0.4926486 30.45684  5 
de 0.5000001 30.45331  5 
eg 0.4854526 30.46824  6 
eh 0.4765586 30.46987  6 
gh 0.4822123 30.54835  7 

J'ai deux listes de couleurs, un pour les points du nuage de points, et un pour la frontière et remplir des polygones, la raison pour laquelle il y a deux listes, C'est parce que je regroupe les points, par le réseau de colonnes de données, et que je veux dessiner des polygones autour de tous les points avec les niveaux 1 -5 (mais pas 6 et 7). Je crée donc les listes de couleurs suivantes

col_list<-c("#FF222C", "#1DFBFF", "#FDFF24", "#2CFF18", "#FF38F4", "#C3C4C9", "#000000") 
col_list5<-c("#FF222C", "#1DFBFF", "#FDFF24", "#2CFF18", "#FF38F4") 

Je dessine l'intrigue avec

g<-ggplot(data= samples, aes(x=long, y=lat))+ 
geom_point(color = col_list[samples$group])+ 
theme(panel.grid.major=element_blank(), 
panel.grid.minor=element_blank(), 
panel.background = element_blank(), 
panel.border = element_rect(colour = "black", fill=NA, size=1)) 

J'utilise ensuite le code suivant pour générer les polygones

library(plyr) 
samples_group1_5<-subset(samples, network < 6) 

find_hull <- function(samples_group1_5) samples_group1_5[chull(samples_group1_5[,3], samples_group1_5[,2]), ] 
hulls <- ddply(samples_group1_5, "group", find_hull) 
g.col <- col_list5[hulls$group] 

Et puis superposer les polygones avec

g+ 
geom_polygon(data = hulls, alpha = 0.5, aes(fill=factor(group))) + 
geom_polygon(data = hulls, alpha = 0, aes(group=factor(group)), colour=g.col) 

Tout fonctionne, sauf que les couleurs de remplissage sont différentes, les bordures et les points sont les mêmes, les couleurs correctes, mais je n'arrive pas à faire correspondre les couleurs de remplissage.

+0

'Erreur dans eval (expr, envir, enclos): objet 'réseau' non trouvé'. – Axeman

Répondre

4

Vous essayez d'appliquer des méthodes de tracé de base à ggplot en utilisant des vecteurs de couleurs directement sous la forme d'un argument col. Il est beaucoup plus facile d'utiliser la bonne façon ggplot de mapper les couleurs aux variables de votre data.frame. Voici ce que je ferais:

En premier lieu, calculer les coques (votre code n'a pas fonctionné pour moi):

library(dplyr) 

hulls <- samples %>% 
    group_by(group) %>% 
    do(.[chull(.[2:3]), ]) 

Ensuite, tout ce dont nous avons besoin est deux couches, et une cartographie discrète (factor) à group pour les col et fill:

p <- ggplot(samples, aes(x = long, y = lat, col = factor(group), fill = factor(group)))+ 
    geom_polygon(data = hulls, alpha = 0.3) + 
    geom_point() 

vous donnant quelques belles couleurs automagiquement, et vous obtenez une légende gratuitement!

enter image description here

Maintenant, si nous voulons utiliser vos couleurs à la place, nous devons introduire des échelles:

p + 
    scale_color_manual(values = col_list) + 
    scale_fill_manual(values = col_list) 

enter image description here

Si vous voulez garder le groupe manquant (4) la palette, vous devez utiliser un vecteur nommé pour values à la place, dans ce cas, vous pouvez fournir setNames(col_list, 1:7).