2016-11-06 6 views
1

R에 익숙하지 않아 ggplot2 및 coord_flip()을 사용하여 매우 간단한 수평 막대 그림을 생성했습니다. ,ggplot2 막대 그림 : 막대 및 레이블 크기에 따라 달라집니다.

geom_text(aes(x=TYPE, y=COUNT, ymax=COUNT, label=COUNT, 
      hjust=ifelse(COUNT>1000, 1.5, -0.3)), 
      size=3.5, position = position_dodge(width=0.8)) 

문제가 있다는 것입니다 : 다음 명령을 사용하여 는 특히, 나는 기본적으로 막대 왼쪽에있는 변수 x의 값을 삽입 (또는 오른쪽에있는 레이블이 맞지 않을 경우) 데이터 세트에 따라 x 값이 크게 달라질 수 있습니다 (예 : dataset_1 x 값은 1에서 200 사이, dataset_2 x 값은 10,000에서 100,000 사이가 될 수 있음 ...). 그러면 가장 짧은 막대의 레이블이 내가 사용하고있는 ifelse 문과 잘못 배치되었습니다 (아래 그림 A의 갈색 막대 참조). 이 경우 모든 데이터 세트에 일정한 COUNT>1000 조건을 사용할 수 없습니다.

그림 A :

enter image description here

내가 수동으로 각 데이터 세트에 대한 hjust=ifelse(COUNT>1000,... 문장의 값을 수정할 수 있습니다. 그러나 아래 그림 B와 같이 각 데이터 집합에 대해 ifelse 조건의 값을 수정하지 않고 축과 막대 사이에 맞지 않으면 자동으로 막대의 레이블을 이동시킬 수 있는지 궁금합니다.

그림 B :

enter image description here

편집

해결 방법 (완전하지만 좋은 것은 아닙니다) : 값이 최대 5 % 미만이면 바의 오른쪽에 레이블을 배치 값

MAXI <- max(data[,2]) 
geom_text(aes(x=TYPE, y=COUNT, ymax=COUNT, label=COUNT, 
      hjust=ifelse((COUNT/MAXI)<0.05, -0.3, 1.3))) 
+0

아니, 아니다. – Gregor

답변

0

막대 외부에 일부 레이블이 있고 일부 내부 문자가 표시의 시각적 인코딩을 왜곡시킬 수 있습니다. 막대의 길이로 nitude. 또 다른 옵션은 막대 가운데에 값을 넣는 것이지만 geom_text을 설정하면 최대 막대에 비해 상대적으로 작은 값을 건너 뛸 수 있습니다. 또는 추가 된 모든 막대 값에 텍스트를 포함하려면 막대 길이에 대해 깨끗한 시각적 패턴을 유지하기 위해 막대 아래에 텍스트를 넣을 수 있습니다. 두 옵션의 예는 다음과 같습니다 :

# Fake data 
dat = data.frame(x = LETTERS[1:5], y=c(432, 1349, 10819, 5489, 12123)) 

ggplot(dat, aes(x, y, fill=x)) + 
    geom_bar(stat="identity") + 
    geom_text(aes(label=ifelse(y < 0.05*max(dat$y), "", format(y, big.mark=",")), y=0.5*y), 
      colour="white") + 
    coord_flip(xlim=c(0.4,5.6), ylim=c(0, 1.03*max(dat$y)), expand=FALSE) + 
    guides(fill=FALSE) 

ggplot(dat, aes(x, y, fill=x)) + 
    geom_hline(yintercept=0, lwd=0.3, colour="grey40") + 
    geom_bar(stat="identity") + 
    geom_text(aes(label=format(y, big.mark=","), y=-0.01*max(dat$y)), 
      size=3.5, hjust=1) + 
    coord_flip(ylim = c(-0.04*max(dat$y), max(dat$y))) + 
    guides(fill=FALSE) 

enter image description here

+0

감사! 귀하의 전략은 가능한 가장 깨끗한 자동 방법 인 것 같습니다. – user31888

관련 문제