web-dev-qa-db-ja.com

別のレイヤーを追加するためのggplotの条件がある場合

特定の基準が満たされた場合、1つはポイントを含み、もう1つはラインを含む2つのレイヤーを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と呼ばれるオブジェクトが式「値なし」と等しくないことです。

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:(幅= NULL、高さ= NULL)

41
joaoal

表示されているのは構文エラーです。私が考えることができる最も堅牢な方法は:

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

したがって、オブジェクトpをシーケンスで作成し、ifステートメントがTRUEを生成する場合にのみgeom_point()を追加します。

35
Paul Hiemstra

これはggplot2 2.1.0を使用して行われました。かっこをifステートメント全体を囲むように切り替えるだけで、OPが望んだことを正確に実行できると思います。

SwtichTであるか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()

enter image description here

さて、同じことですが、条件は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

37
John Paul
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

しかし、おそらくこれはあなたが本当に望んでいるものに似ていますか?

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

2
hrbrmstr

ggplot2 book に続いて、リストを返す関数を作成できます。 NULLコンポーネントは無視されます。

library(ggplot2)
library(ggplot2movies)

# 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))
}))

# create function to add points conditionally
# If the list contains any NULL elements, they’re ignored. 
my_plot <- function(point = FALSE){
    list(
        geom_line(),
        if (point) 
            geom_point()
    )

}

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

p + my_plot(point = TRUE)

reprexパッケージ (v0.3.0)によって2020-02-25に作成されました

0
sahir