2014-04-07 19 views
17

powiedzieć Chcę wykreślić dwie warstwy w ggplot, jedna zawierająca punkty, a druga zawierająca linie, jeśli spełnione są określone kryteria., jeśli jest inny warunek w ggplot, aby dodać dodatkową warstwę,

Kod bez kryteriów mógłby wyglądać następująco:

library("ggplot2") 

# Summarise number of movie ratings by year of movie 
mry <- do.call(rbind, by(movies, round(movies$rating), function(df) { 
    nums <- tapply(df$length, df$year, length) 
    data.frame(rating=round(df$rating[1]), year = as.numeric(names(nums)), number=as.vector(nums)) 
})) 

p <- ggplot(mry, aes(x=year, y=number, group=rating)) 

p + 
geom_point()+ 
geom_line() 

teraz warunek wykreślając punkty i nie tylko linie byłoby, że obiekt o nazwie tmp.data nie równa się wyrażenie „nie wartość".

tmp.data<-c(1,2,3) # in this case the condition is fulfilled 

# attempt to plot the two layers including the condition in the plotting function 
p+ 
    if(tmp.data[1]!="no value"){ geom_point()+} 
    geom_line() 

nie ....

Error: unexpected '}' in: 
"p+ 
if(tmp.data[1]!="no value"){ geom_point()+}" 

geom_line() geom_line:
stat_identity:
position_identity (szerokość = NULL, wysokość = NULL)

+0

Gdzie zdefiniowany 'C'? – James

+0

moje złe. Przepraszam. rozważ zmiany powyżej – joaoal

+2

Dlaczego nie po prostu zmienić kolejność: 'p + geom_line() + jeśli (tmp.data [1]! =" brak wartości ") {geom_point()}' – shadow

Odpowiedz

14

To, co widzisz, to błąd składni. Najbardziej wytrzymałe sposób mogę myśleć to:

tmp.data<-c(1,2,3) 
if(tmp.data[1]!="no value") { 
    p = p + geom_point() 
} 
p + geom_line() 

więc komponować obiekt p w sekwencji, dodając tylko geom_point() gdy if plony TRUE.

+0

thx za tę alternatywę! – joaoal

0
library(ggplot2) 

# Summarise number of movie ratings by year of movie 
mry <- do.call(rbind, by(movies, round(movies$rating), function(df) { 
    nums <- tapply(df$length, df$year, length) 
    data.frame(rating=round(df$rating[1]), year = as.numeric(names(nums)), number=as.vector(nums)) 
})) 

tmp.data<-c(1,2,3) # in this case the condition is fulfilled 

p <- ggplot(mry, aes(x=year, y=number, group=rating)) 

# this won't "loop through" the data points but it's what you asked for 
if (tmp.data[1]!="no value") { 
    p <- p + geom_point() + geom_line() 
} else { 
    p <- p + geom_line() 
} 
p 

g1

ale być może jest to bardziej jak to, co naprawdę chcesz?

mry$rating <- factor(mry$rating) 
p <- ggplot(mry, aes(x=year, y=number, group=rating)) 
p <- p + geom_line() 
p <- p + geom_point(data=mry[!(mry$rating %in% tmp.data),], 
        aes(x=year, y=number, group=rating, color=rating), size=2) 
p <- p + scale_color_brewer() 
p 

g2

11

Dokonano tego za pomocą ggplot2 2.1.0. Myślę, że możesz zrobić dokładnie to, co OP chciał, po prostu przełączając nawias tak, aby obejmował całą instrukcję if.

Oto przykład dodawania linii poziomej w zależności od tego, czy Swtich jest T lub F. Po pierwsze, gdzie warunek jest TRUE

library(ggplot2) 

df<-data.frame(x=1:10,y=11:20) 
Switch=T 

ggplot(df,aes(x,y))+ 
{if(Switch)geom_hline(yintercept=15)}+ 
    geom_point() 

enter image description here

Teraz to samo ale warunek jest FALSE

df<-data.frame(x=1:10,y=11:20) 
Switch=F 

ggplot(df,aes(x,y))+ 
{if(Switch)geom_hline(yintercept=15)}+ 
    geom_point() 

enter image description here

+0

wydaje się, że nie możesz użyć '+' wewnątrz '{', więc jeśli chcesz warunkowo dodać wiele rzeczy do ggplot, uważam, że musisz dodać inne wyrażenie' if' (w swoim własnym '{') dla każdego obiektu dodawanego do wątku. – filups21

Powiązane problemy