1

ループでプロットを作成しようとしています。

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 軸のレベル数が変化すると、バーの幅が変化します。これを防ぎ、すべてのプロットのバーの幅を同じにするにはどうすればよいですか?

代替テキスト http://img411.imageshack.us/i/95325388.jpg/

代替テキスト http://img411.imageshack.us/i/91510133.jpg/

(Q2): i=7R が次の警告を出す場合:

(data$ymin == 0)) warning("Filling not well defined when ymin != 0") : TRUE/FALSE が必要な場所に値がありません

私はそれについて何ができますか?

(Q3): このような場合、使用しなくても済むように、未使用のレベルをドロップする簡単な方法はありますか?

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

毎回?

4

2 に答える 2

2

あなたはいくつかの非常に奇妙なプロットを作成しています。を使用position="fill"すると、各バーが高さ 1 になるように引き伸ばされ (文字に対応する 1 つの観測値は、パネル内の文字に対応するすべての観測値の 100% になるため)、プロットしようとしている情報が完全に失われます。あなたの質問のいくつかはこの間違いから生じていると思いますが、よくわかりません。

(Q1) 異なる枝のプロットでバーの幅を同じにしますか? x 変数のレベル数を変更しているため、バーを広げてプロットを埋める必要があります。いくつかのソリューション オプション:

  • それを回避するには、プロットの幅のスマートなサイズ変更を行います。
  • すべての x レベルをそのままにしておきます - これが最もクリーンな方法だと思います
  • expandのオプションを使用して、バーをより狭くし、プロットの中央に配置できますscale_x_discrete。したがって、合計 N 個の x 値 (ここでは N=26 文字) があるが、特定のプロットでそれらのうちの k 個しか使用されない場合は+ scale_x_discrete(expand=c(0.05, (N-k)/2))、プロットに追加します。第 1 項は乗算拡張係数で、これがデフォルト値で、第 2 項は加算係数です。

(Q2) i=7 はnumber、同じ文字/文字グループの組み合わせに対応する複数の値を持つ唯一のグループです。バーgeomはそれをどうするかわかりません。エラーメッセージが本当にわかりにくいことに同意します。

(Q3) 1 つのオプションは、因子の使用を避けるdata.frame(...,stringsAsFactors=FALSE)ことです。文字ベクトルを結合するときに使用すると、サブセット化によって未使用のレベルが保持されなくなります。

于 2010-02-24T20:27:47.270 に答える
1

(Q1) バーの幅を固定することはできないと思います。すべてのレベルを維持するという Aniko の提案は、私にとって最も理にかなっています。

(Q2)は必要ないと思うので、 に置き換えbinwidth = 1てください。stat="identity"stat="bin"

(Q3) その他のオプションにdrop.levelsgdata-package と -package がありdropUnusedLevelsますHmisc

于 2010-02-24T21:08:27.970 に答える