2014-10-06 7 views
18

Ich möchte Linien mit verschiedenen Formen mit mehr als sechs Sätze von Daten, mit diskreten Farben. Die Probleme sind 1) es wird eine andere Legende für Linienfarbe und -form generiert, sollte aber nur eine Legende mit der Linienfarbe und -form sein, 2) wenn der Titel für die Linienfarbenlegende korrigiert wird, verschwindet die Farbe.Mehr als sechs Formen in ggplot

t=seq(0,360,20) 
for (ip in seq(0,10)) { 
    if (ip==0) { 
    df<-data.frame(t=t,y=sin(t*pi/180)+ip/2,sn=ip+100) 
    } else { 
    tdf<-data.frame(t=t,y=sin(t*pi/180)+ip/2,sn=ip+100) 
    df<-rbind(df,tdf) 

    } 
} 
head(df) 

# No plot 
# Error: A continuous variable can not be mapped to shape 
gp <- ggplot(df,aes(x=t,y=y,group=sn,color=sn,shape=sn)) 
gp <- gp + labs(title = "Demo more than 6 shapes", x="Theat (deg)", y="Magnitude") 
gp <- gp + geom_line() + geom_point() 
print(gp) 

# No plot 
# Error: A continuous variable can not be mapped to shape (doesn't like integers) 
gp <- ggplot(df,aes(x=t,y=y,group=sn,color=sn,shape=as.integer(sn))) 
gp <- gp + labs(title = "Demo more than 6 shapes", x="Theat (deg)", y="Magnitude") 
gp <- gp + geom_line() + geom_point() 
print(gp) 

# Gives warning about 6 shapes, and only shows 6 shapes, continous sn colors 
gp <- ggplot(df,aes(x=t,y=y,group=sn,color=sn,shape=as.factor(sn))) 
gp <- gp + labs(title = "Only shows six shapes, and two legends, need discrete colors", 
       x="Theat (deg)", y="Magnitude") 
gp <- gp + geom_line() + geom_point() 
print(gp) 

# This is close to what is desired, but correct legend title and combine legends 
gp <- ggplot(df,aes(x=t,y=y,group=sn,color=as.factor(sn),shape=as.factor(sn %% 6))) 
gp <- gp + labs(title = "Need to combine legends and correct legend title", x="Theat (deg)", y="Magnitude") 
gp <- gp + geom_line() + geom_point() 
print(gp) 

# Correct legend title, but now the line color disappears 
gp <- ggplot(df,aes(x=t,y=y,group=sn,color=as.factor(sn),shape=as.factor(sn %% 6))) 
gp <- gp + labs(title = "Color disappeard, but legend title changed", x="Theat (deg)", y="Magnitude") 
gp <- gp + geom_line() + geom_point() 
gp <- gp + scale_color_manual("SN",values=as.factor(df$sn)) 
print(gp) 

# Add color and shape in geom_line/geom_point commands, 
gp <- ggplot(df,aes(x=t,y=y,group=sn)) 
gp <- gp + labs(title = "This is close, but legend symbols are wrong", x="Theat (deg)", y="Magnitude") 
gp <- gp + geom_line(aes(color=as.factor(df$sn))) 
gp <- gp + geom_point(color=as.factor(df$sn),shape=as.factor(df$sn %% 6)) 
gp <- gp + scale_color_manual("SN",values=as.factor(df$sn)) 
print(gp) 
+0

möglich Duplikat [Ändern der Formen für Skala \ _shape() in ggplot2 verwendet] (http://stackoverflow.com/questions/1478532/changing-shapes-used-for-scale-shape-in-ggplot2) – Henrik

+1

Ich glaube nicht, dass diese Frage ein Duplikat dieser Frage ist, er spricht nur davon, die Form über den Bereich der Formen zu ändern. Mein Problem ist, dass die Anzahl der benötigten Formen die Anzahl der verfügbaren Formen übersteigt. Diese Frage ist ein Duplikat von http://stackoverflow.com/questions/26223857/more-than-six-shapes-in-ggplot, aber es gibt keine Antwort auf diese Frage. – user3969377

Antwort

31

Zunächst wäre es einfacher, sn in einen Faktor umzuwandeln.

df$sn <- factor(df$sn) 

Dann müssen Sie scale_shape_manual verwenden, um Ihre Formen angeben zu verwenden.

gp <- ggplot(df,aes(x=t, y=y, group=sn,color=sn, shape=sn)) + 
      scale_shape_manual(values=1:nlevels(df$sn)) + 
      labs(title = "Demo more than 6 shapes", x="Theat (deg)", y="Magnitude") + 
      geom_line() + 
      geom_point(size=3) 
gp 

Dies sollte Ihnen geben, was Sie wollen. Sie müssen scale_shape_manual verwenden, denn selbst mit sn als Faktor wird ggplot nur bis zu 6 verschiedene Symbole automatisch hinzufügen. Danach müssen Sie sie manuell angeben. Sie können Ihre Symbole auf verschiedene Arten ändern. Werfen Sie einen Blick auf diese Seiten für weitere Informationen darüber, wie: http://sape.inf.usi.ch/quick-reference/ggplot2/shape
http://www.cookbook-r.com/Graphs/Shapes_and_line_types/

enter image description here

+2

Dies ist näher, aber es funktioniert nicht wirklich auf die realen Daten. Ich brauche immer noch die Mod-Funktion, die echten Daten haben zu viele Ebenen. Scheint, dass scale_shape_manual (Werte = (1: nlevels (df $ sn)) %% Nmax) funktioniert. – user3969377

+0

Wobei Nmax die Anzahl der anzuzeigenden Formen ist. – user3969377

+1

Im letzten Beispiel der ersten Verbindung, die ich eingefügt habe, erfahren Sie ein wenig mehr über die verfügbaren Formen. Beachten Sie, dass die Shapes 21-25 hohl sind und ein "fill" -Argument enthalten, so dass es eine andere Möglichkeit wäre, verschiedene Symbole hinzuzufügen. Gute Arbeit, die Lösung zu sortieren. –

5

Für mich ist der Schlüssel zu der Fehlermeldung über die 6 Formen ist der Teil, Consider specifying shapes manually. sagt. Wenn Sie die values in scale_shape_manual hinzufügen, glaube ich, dass Sie bekommen, was Sie wollen. Ich habe sn zuerst einen Faktor in den Datensatz aufgenommen.

df$sn = factor(df$sn) 

ggplot(df, aes(x = t, y = y, group = sn, color = sn, shape = sn)) + 
    geom_point() + 
    geom_line() + 
    scale_shape_manual(values = 0:10) 

Ich gehe zum Cookbook for R site, wenn ich die Zahlen entsprechen, welche Formen sich merken müssen.

Bearbeiten Das obige Beispiel zeigt das Hinzufügen von 11 Symbolen, die gleiche Anzahl von Symbolen in Ihrem Beispieldatensatz. Ihre Kommentare zeigen an, dass Sie viel mehr eindeutige Werte für die Variable sn als in Ihrem Beispiel haben. Seien Sie vorsichtig bei der Verwendung einer langen Reihe von Zahlen in values, da nicht alle Zahlen als Symbole definiert sind.

Wenn Sie ignorieren, ob es sinnvoll ist, so viele Formen in einer einzelnen Grafik zu haben oder nicht, können Sie Buchstaben und Zahlen sowie Symbole als Formen verwenden. Also, wenn Sie sagen wollten, 73 verschiedene Formen basierend auf einem Faktor mit 73 Stufen, könnten Sie 19 Symbole, alle Groß- und Kleinbuchstaben, und die Zahlen 0 und 1 als values verwenden.

scale_shape_manual(values = c(0:18, letters, LETTERS, "0", "1")) 
+0

Danke für die Eingabe. Ich denke, die Werte müssen entweder der Anzahl der Zeilen (Seriennummern) oder der Anzahl der Zeilenfaktoren entsprechen. Die eigentlichen Daten haben mehr Zeilen als es Symbole gibt, also ging es durch das Alphabet, dann denke ich kein Symbol angezeigt. Die Werte benötigen noch eine Mod-Funktion, um auf den Bereich der Symbole zurück zu skalieren. – user3969377

+0

@ user3969377 Wow, wie viele Ebenen hat 'sn'?Wenn Sie wirklich diese vielen verschiedenen Formen möchten, können Sie 71 einzigartige Formen erhalten, wenn Sie Symbole 0:18 sowie alle Groß- und Kleinbuchstaben verwenden. Es gibt sogar noch mehr, wenn Sie anfangen, Zahlen und Sonderzeichen hinzuzufügen, aber nicht sicher sind, wie Sie jemals in der Lage sein würden, alles in einem Plot zu erzählen. – aosmith

+0

Einige der Figuren haben über 400 Ebenen. Ich weiß, es ist keine gute Handlung, ich suche nur nach Mustern ... – user3969377