2010-11-22 45 views
19
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)) 

あたりの平均のための行を追加します。 graph with averages for each groupggplot2:私はこのようなグラフを作成したいグループ

このない仕事、私は私が行うとき、ただし、Xの値を並べ替える必要がない場合再注文を使用すると、もう動作しません。

+0

私は再注文のご使用はここに間違っていると思いますが、以来、グループやYではなく、Xを並べ替えます。これは間違ったxを間違ったyでプロットします! –

+0

Xがインデックス以外の意味を持たない限り、プロットでは使用しないでください(代わりにジッターを使用しますか?) –

+0

次に、並べ替えを誤解しています。私の実際のデータでは、xの値は個々の測定値のラベルです。私はそれを見たいと思っています。グループ内のこれらのラベルの順序は関係ありません。 – wligtenberg

答えて

3

として、 gのgplot2 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)) 

結果の画像:

enter image description here

+3

私はあなたの正確な状況で役立つかどうかは分かりませんが、同様の問題のためにggplot2 v2.1.0で見つかった新しい解決策は 'stat_summary(fun.y =" mean "、fun.ymin =" mean "、fun.ymax =" mean "、size = 0.3、geom =" crossbar " ) '。 –

+0

私はそれを試しました、それはx軸上の項目ごとに水平線を作成します。その理由は、x軸は離散的であるということです。 – wligtenberg

16

あなたの質問から、私はこれは特にありませんdf$xあなたのデータには、特にあなたがそれを注文することができます関連していません。方法だけXとしてgroupを使用して、そしてポイントを分離するjitter実際のx位置について:HLINEが複雑であるため

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..)) 

I代わりh_lineのエラーバー(およびYにYMAXとYMINを崩壊)を使用しています。誰かがその部分に対するより良い解決策を持っているなら、私は見たいと思う。

alt text


更新

あなたは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") 

alt text

+0

これは確かに私が欲しいものですが、私は元のx値をxスケールで見ることができるようにしたいと考えています。 – wligtenberg

+0

上記の順序を変更すると、データが混在します。 x値だけでなく元のデータフレームをソートする必要があります。 x値をグラフに挿入しますか?もしそうなら、どこに平均値を入れたいのですか? –

+0

geom_line(stat = "hline"、yintercept = "mean")に関するドキュメントはどこにありますか?それは本当にクールで、私はそれを以前見たことがありません。 –