2012-05-08 5 views
14

Ich versuche, ein Diagramm mit mehreren Kurven zu zeichnen. Die X-Achse sind keine numerischen Werte, sondern Strings.ggplot mit Strings auf x-Achse

Dies funktioniert (wie in how to plot all the columns of a data frame in R):

require(ggplot2) 
df_ok <- rbind(data.frame(x=4:1,y=rnorm(4),d="d1"),data.frame(x=3:1,y=rnorm(3),d="d2")) 
ggplot(df_ok, aes(x,y)) + geom_line(aes(colour=d)) 

Aber meine Daten sieht wie folgt aus:

require(ggplot2) 
df_nok <- rbind(data.frame(x=c("four","three","two","one"),y=rnorm(4),d="d1"),data.frame(x=c("three","two","one"),y=rnorm(3),d="d2")) 
ggplot(df_nok, aes(x,y)) + geom_line(aes(colour=d)) 

Ich erhalte den Fehler geom_path: Jede Gruppe besteht aus nur einer Beobachtung. Müssen Sie die Gruppenästhetik anpassen?. Obwohl die Diagrammlinien nicht angezeigt werden, sind die Achsen geplottet, und die X-Achse enthält die korrekten Etiketten - aber auch falsche Reihenfolge.

Eine Idee, wie Sie dies so einfach wie möglich planen? (Beachten Sie auch die fehlenden x-Werte für einige Serien).

Antwort

18

Ihr Problem sehen ist, dass die x Variable ist ein Faktor. Also, Ihre Datenrahmen ändern und x einen doppelten:

df = rbind(data.frame(x=4:1,y=rnorm(4),d="d1"), 
      data.frame(x=3:1,y=rnorm(3),d="d2")) 

Plot als normal

g = ggplot(df, aes(x,y)) + geom_line(aes(colour=d)) 

aber ändern, um die x-Achse Skalierung explizit:

g + scale_x_continuous(breaks=1:4, labels=c("one", "two", "three", "four")) 

umbenennen Ihre Variable, versuchen Sie etwas wie:

x1 = factor(df_nok$x, 
      levels=c("one", "two", "three", "four"), 
      labels=1:4) 
df$x1 = as.numeric(x1) 
+0

Ich würde gerne meine Daten nicht umformen müssen. Aber wenn niemand eine Idee hat, werde ich diese Antwort akzeptieren. – fabb

+1

Haben Sie eine Idee, wie ich meine Daten leicht zu diesem Formular umformen konnte, wenn ich 'df_nok' und eine gewünschte Reihenfolge von' x' habe? – fabb

+0

Ich würde Sie zehn upvote, wenn ich könnte. muss sich 'as.is = TRUE' ständig merken! Hatte ein zweites Problem Problem wurde verursacht durch Datum als Zeichen nach der Einstellung 'as.is = TRUE', aber das war leicht mit einem' as.Date() 'gelöst. – ricardo

5

Sie ggplot überzeugen können Linien zeichnen durch eine Dummy-Gruppe hinzufügen,

ggplot(df_nok, aes(x,y)) + geom_line(aes(colour=d, group=d)) 

Auch http://kohske.wordpress.com/2010/12/27/faq-geom_line-doesnt-draw-lines/

+1

Dies funktioniert nicht richtig. Es zeichnet eine Linie mit farbigen Segmenten, aber nicht 2 getrennte Linien. – fabb

+0

Es sollte "Gruppe = d", nicht "Gruppe = 1" sein. –

+0

Großartiges Zeug! Jetzt ist nur noch die Reihenfolge falsch ("vier", "eins", "drei", "zwei"). Jede schnelle Hilfe dafür? – fabb

3

Fügen Sie in der group Ästhetik (Art von redundant, ich weiß, aber viel einfacher als Re-Jigging der Achsenbeschriftungen).

df_nok <- rbind(data.frame(x=c("four","three","two","one"),y=rnorm(4),d="d1"),data.frame(x=c("three","two","one"),y=rnorm(3),d="d2")) 

ggplot(df_nok, aes(x,y, group=d)) + geom_line(aes(colour=d)) 

Es stimmt, dass Ihre X-Achse immer noch nicht in der von Ihnen gewünschten Reihenfolge ist. Wie von @csgillespie bemerkt, können Sie dies beheben, indem Sie es in einen Faktor verwandeln.

df_nok$x <- factor(df_nok$x, 
      levels=c("one", "two", "three", "four"), 
      labels=1:4) 
+0

Besser ein Jahr zu spät als nie, oder? Nun, das wird für Leute wie mich sein, die in Zukunft darauf stoßen. – Tom

+0

Richtig, danke für die zusätzliche Antwort. – fabb