2017-09-01 3 views
1

Ich versuche, ein Diagramm von zwei Funktionen (dh 2x + 1 und 3x - 0,5 * x^2) auf einem gleichen Diagramm Blatt, aber mit zwei verschiedenen Bereichen (x < = 3 bzw. x> 3). Bisher habe ich zwei Funktionen wie folgt definiert:Zeichnen eines Graphen von zwei Funktionen in R

# Define first function with given range 
Line1 <- function(x) { 
    if (x <= 3) { 
     (3*x) + 1 } else { 
    }  
} 

# Define second function with given range 
Line2 <- function(x) { 
    if (x > 3) { 
     2*x - (0.5*(x^2)) } else { 
    }   
} 

# Plot functions 
ggplot(d,aes(x=x)) + stat_function(fun=rwrap(Line1,0,3),geom="line",col="blue") 
+ stat_function(fun=rwrap(Line2,3,5),geom="line",col="red")` 

Wenn ich den Code ausführen, bekomme ich folgende Fehlermeldungen:

Error: Discrete value supplied to continuous scale In addition:

Warning messages:
1: In if (x <= 3) { : the condition has length > 1 and only the first element will be used
2: In if (x > 3) { : the condition has length > 1 and only the first element will be used

Ich habe versucht, es zu beheben, aber ich bin gerade verloren An diesem Punkt.

+0

Warum wird Ihr Code zitiert? – Gregor

+3

Das Problem ist, dass Sie Funktionen nicht vektorisiert sind. Sie arbeiten für einen einzelnen Wert von "x" gleichzeitig, aber "Line1 (0:10)" funktioniert nicht. Machen Sie es zu einer einzigen Funktion mit 'ifelse' als vektorisierte Version von' if {} else {} ':' foo = Funktion (x) ifelse (x <= 3, 3 * x + 1, 2 * x - 0.5 * x^2) '. – Gregor

+0

Entschuldigen Sie das Angebot, ich habe einen Fehler beim Kopieren und Einfügen gemacht. Ich habe deine Aussage verstanden. Wie aber würde ich die Linien mit verschiedenen Farben zeichnen? – user8550070

Antwort

0

Das Problem ist, dass Sie Funktionen nicht vektorisiert sind. Sie arbeiten für einen einzelnen Wert von x um Zeit, aber Line1(0:10) wird nicht funktionieren.

Machen Sie es eine einzige vektorisiert Funktion mit ifelse, die vektorisierte Version von if{}else{}:

foo = function(x) { 
    ifelse(x <= 3, 3 * x + 1, 2 * x - 0.5 * x^2) 
} 

Sie es brechen könnte so nach unten:

bar = function(x) 3 * x + 1 
baz = function(x) 2 * x - 0.5 * x^2 
foo = function(x) ifelse(x <= 3, bar(x), baz(x)) 

obwohl man natürlich mehr verwenden möchte aussagekräftige Namen als diese Platzhalter.

Verwandte Themen