2010-11-22 4 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를 잘못된 x로 표시합니다! –

+0

X가 인덱스가 아닌 것을 의미하지 않는 한, 플롯에서 사용하지 마십시오 (지터를 사용 하시겠습니까?) –

+0

그렇다면 재주문을 잘못 사용한 것입니다. 내 실제 데이터에서 x 값은 각각의 개별 측정 값에 대한 레이블이며,보고 싶은 값입니다. 그룹 내에서 이러한 레이블의 순서는 중요하지 않습니다. – wligtenberg

답변

3

으로을 (수정 X 포함)이 솔루션을, X의 순서를 유지하려고 할 경우 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로 groupjitter 실제 x 위치를 사용하는 방법에 대한 : 나는 errorbar 대신 h_line을 사용 (그리고 Ymax와 붕괴와 y에 Ymin를) 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..)) 

. 누군가가 그 부분에 더 나은 해결책을 가지고 있다면, 나는보고 싶다.


alt text 갱신

당신이

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")에 대한 설명서는 어디에서 찾을 수 있습니까? 정말 멋지 며 전에는 보지 못했습니다. –