2016-04-11 8 views
2

Ich versuche, mehrere Trendlinien mit der geom_smooth() in R zu überlagern. Ich habe derzeit diesen Code.Überlappende Trendlinien in Streudiagrammen, R

ggplot(mtcars2, aes(x=Displacement, y = Variable, color = Variable)) 
+ geom_point(aes(x=mpg, y = hp, col = "Power")) 
+ geom_point(aes(x=mpg, y = drat, col = "Drag Coef.")) 

(mtcars2 ist die normierte Form von mtcars)

Was mir diese Grafik geben. enter image description here

Ich versuche mit dem geom_smooth (method = 'lm') zwei Trendlinien für die beiden Variablen zu zeichnen. Irgendwelche Ideen?

(Bonus: Ich würde auch die ‚Form = 1‘ Paramater wie zu implementieren, um die varaibles wenn möglich zu differenzieren Die folgende Methode funktioniert nicht.)

geom_point(aes(x=mpg, y = hp, col = "Power", shape=2)) 

aktualisieren ich, dies zu tun verwaltet .

ggplot(mtcars2, aes(x=Displacement, y = Variable, color = Variable)) 
+ geom_point(aes(x=disp, y = hp, col = "Power")) 
+ geom_point(aes(x=disp, y = mpg, col = "MPG")) 
+ geom_smooth(method= 'lm',aes(x=disp, y = hp, col = "Power")) 
+ geom_smooth(method= 'lm',aes(x=disp, y = mpg, col = "MPG")) 

Es sieht so aus.

enter image description here

Aber das ist ein hässliches Stück Code. Wenn irgendjemand diesen Code hübscher aussehen lässt, wäre es großartig. Außerdem konnte ich den Parameter 'shape = 2' noch nicht implementieren.

+0

Wie funktioniert ' unterscheiden sich mtcars2 von 'mtcars'? – steveb

+0

Ich normalisierte den gesamten Datensatz. Die Frage wurde entsprechend aktualisiert. – krthkskmr

Antwort

5

Es scheint, als ob Sie Ihr Leben härter machen als es sein muss ... Sie können zusätzliche Parameter in aes() wie group und shape übergeben.

Ich weiß nicht, ob ich Ihre Normalisierung richtig verstanden habe, aber das sollte man genug geben in die richtige Richtung gehend zu erhalten:

library(ggplot2) 
library(reshape2) 

#Do some normalization 
mtcars$disp_norm <- with(mtcars, (disp - min(disp))/(max(disp) - min(disp))) 
mtcars$hp_norm <- with(mtcars, (hp - min(hp))/(max(hp) - min(hp))) 
mtcars$drat_norm <- with(mtcars, (drat - min(drat))/(max(drat) - min(drat))) 

#Melt into long form 
mtcars.m <- melt(mtcars, id.vars = "disp_norm", measure.vars = c("hp_norm", "drat_norm")) 

#plot 
ggplot(mtcars.m, aes(disp_norm, value, group = variable, colour = variable, shape = variable)) + 
    geom_point() + 
    geom_smooth(method = "lm") 

Nachgeben:

enter image description here

+0

Danke! Das hat funktioniert! Allerdings möchte ich eine Methode, bei der ich die zu verwendenden Spalten gezielt auswählen kann, ohne eine neue Tabelle zu erstellen. (Ich weiß, dass ich sehr knifflig bin, aber ich versuche, den Code zu minimieren) – krthkskmr

+0

@krthkskmr - Sie können die Funktion 'melt()' in den Aufruf von 'ggplot()' einbetten, wenn Sie möchten. Sie müssten dann die "measure.vars" entsprechend ändern. Es gibt jedoch einen Grund, warum 99% der 'ggplot'-Beispiele mit einem Aufruf von' melt() 'beginnen ... und das liegt daran, dass Sie normalerweise eine Vorverarbeitung der Daten vornehmen müssen, um sie in ein' ggplot2'-Friendly zu bekommen Format. – Chase

+0

@KRTHKSKMR - auch, Computerspeicher ist billig, schreiben übermäßig dichten Code ist nicht ... manchmal Dinge in Schritten zu lösen ist besser :) – Chase