4

ggplotファセットパネルの回帰直線の傾きをそのパネルの背景色にリンクする「直接的な」方法があるかどうか疑問に思っていました(つまり、大きなグリッドで負の傾きから正の傾きを視覚的に分離する)。

GGplots に回帰直線を追加する方法を理解しています

以前にこの情報を元のデータフレームに追加したことがある場合は、背景を変更する方法も理解しています - facet_gridでパネルの背景を条件付きで変更しますか? で説明されているように

ただし、たとえば回帰を個別に実行し、元のデータフレームにバインドしてから、これを geom_rect() の変数として使用することなく、「geom_rect」式でこれを行う方法はありますか? geom_rect() が stat_smooth() からの情報を使用する方法はありますか?

ウーター

前の質問からの単純な回帰直線プロットの良い例:

library(ggplot2)
x <- rnorm(100)
y <-  + .7*x + rnorm(100)
f1 <- as.factor(c(rep("A",50),rep("B",50)))
f2 <- as.factor(rep(c(rep("C",25),rep("D",25)),2))
df <- data.frame(cbind(x,y))
df$f1 <- f1
df$f2 <- f2

ggplot(df,aes(x=x,y=y))+geom_point()+facet_grid(f1~f2)+stat_smooth(method="lm",se=FALSE)
4

1 に答える 1

4

これは正確な解決策ではありませんが、回避策です。でも出来はよかったみたいです。リンクした両方の投稿には、ソリューションの各部分がありました。ここでの James のソリューションは、 から適合値を抽出する方法を示していますstat_smoothここでのジョランのソリューションgeom_rectは、背景を塗りつぶすために使用する方法を示しています。

# generating data: Usage of set.seed for reproducibility 
# also I changed the multiplication constant to 0.1 to have 
# at least one negative slope.

require(ggplot2)
set.seed(12)
x <- rnorm(100)
y <-  + .1*x + rnorm(100)
f1 <- as.factor(c(rep("A",50),rep("B",50)))
f2 <- as.factor(rep(c(rep("C",25),rep("D",25)),2))
df <- data.frame(cbind(x,y))
df$f1 <- f1
df$f2 <- f2

# first generate your plot in this manner and run it
# from James' post, the part outfit=fit<<-..y.. will store 
# the output of fitted values in "fit"

g <- ggplot(df,aes(x=x,y=y)) + geom_point()+facet_grid(f1~f2) 
g <- g + stat_smooth(aes(outfit=fit<<-..y..), method="lm",se=FALSE)
# now run g to generate "fit"
g

# now extract the slope for each facet and 
# construct the data.frame for geom_rect (as per Joran's post)
# Edit: Just to add more info about "fit". By default it contains
# 80 values per facet. Hence the 80*4 = 320

slopes <- fit[seq(2, 320, by = 80)] - fit[seq(1, 320, by = 80)]
tp <- unique(df[, c('f1', 'f2')])
tp <- transform(tp, slopes=slopes, x=1, y=1)
tp$pos_neg <- ifelse(slopes > 0, 1, 0)
tp$pos_neg <- factor(tp$pos_neg)

# now plot again (but with geom_rect)
g <- ggplot(df,aes(x=x,y=y)) 
g <- g + geom_rect(data = tp, aes(fill = pos_neg), xmin = -Inf, xmax = Inf, ymin = -Inf, ymax = Inf, alpha = 0.5) 
g <- g + geom_point() + facet_grid(f1~f2) + stat_smooth(method = "lm",se = FALSE)
g

出力は次のようになりこれます。ただし、これがあなたの期待どおりかどうかはわかりません..厳密に言えば、適合値を2回計算しますが、両方とも で暗黙的に計算しstat_smoothます。私が言ったように、それは単なる回避策です。

于 2012-12-27T23:03:04.520 に答える