If else условие в ggplot для добавления дополнительного слоя
say Я хочу построить два слоя в ggplot, один из которых содержит точки, а другой - строки, если выполняется определенный критерий.
Код без критериев может выглядеть так:
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()
теперь условие для построения точек, а не только строк будет, что объект с именем tmp.data не равен выражению "no value".
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()
не удается....
Error: unexpected '}' in:
"p+
if(tmp.data[1]!="no value"){ geom_point()+}"
geom_line() geom_line:
stat_identity:
position_identity: (width = NULL, height = NULL)
Ответы
Ответ 1
То, что вы видите, является синтаксической ошибкой. Самый надежный способ, о котором я могу думать, - это:
tmp.data<-c(1,2,3)
if(tmp.data[1]!="no value") {
p = p + geom_point()
}
p + geom_line()
Итак, вы составляете объект p
в последовательности, добавляя geom_point()
, когда инструкции if дают TRUE
.
Ответ 2
Это было сделано с использованием ggplot2 2.1.0. Я думаю, вы можете сделать именно то, чего пожелал OP, просто переключив круглую скобку, чтобы они охватывали весь оператор if
.
Вот пример, который добавляет горизонтальную линию в зависимости от того, если Swtich
- T
или F
. Во-первых, где условие 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()
![введите описание изображения здесь]()
Теперь то же самое, но условие 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()
![введите описание изображения здесь]()
Ответ 3
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 what you asked for
if (tmp.data[1]!="no value") {
p <- p + geom_point() + geom_line()
} else {
p <- p + geom_line()
}
p
![g1]()
но, возможно, это больше похоже на то, что вы действительно хотите?
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]()