2012-05-24 8 views
0

현명한 질문 : geom_linerange() 사용에 대한 질문이 있습니다. 첨부 된 내용은 내 문제를 설명 할 수있는 유용한 예제입니다.ggplot2- geom_linerange with stat_smooth

b=c(100,110,90,100,120,130,170,150,150,120,140,150,120,90,90,100,40,50,40,40,20,60,30) 
test<-data.frame(a=c(2,2,2,4,4,4,4,6,6,6,6,6,6,8,8,8,10,10,10,10,10,10,10), 
       b=b,c=c(b-15)) 

testMelt <- melt(
    test, 
    id  = c("a"), 
    measured = c("b", "c") 
) 


p <- ggplot(
    aes(
    x = factor(a), 
    y = value, 
    fill= variable 
    ),  
    data = testMelt) + 
    geom_boxplot() + 
      stat_smooth(aes(group=variable,x=factor(a),y=value,fill=factor(variable)),data=testMelt) 

실제 데이터 세트는 훨씬 더 커 보이며 박스 플롯은 약간 압도적입니다. 내가 원하는 것은 geom_linerange()를 "a"의 각 값에서 "b"와 "c"의 데이터 범위를 표시하는 것입니다.

내가 가지고 올 것 중에 최고입니다

p<- p+ geom_linerange(aes(as.factor(a),ymin=min(value),ymax=value,color=variable)) 

나는 "C"값은 항상 "B"보다 작거나 있다고 가정 할 수 있지만, 범위는이 "커버 작은 경우 그것 위로 ". 어떻게해서 든 지터를 지터 수 있습니까? 더 나은 해결책이 있습니까?

답변

1

나의 이해는 당신이 라인의 범위는 조합 a:b:c의 범위를 반영 할 것입니다.

geom_linerange(aes(as.factor(a),ymin=min(value),ymax=value,color=variable))은 전체 데이터 세트의 최소 (따라서 모든 라인이 동일한 최소 값을 표시하기위한 최소 값을 설정합니다.

솔루션의 몇.

를 최소값을 계산하고 자신에게

를 최대
test_range <- ddply(testMelt, .(a,variable), summarize, 
        val_min = min(value), val_max = max(value)) 

는 실행

ggplot(data = testMelt) + 
    geom_boxplot(aes(x = factor(a), y = value, fill = variable)) + 
    stat_smooth(aes(group = variable, x = factor(a), y = value, 
        fill = factor(variable))) + 
    geom_linerange(data = test_range, aes(x = as.factor(a), ymin = val_min, 
        ymax = val_max, color = variable), 
        position = position_dodge(width = 0.3)) 

또는 boxplots/line range 대신 바이올린 플롯을 사용하십시오.

ggplot(data = testMelt) + 
    geom_violin(aes(x = factor(a), y = value, fill = variable)) + 
    stat_smooth(aes(group = variable, x = factor(a), y = value, 
        fill = factor(variable))) 
2

geom_linerange 호출에서 추가 인수 position=position_dodge(width=0.3)을 추가하십시오. 절대 너비를 조정하여 세로선 사이의 간격을 변경할 수 있습니다. 질문의

enter image description here

+0

제안을 주셔서 감사합니다. 질문에 완전히 답변하지는 않지만 나중에 유용하게 사용할 수 있습니다. – Nan