2012-05-09 9 views
12

Ich brauche eine einfache Liniendiagramm mit Gruppen mit folgenden Daten zu erstellen:Wie erstellt man ein Liniendiagramm mit Gruppen in Base R ohne Schleifen?

library(ggplot2) 
    #GGPLOT 
    qplot(x=x, y=y, 
      data=test, 
      colour=group, 
      main="GGPLOT line plot with groups") + 
     geom_line() 

enter image description here

ich es auch tun kann, mit: kann

test = data.frame(x = rep(1:3, each = 2), 
        group = rep(c("Group 1","Group 2"),3), 
        groupcd= rep(c(1,2),3), 
        y= c(22,8,11,4,7,5) 
       ) 

ich es leicht mit GGPLOT tun TRELLIS:

library(lattice) 
xyplot(y~x, 
     type="b", 
     group=group, 
     data=test, 
     main="TRELLIS line plot with groups", 
     auto.key =list(
     lines = TRUE) 
     ) 

enter image description here

Allerdings bin ich ein wenig widerwillig, GGPLOT oder TRELLIS jetzt zu verwenden. Ich möchte in der Lage sein, diese Grafik zu erstellen mit Basis R. Die einzige Art, wie ich dieses Grundstück bekommen kann in der Base R zu arbeiten, ist durch for-Schleife:

# set up empty plot 
plot(test$y ~test$x, ylab="y", xlab="x", type="n", main="Base R line plot with groups") 
colors<-c("red","blue") 
#plot each group in the for loop 
number_of_groups <- as.numeric(max(unique(test$groupcd))) #calculate number of groups 
for (i in 1:number_of_groups) 
{ 
    temp <- subset(test, groupcd==i) 
    lines(temp$x, temp$y, col=colors[i]) 
    points(temp$x, temp$y, col=colors[i]) 
} 
legend("top", legend=unique(test$group), text.col =colors ) 

enter image description here

Dieser Ansatz scheint ziemlich verschachtelt. Gibt es einen einfacheren Weg, dies in Base R zu tun? Gibt es eine Gruppenoption in der Basis-R-Plot-Funktion? Ich danke dir sehr.

+4

wandeln Sie Ihre Daten in Großformat um und verwenden Sie 'matplot' ... –

+0

Vielen Dank! Ich war mir Matplot gar nicht bewusst - das ist sehr hilfreich. Es ist eine sehr gute Lösung und scheint die beste Option zu sein. Ich bin nur wirklich überrascht, Gruppierung kann nicht einfach mit PLOT getan werden. Nochmals vielen Dank –

+0

Ich denke, Sie sollten Ihre 'matplot' Lösung als Antwort anstatt als Bearbeitung Ihrer Frage einreichen (obwohl abhängig von Ihrem Ruf müssen Sie vielleicht eine Weile warten - ich weiß es nicht). Ich denke, ich kann ziemlich sicher sagen, dass es in base :: plot keine einfache Gruppenoption gibt.Ein paar andere Gedanken zu Ihrem Code oben: (1) Ich denke, Sie können 'subset (test_transposed, select = -x)' verwenden, um die 'x' Spalte fallen zu lassen; (2) du willst wahrscheinlich 'lty = 1: 2, col = farben, pch = 1: 2' in deiner' legend'-Anweisung. –

Antwort

8

Was ist so etwas wie dies als Basis zu arbeiten:

test = data.frame(x = rep(1:3, each = 2), 
        group = rep(c("Group 1","Group 2"),3), 
        groupcd= rep(c(1,2),3), 
        y= c(22,8,11,4,7,5) 
       ) 

xvals <- split(test$x,test$group) 
yvals <- split(test$y,test$group) 

plot(1:max(unlist(xvals)),ylim=(c(0,max(unlist(yvals)))),type="n") 
# thanks to @BenBolker for refining this next key line 
mapply(lines,xvals,yvals,col=c("red","blue"),pch=1:2,type="o") 

Ergebnis:

enter image description here

+0

Dies ist ein brillanter Ansatz. Ist es jedoch immer noch keine Variation des Loop-Ansatzes? d.h. es gibt keine "Gruppierungs" -Variable wie die mit der TRELLIS-Darstellung. Ich war im Begriff, die Matplot-Lösung als Antwort einzureichen. Ich bin bei R neu, um zu entscheiden, welcher Ansatz besser ist. –

+0

Danke, aber es könnte vorzeitiges Lob sein. Ich weiß nicht, wie man einen Vektor von Farben innerhalb der 'Mapply'-Anweisung übergibt, so dass jede Zeile nicht gleich aussieht. Es muss möglich sein, aber es könnte diese "einfache" Lösung wieder komplex machen. – thelatemail

+0

Es ist eine ziemlich erweiterbare Lösung, z.B. 'mapply (Linien, xvals, yvals, col = c (" rot "," blau "), lty = 1: 2, pch = 1: 2, MoreArgs = Liste (type =" b "))' - all Argumente werden über * außer * den in 'MoreArgs' –

2

Verschiedene Ansatz MATPLOT:

library(reshape) 
test = data.frame(x = rep(1:3, each = 2), 
        group = rep(c("Group 1","Group 2"),3), 
        groupcd= rep(c(1,2),3), 
        y= c(22,8,11,4,7,5) 
       ) 
colors<-c("red","blue") 

#Transform data to wide format 
test_transposed<-reshape(test, 
         idvar='x', 
         drop="group", 
         timevar="groupcd", 
         direction="wide") 
colors<-c("red","blue") 

#drop x column 
test_transposed$x<-NULL 

matplot(test_transposed, 
     type = "b", 
     ylab="y", 
     col=colors, 
     main="MATPLOT with groups", 
     pch = 1:2) 

legend("top", 
     legend=unique(test$group), 
     lty=1:2, 
     col=colors, 
     pch=1:2 ) 

enter image description here

1

Ich habe mich das auch gefragt. Meine Panel-Daten haben keine vollständige Abdeckung auf der x-Achse (Jahre), so dass matrixartige Lösungen wahrscheinlich kompliziert werden würden. Stattdessen ging ich mit ...

mytest = data.frame(
       x = rep(1:3, each = 2), 
       groupcd= rep(c(1,2),3), 
       y= c(22,8,11,4,7,5) 
      ) 
mytest = rbind(mytest,c(2,3,15),c(3,3,17)) 

plottables <- split(mytest,mytest$groupcd) 
plot(y~x,dat=plottables[[1]],type="l",xlim=range(mytest$x),ylim=range(mytest$y)) 
lapply(plottables,function(z)points(y~x,dat=z,type="l")) 
0

Ich mag würde ein wenig verlängern diese post..suppose dass instad Plotten Linien I Regressionsgeraden wollen. Die Erweiterung des Code von @Frank ..

mytest = data.frame(
       x = rep(1:3, each = 2), 
       groupcd= rep(c(1,2),3), 
       y= c(22,8,11,4,7,5) 
      ) 
mytest = rbind(mytest,c(2,3,15),c(3,3,17)) 

    plottables <- split(mytest,mytest$groupcd) 
plot(y~x,dat=plottables[[1]],type="n",xlim=range(mytest$x),ylim=range(mytest$y)) 
lapply(plottables,function(z)points(z$x, z$y)) 
lapply(plottables,function(z)lines(z$x, predict(lm(z$y ~ z$x), list(z$x)))) 

Nun nehmen wir an, ich will auch die Farben für jede Ebene der Gruppe ändern. Ich habe den Ansatz von @BenBolker vorgeschlagen versuche

xvals <- tapply(mytest$x, mytest$groupcd, function(x) return(x)) 
    yvals <- tapply(mytest$y, mytest$groupcd, function(x) return(x)) 

    plot(1:max(unlist(xvals)),ylim=(c(0,max(unlist(yvals)))),type="n") 
    mapply(points, xvals, yvals, bg=c(1:3),pch=21,type="p") 
    mapply(lines(xvals, predict(lm(yvals ~ xvals), list(xvals)), col = c(1:3))) 

aber die nicht funktionieren.

Verwandte Themen