2010-02-24 4 views
1

루프가있는 플롯을 생성하려고합니다.바 너비 ggplot2 geom_bar

l1<-factor(rep(letters,4)) 
n1<-abs(rnorm(104))*10000 
b1<-rep(c("1","2","3","4","5","6","7","8"),c(2,2,11,24,11,20,33,1)) 
k1<-rep((rep(c("A","B","C","D"),c(2,3,4,4))),8) 
my.df<-data.frame(l1,b1,k1,n1)       #make a dataframe 

names(my.df)<-c("letter","branch","ltrtype","number")  #factor names 
library(ggplot2) 

branch.list<-unique(my.df$branch) 
sayi<-length(branch.list)         # list of factor:letters 

for (i in 1:sayi) { 

branch.iter<-branch.list[i] 
my.df.plot<-subset(my.df,my.df$branch==branch.iter,drop=T) 

my.df.plot$branch<-factor(my.df.plot$branch)    #So that unused levels don't show up 
my.df.plot$letter<-factor(my.df.plot$letter)    #So that unused levels don't show up 
my.df.plot$ltrtype<-factor(my.df.plot$ltrtype)    #So that unused levels don't show up 
my.df.plot$number<-as.numeric(as.character(my.df.plot$number)) 
my.df.plot<-data.frame(my.df.plot) 

myfilename<-paste(branch.iter,".jpeg",sep="") 
jpeg(file=myfilename) 

cizim<-ggplot(my.df.plot,aes(letter,number,fill=ltrtype)) 
cizim<-cizim + geom_bar(width = 1, position = "fill", binwidth = 1) +  facet_grid(ltrtype~.) 
cizim<-cizim + opts(title=branch.iter) 

print(cizim) 
dev.off() 

} 

(Q1)가 때 어떻게이를 방지와 같은 모든 플롯에서 바 폭이 달라질 수 바 x 축 변화 폭의 레벨 수?

alt text http://img411.imageshack.us/i/95325388.jpg/

alt text http://img411.imageshack.us/i/91510133.jpg/

(Q2)가

: i=7 R 경고 다음 줄 때 :

(데이터 $ Ymin를 == 0)) 경고 ("잘 정의되지 채울 때 Ymin를! = 0 ") : TRUE/FALSE가 필요한 누락 값

w 모자는 내가 할 수 있니?

(Q3) : 쉽게 이러한 경우에 사용되지 않는 수준을 떨어 뜨리는 방법 그래서 난

my.df.plot$branch<-factor(my.df.plot$branch) 

매번를 사용하지 않아도이 있습니까?

답변

2

매우 이상한 음모가 있습니다. position="fill"을 사용하면 각 막대의 높이를 1로 늘리므로 (글자에 해당하는 하나의 관찰이 패널 내의 문자에 해당하는 모든 관측치의 100 %이기 때문에) 어떤 정보를 그려야하는지 완전히 잃어 버리게됩니다. 내 생각 엔이 질문에서 비롯된 몇 가지 질문이이 실수에서 비롯된 것이지만 확실하지 않습니다.

(Q1) 다른 브랜치의 막대 너비가 동일한 지 확인 하시겠습니까? x 변수의 레벨 수를 변경하기 때문에 막대를 플롯을 채우기 위해 넓게 가져와야합니다. 일부 솔루션 옵션 :

  • 그 주위에 갈 수있는 플롯의 폭 일부 스마트 크기 조정 작업을 수행합니다.
  • 은 모든 X 수준을 남겨주세요 - 나는 이것이 가장 깨끗한 방법
  • 생각 당신은 scale_x_discreteexpand 옵션을 사용하여 막대가 좁고 플롯을 중심으로 얻을 수 있습니다. 그래서 N 총 x 값 (여기서는 N = 26 글자)이 있지만 특정 플롯 만 k 개를 사용한다면 + scale_x_discrete(expand=c(0.05, (N-k)/2))을 플롯에 추가하십시오. 첫 번째 항은 곱하기 확장 요소이며, 이것이 기본값이며 두 번째 항은 가산 요소입니다.

(Q2)는 I = 7 다중에 동일한 문자/ltrgroup 조합에 대응 number 값을 갖는 유일한 그룹이다. 바 기러기는 그걸로 무엇을해야할지 모른다. 오류 메시지가 정말로 이상하다는 데 동의합니다.

(Q3) 하나의 옵션은 문자 벡터 결합시 data.frame(...,stringsAsFactors=FALSE)을 사용하고 하위 집합은 사용하지 않은 레벨을 유지하지 않습니다.

+0

예. 나는 모든 브랜치에 대해 막대 너비를 동일하게 유지하려고합니다. 일부 브랜치는 너무 많은 x 값 (일부는 하나만 있습니다)을 가지고 있기 때문에 하나의 거대한 막대에서부터 많은 작은 막대까지 얻을 수 있습니다. – mehmetselim

+0

나는 여전히 모든 플롯에 대해 동일한 x 레벨을 유지하는 것이 플롯을 비교하려는 경우 가장 좋은 방법이라고 생각하지만 '대답'을 사용하여 솔루션을 포함하도록 내 대답을 편집했습니다. – Aniko

1

(Q1) 바 너비를 고정하는 것이 가능하지 않다고 생각합니다. 모든 레벨을 유지하는 Aniko의 제안은 나에게 가장 이해가됩니다.

(Q2) 난 당신이 stat="bin" 필요하다고 생각하지 않는 한, stat="identity"으로 binwidth = 1를 교체합니다.

(Q3) 다른 옵션은 gdata -package에서 drop.levelsHmisc -package에서 dropUnusedLevels 있습니다.