library(ggplot2)
orderX <- c("A" = 1, "B" = 2, "C" = 3)
y <- rnorm(20)
x <- as.character(1:20)
group <- c(rep("A", 5), rep("B", 7), rep("C", 5), rep("A", 3))
df <- data.frame(x, y, group)
df$lvls <- as.numeric(orderX[df$group])
ggplot(data = df, aes(x=reorder(df$x, df$lvls), y=y)) +
geom_point(aes(colour = group)) +
geom_line(stat = "hline", yintercept = "mean", aes(colour = group))
次のようなグラフを作成したいと思います。
これは、Xの値を並べ替える必要がない場合には機能しますが、reorderを使用すると機能しなくなります。
Ggplot2 2.x以降、このアプローチは残念ながら壊れています。
次のコードは、いくつかの追加の計算を前もって行って、まさに私が欲しかったものを提供します。
library(ggplot2)
library(data.table)
orderX <- c("A" = 1, "B" = 2, "C" = 3)
y <- rnorm(20)
x <- as.character(1:20)
group <- c(rep("A", 5), rep("B", 7), rep("C", 5), rep("A", 3))
dt <- data.table(x, y, group)
dt[, lvls := as.numeric(orderX[group])]
dt[, average := mean(y), by = group]
dt[, x := reorder(x, lvls)]
dt[, xbegin := names(which(attr(dt$x, "scores") == unique(lvls)))[1], by = group]
dt[, xend := names(which(attr(dt$x, "scores") == unique(lvls)))[length(x)], by = group]
ggplot(data = dt, aes(x=x, y=y)) +
geom_point(aes(colour = group)) +
facet_grid(.~group,space="free",scales="free_x") +
geom_segment(aes(x = xbegin, xend = xend, y = average, yend = average, group = group, colour = group))
結果の画像:
あなたの質問から、私はこれをしませんdf$x
は、特にデータを並べ替えることができる場合は、データにまったく関連しています。 group
をxとして使用し、実際のx位置をjitter
を使用して点を分離するのはどうですか。
ggplot(data=df, aes(x=group,y=y,color=group)) + geom_point() +
geom_jitter(position = position_jitter(width = 0.4)) +
geom_errorbar(stat = "hline", yintercept = "mean",
width=0.8,aes(ymax=..y..,ymin=..y..))
Hlineは複雑なので、h_lineの代わりにerrorbarを使用しました(そしてymaxとyminをyに縮小しました)。誰かがその部分に対してより良い解決策を持っているなら、私は見てみたいです。
更新
Xの順序を維持したい場合は、この解決策を試してください(変更されたXを使用)
df$x = factor(df$x)
ggplot(data = df, aes(x, y, group=group)) +
facet_grid(.~group,space="free",scales="free_x") +
geom_point() +
geom_line(stat = "hline", yintercept = "mean")