2016-05-05 11 views
3

Ich versuche, ggplot mit mehreren verschiedenen Schichten von Linien zu verwenden, eine mit einer Farblegende und die andere mit einer Linientyp-Legende. Leider scheint es, dass beide Schichten in beiden Legenden auftauchen, wie in dem einfachen Beispiel unter:Wie kann ich steuern, welche Geome in welchen Legenden in ggplot2 angezeigt werden?

hlines <- data.frame(Hline=c("a", "b"), y=c(-1,1)) 
vlines <- data.frame(Hline=c("x", "y"), x=c(-1,1)) 
ggplot() + 
    geom_hline(data=hlines, 
       aes(color=Hline, yintercept=y, linetype=NA), 
       linetype="solid", 
       show.legend=TRUE) + 
    geom_vline(data=vlines, 
       aes(linetype=Hline, xintercept=x, color=NA), 
       color="black", 
       show.legend=TRUE) + 
    scale_color_hue(name="Hline color") + 
    scale_linetype(name="Vline ltype") + 
    xlim(-3, 3) + ylim(-3, 3) 

Der Code dieses Grundstück produziert:

Es gibt bereits mehrere ähnliche Fragen, wie aber keine der vorgeschlagenen Lösungen behebt das Problem in diesem Beispiel. Zum Beispiel wurde this question durch einfaches Entfernen eines Geom aus alle die Legenden beantwortet, was nicht das ist, was ich will, während this question scheint es sollte eine Lösung für mein Problem sein, aber mein Code oben enthält bereits die Antwort und ich sehe immer noch das Problem. Also, wie kann ich ggplot sagen, die vertikalen Linien aus der Farblegende und die horizontalen Linien aus der Linientyp-Legende im obigen Beispiel zu entfernen?

Antwort

4

Alles, was Sie brauchen, ist

ggplot() + 
    geom_hline(data = hlines, 
       aes(color = Hline, yintercept = y)) + 
    geom_vline(data = vlines, 
       aes(linetype = Hline, xintercept = x)) + 
    scale_color_hue(name = "Hline color") + 
    scale_linetype(name = "Vline ltype") + 
    xlim(-3, 3) + ylim(-3, 3) 

plot with proper legends

ggplot2 aus seiner Legende Spezifikationen nimmt, was in aes ist. Wenn es außerhalb aes aber in der geom_* Funktion ist, wird es geplottet, aber nicht in die Legende eingefügt.

Wenn Sie show.legend = TRUE angeben, wird dieses Verhalten überschrieben und eine Legende für alles gezeichnet. Sie wollen eigentlich show.legend = NA, was der Standard ist.

Verwandte Themen