2016-07-31 6 views
0

Ich verwende ggplot2 Version 2.1.0. Es folgt der Screenshot eines Plots ich erstellt:Warum sind die Formen in der Legende nicht identisch mit Formen in der Grafik in ggplot2?

enter image description here

Nach der Code:

ggplot()+ 
    geom_point(data = BSX_SDX_5 %>% filter(CC1_BX1>0, sp_BX>1, 
             !(CC1_BX1 %in% c(Inf, -Inf)), 
             dV_BX>=-1 & dV_BX<=0, 
             BX1<=40) , 
      aes(y = dV_BX, x = BX1, shape = "Observed"), alpha=0.4)+ 
    geom_point(data = modi_CC1 %>% filter(CC1>0, sp_BX>1, 
             !(CC1 %in% c(Inf, -Inf)),dV<=0, 
             min_spacing<=76) , 
      aes(y = dV, x = min_spacing, shape = "SIMDATA1"), size=3)+ 
    geom_point(data = def_CC1 %>% filter(CC1>0, sp_BX>1, 
             !(CC1 %in% c(Inf, -Inf)),dV<=0, 
             min_spacing<=76) , 
      aes(y = dV, x = min_spacing, shape = "SIMDATA2"), size=3) + 
    scale_y_reverse()+ 
    scale_shape_manual(values = c(17, 0, 16))+ 
    theme_bw()+ 
    theme(axis.title.x = element_text(face="bold", size=20, vjust=0.5), 
     axis.title.y = element_text(face="bold", size=20, vjust=0.5), 
     axis.text = element_text(size=20), 
     legend.title=element_blank(), 
     legend.text = element_text(size = 15, face = "bold"), 
     strip.text.x = element_text(size = 20, face = "bold"), 
     legend.position = c(0.9,0.8), 
     legend.key.height = unit(1, "cm"), 
     legend.key.width = unit(1.5, "cm")) 

ich die Daten nicht mit anderen geteilt haben, wie es scheint, dass das Problem nicht mit den Daten angeht . Wie kann ich sicherstellen, dass Formen in der Legende korrekt mit denen in der Handlung übereinstimmen?

+0

Stellen Sie sich das Problem mit den Designelementen 'legend.key.height' und' legend.key.width' vor, versuchen Sie, sie zu entfernen, und sehen Sie, wie Sie vorgehen. –

+0

@NicholasHamilton, habe ich den ganzen Theme-Teil entfernt und den Code ausgeführt. Das Plot wird generiert, hat aber immer noch das gleiche Problem in Shapes. –

+2

Ok, ich habe es herausgefunden, weil Sie die Größe = 3 für die letzten 2 Geometrien und keine Spezifikation für die erste angeben. Versuchen Sie, alle Punktgeome mit derselben Größe zu setzen, oder entfernen Sie das Größenargument vollständig. –

Antwort

2

Sein wegen der expliziten Größe Spezifikation in den drei geom Schichten, die ersten nicht überhaupt hat, und die 2. und 3. geom mit einer Größe auf 3 gesetzt

Dies zeigt meinen Punkt:

set.seed(1) 
n = 100 
shapes = c("Observed","SIMDATA1","SIMDATA2") 
df = data.frame(x=runif(n),y=runif(n),shape=sample(shapes,n,replace=T)) 
base = ggplot(df,aes(x,y,shape=shape)) + 
    scale_y_reverse()+ 
    scale_shape_manual(values = c(17, 0, 16))+ 
    theme_bw()+ 
    theme(axis.title.x = element_text(face="bold", size=20, vjust=0.5), 
     axis.title.y = element_text(face="bold", size=20, vjust=0.5), 
     axis.text = element_text(size=20), 
     legend.title=element_blank(), 
     legend.text = element_text(size = 15, face = "bold"), 
     strip.text.x = element_text(size = 20, face = "bold"), 
     legend.position = c(0.9,0.8), 
     legend.key.height = unit(1, "cm"), 
     legend.key.width = unit(1.5, "cm")) 

#BAD, AS PER YOUR PROBLEM 
base + 
    geom_point(data=df[1:(n/2),])+ 
    geom_point(data=df[(n/2):n,],size=3) 

#GOOD 
base + 
    geom_point(data=df[1:(n/2),])+ 
    geom_point(data=df[(n/2):n,]) 

#GOOD 
base + 
    geom_point(data=df[1:(n/2),],size=3)+ 
    geom_point(data=df[(n/2):n,],size=3) 

Wenn Sie unterschiedliche Größen haben wollen, können Sie eine Variable Größe abzubilden, und verwenden scale_size_manual, wie folgt aus:

base = ggplot(df,aes(x,y,shape=shape,size=shape)) + 
    scale_y_reverse()+ 
    scale_shape_manual(values = c(17, 0, 16)) + 
    scale_size_manual(values = c(3,6,6)) + 
    theme_bw()+ 
    theme(axis.title.x = element_text(face="bold", size=20, vjust=0.5), 
     axis.title.y = element_text(face="bold", size=20, vjust=0.5), 
     axis.text = element_text(size=20), 
     legend.title=element_blank(), 
     legend.text = element_text(size = 15, face = "bold"), 
     strip.text.x = element_text(size = 20, face = "bold"), 
     legend.position = c(0.9,0.8), 
     legend.key.height = unit(1, "cm"), 
     legend.key.width = unit(1.5, "cm")) 

base + 
    geom_point(data=df[1:(n/2),])+ 
    geom_point(data=df[(n/2):n,]) 
+0

Vielen Dank. –