2017-02-27 2 views
1

Ich versuche, ein Streudiagramm zu zeichnen, dann einige Polygone überlagern und in den Polygonen mit bestimmten Farben in ggplot 2 und ich habe einige Probleme immer die richtigen Farben für die Füllung zu füllen. Ich kann das Streudiagramm und die Polygone zeichnen und das Streudiagramm und den Rand der Polygone gleich einfärben, aber wenn ich versuche, die Polygone zu füllen, kommen immer unterschiedliche Farben heraus oder geben mir Fehler.Wie man Farben in geom_polygon in ggplot richtig füllt?

Meine Daten wie folgt aussehen,

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 

ich zwei Listen von Farben, eine für die Punkte in der Punktwolke, und einen für die Grenze und füllen den Polygone, der Grund gibt zwei Listen, liegt daran, dass ich die Punkte nach dem Datenspalten-Netzwerk gruppiere und Polygone um alle Punkte mit den Ebenen 1-5 (aber nicht 6 und 7) zeichnen möchte. So schaffe ich die folgenden Farblisten

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

ich das Grundstück ziehen mit

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

ich dann den folgenden Code verwenden, um die Polygone

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] 

zu erzeugen, und dann überlagern die Polygone mit

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) 

Alles funktioniert, außer dass die Füllfarben unterschiedlich sind, die Ränder und die Punkte sind die gleichen, die richtigen Farben, aber ich kann die Füllfarben nicht finden.

+0

'Fehler in eval (ausdr, envir, enclos): Objekt 'Netzwerk' found' nicht. – Axeman

Antwort

4

Sie versuchen, Grundstück Methoden anzuwenden, indem unter Verwendung von Vektoren von Farben direkt als col Argument ggplot. Es ist viel einfacher, die richtige ggplot-Methode zum Zuordnen von Farben zu Variablen in Ihrem data.frame zu verwenden. Hier ist, was ich tun würde:

Zuerst berechnen die Rümpfe (Code nicht für mich arbeiten):

library(dplyr) 

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

Dann brauchen wir nur noch zwei Schichten und eine diskrete (factor) Zuordnung zu group sowohl für col und fill:

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

Geben Sie ein paar schöne Farben automagically, und eine Legende kostenlos zu bekommen!

enter image description here

Nun, wenn wir Ihre Farben wollen, anstatt verwenden, müssen wir Skalen vorstellen:

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

enter image description here

Wenn Sie die fehlende Gruppe behalten wollen (4) in In der Palette müssen Sie stattdessen einen benannten Vektor für values verwenden. In diesem Fall können Sie also setNames(col_list, 1:7) angeben.

Verwandte Themen