2017-03-10 1 views
9

오류 막대가있는 선과 점 그래프를 만들려고합니다. 다른 요소가 있지만 일부 요소에는 하나의 값만 있습니다. position_dodge를 사용하면 단일 값 요소 중 하나에 그래프의 다른 오류 막대와 비교할 때 훨씬 넓은 오류 막대가 있음을 알았습니다. 어떻게 든 position_dodge는 오류 막대의 너비에 영향을 미칩니다. 전에도 같은 문제가있는 사람을 찾지 못했습니다. 그래서 누군가가 나를 도울 수 있기를 바랍니다.ggplot2 position_dodge가 오류 막대 너비에 영향을줍니다.

더미 데이터 - position_dodge없이

require(ggplot2) 

x <- c(1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,3,3,5) 
y <- c(3,5,6,3,5,3,5,6,2,6,3,7,3,6,2,1,5,8,7) 
se <- x*0.2 
treatment <- c("A", "B","C", "D","A", "B","C", "D","A", "B","C", "D","A", "B","C", "D","E", "F", "G") 
data <- data.frame(x, y, se ,treatment) 
data$treatment <- as.factor(data$treatment) 

우선 플롯 모든

# Without position dodge 
myplot <- ggplot(data, aes(x=x, y=y, group= treatment, fill = treatment, colour = treatment)) + 
    geom_line(stat="identity", size = 1) + 
    geom_point(stat="identity", size = 3, shape = 21) + 
    geom_errorbar(aes(ymin = y-se, ymax = y+se), width = 0.2) 

myplot 

plot without position_dodge

지금 위치와 플롯 피하 미세이다

# With position dodge 
myplot <- ggplot(data, aes(x=x, y=y, group= treatment, fill = treatment, colour = treatment)) + 
    geom_line(stat="identity", size = 1, position=position_dodge(width=0.2)) + 
    geom_point(stat="identity", size = 3, shape = 21, position=position_dodge(width=0.2)) + 
    geom_errorbar(aes(ymin = y-se, ymax = y+se), width = 0.2, position=position_dodge(width=0.2)) 

myplot 

Plot with position_dodge

오른쪽에서 보이는 바와 같이 오류 막대는 다른 오류 막대와 비교할 때 훨씬 더 큰 너비를 가지고 있습니다. 이것은 아마도이 점에 대해 겹치는 x 변수가없고 오류 막대가 정상 크기를 가질 수 있기 때문일 것입니다. 나는 여전히 같은 너비로 오류 막대를 가져올 수있는 방법을 알고 싶습니다.

+0

아마 관련 문제 : https://github.com/tidyverse/ggplot2/issues/1068 두 번째 그래프를 보면 – zx8754

+0

그래 아마, 포인트는 X = 3에서도 있습니다 작은 오차 막대. 오류 막대의 너비는 그룹 수에 의해 결정되기 때문일 수 있습니다. – Marinka

+0

예, 공간은 점의 수로 공유되며 수평선은 더 짧아집니다. 해결책은 수동 피하를 도입하는 것입니다. 예를 들어 'x = 1'은 4 점, 'x = c (1, 1.02, 1.04, 1.06)'는 피할 수있는 옵션을 제거하십시오. – zx8754

답변

4

,이에 대한 수정은 x와 점의 수에 오차 막대의 폭을 확장하는 것입니다. 그러나이 작업은 수동으로 수행 할 필요가 없습니다. 아래에서 dplyr을 사용하여 data.frame에 새로운 열을 작성합니다. 그 수는 x입니다. 여기에 어느 것도 없기 때문에 groupfill 매핑을 제거했습니다 (단, 모양이 fill이 아닌 colour으로 채워진 채워진 원 버전으로 변경된 경우). 마지막으로, 반복을 피하기 위해 position을 한 번 정의한 다음 각 geom에 대해 변수를 사용했습니다.

library(dplyr) 
data <- data %>% 
    group_by(x) %>% 
    mutate(
    width = 0.1 * n() 
) 

pos <- position_dodge(width = 0.2) 
myplot <- 
    ggplot(data, 
     aes(
      x = x, 
      y = y, 
      colour = treatment, 
      width = width 
     )) + 
    geom_line(size = 1, position = pos) + 
    geom_point(size = 3, shape = 16, position = pos) + 
    geom_errorbar(aes(ymin = y - se, ymax = y + se), position = pos) 

myplot 

Final image

+0

답변 주셔서 감사합니다. 문제가 해결되었습니다. – Marinka

1

과거에 사용했던 다소 어색한 작업은 width 안에 aes을 사용하여 각 오류 막대의 너비를 수동으로 설정하는 것입니다. 각 그룹 내의 값의 수는 각 오류 막대의 크기를 조정하는 정도를 알려줍니다.

예를 들어 단일 값 그룹과 3 값 그룹이있는 경우 3 width 그룹은 1 width 그룹보다 3 배 커야합니다.

1의 그룹, 6의 그룹 및 3 개의 그룹이있는 경우 사례가 훨씬 복잡합니다. 단일 그룹의 바람직한 너비를 파악하여 시작할 수 있습니다. 나는 .1을 선택했다. 따라서 6 그룹은 .6이고 4 그룹은 .4이어야합니다.

그러면 트릭은 너비를 가져 오는 선이 그려지는 순서를 알아내는 것입니다. 이것은 단순한 상황에서 더 쉽습니다.

플롯 코드 : @aosmith에서 알 수 있듯이

ggplot(data, aes(x = x, y = y, group = treatment, fill = treatment, colour = treatment)) + 
    geom_line(stat = "identity", size = 1, position = position_dodge(width = 0.2)) + 
    geom_point(stat = "identity", size = 3, shape = 21, position = position_dodge(width = 0.2)) + 
    geom_errorbar(aes(ymin = y-se, ymax = y+se, 
        width = c(rep(.4, 8), rep(.6, 4), rep(.4, 4), .6, .6, .1)), 
       position = position_dodge(width = 0.2)) 

enter image description here

+0

답변을 주셔서 감사합니다. 자동 응답 솔루션을 제공 한 Nick Kennedy의 답변을 수락했습니다. – Marinka

관련 문제