2017-12-18 4 views
0

Ich versuche, Hintergrunddaten in einem ggplot mit Legende automatisch in grau anzuzeigen. Mein Ziel ist es, entweder die grauen Datenpunkte in die Legende aufzunehmen oder eine zweite Legende mit einem manuellen Titel zu erstellen. Jedoch scheitere ich bei jedem der beiden. Meine Daten sind im Langformat. Ich bin nicht in der Lage, um die Hintergrunddaten in der grauen Farbe und ggplot Farben zugleichCreate ggplot2 legende für mehrere Datensätze

require(ggplot2) 

xx<-data.frame(observation="all cats",x=1:2,y=1:2) 
yy<-data.frame(observation=c("red cats","blue cats"),x=3:4,y=3:4) 

g<-ggplot() + 
    geom_point(aes(x,y, colour=factor(observation)), colour="grey60", size=5, data=xx) + 
    geom_point(aes(x,y, colour=factor(observation)), size=5, data=yy) + 
    scale_color_discrete(name = "ltitle") 

g 

enter image description here

Ich versuchte, die data.frames mit rbind.data.frame, zu fusionieren, die eine schöne Legende produziert, aber dann halten .

Ich erkannte auch, dass dies das Problem löst:

g<-ggplot(aes(x,y, colour=factor(observation)), colour="grey60", data=xx) + 
    geom_point(size=5) + 
    geom_point(aes(x,y, colour=factor(observation)), size=5, data=yy) + 
    scale_color_discrete(name = "ltitle") 
g 

aber ich kann das nicht tun, weil ich eine Funktion bin mit der vor einer komplizierten leeren Grundstück erstellt, in dem ich die geom_points fügen Sie dann .

Antwort

0

Ihr Grundstück Unter der Annahme, nicht über andere GEOMS, die eine Füllung Parameter benötigen, wird die folgende Problemumgehung, die die Farbe Ihrer Hintergrunddaten fixiert geom_point Schicht, ohne die anderen geom_point Schichten zu beeinflussen:

g <- ggplot() + 
    geom_point(aes(x, y, 
       fill = "label"),        # key change 1 
      shape = 21,          # key change 2 
      color = "grey50", size = 5, 
      data = xx) + 
    geom_point(aes(x, y, colour = factor(observation)), size = 5, data = yy) + 
    scale_color_discrete(name = "ltitle") + 
    scale_fill_manual(name = "", values = c("label" = "grey50")) # key change 3 
g 

shape = 21 gibt Ihnen eine Form, die wie der Standard-runden Punkt aussieht, sondern übernimmt eine Füllung Parameter zusätzlich zu dem Farbparameter. Sie können dann xxs geom_point Layer-Füllung in scale_fill_manual() auf grau stellen (dies erzeugt eine Fülllegende), während Sie color = "grey50" außerhalb aes() verlassen (dies wird nicht zur Farblegende hinzugefügt).

Die Farbskala für yys geom_point Schicht ist davon nicht betroffen.

plot

P. S. Mir wurde klar, dass ich "grey50" anstelle von "grey60" benutzt habe ... Aber alles andere gilt noch immer. :)

0

Eine Lösung besteht darin, einen Farbvektor zu erstellen und an scale_color_manual zu übergeben.

xx <- data.frame(observation = "all cats",x = 1:2,y = 1:2) 
yy <- data.frame(observation = c("red cats", "blue cats"),x = 3:4,y = 3:4) 
# rbind both datasets 
# OP tried to use rbind.data.frame here 
plotData <- rbind(xx, yy) 

# Create color vector 
library(RColorBrewer) 
# Extract 3 colors from brewer Set1 palette 
colorData <- brewer.pal(length(unique(plotData$observation)), "Set1") 
# Replace first color first wanted grey 
colorData[1] <- "grey60" 

# Plot data 
library(ggplot2) 
ggplot(plotData, aes(x, y, colour = observation)) + 
    geom_point(size = 5)+ 
    scale_color_manual(values = colorData, name = "ltitle") 

                                                                          enter image description here

0

Ich kam fast mit der gleichen Lösung wie Z.Lin, aber mit dem kombinierten Datenrahmen von rbind.data.frame.In ähnlicher Weise verwendet es scale_colour_manual mit einem Vektor colors Angabe der Farbzuordnung:

require(ggplot2) 

xx<-data.frame(observation="all cats",x=1:2,y=1:2) 
yy<-data.frame(observation=c("red cats","blue cats"),x=3:4,y=3:4) 

zz <- rbind.data.frame(xx,yy) 

colors <- c(
    "all cats" = "grey60", 
    "red cats" = "red", 
    "blue cats" = "blue" 
) 

g<-ggplot() + 
    geom_point(aes(x,y, colour=factor(observation)), size=5, data=zz) + 
    scale_color_manual(values= colors, name = "ltitle") 
g 

enter image description here