3

特定の要因の発生回数をレンダリングする ggplot2 ベースのヒートマップがあります。ただし、異なるデータセットには、いくつかの要因のインスタンスがない場合があります。つまり、それぞれのヒートマップは異なって見えます。並べて比較しやすくするために、不足しているレベルを追加したいと思います。残念ながら、私は成功していません。

したがって、次のようなデータがあります。

> head(numRules)
  Job Generation NumRules
1   0          0        2
2   0          1        1
3   0          2        1
4   0          3        1
5   0          4        1
6   0          5        1
> levels(factor(numRules$NumRules))
[1] "1" "2" "3"

次のコードを使用して、すべてのジョブの世代ごとのルール数をカウントする適切なヒートマップをレンダリングします。

ggplot(subset(numRules, Generation < 21), aes(x=Generation, y=factor(NumRules))) + 
   stat_bin(aes(fill=..count..), geom="tile", binwidth=1, position="identity") + 
   ylab('Number of Rules')

全ジョブの世代別ルール数のヒートマップ

つまり、ヒート マップは、ほとんどの場合、実行には特定の世代に対して 1 つのルールしかないことを示していますが、2 つ取得することもあれば、まれに 3 つ取得することもあります。

現在、まったく異なる一連の実行では、特定の世代に対して実際にはゼロのルールがある場合があります。ただし、一方のヒート マップの y 軸のルール数は [1,3] で、もう一方のルールの数は [0,2] である可能性があるため、並べて比較すると少し混乱します。私がやりたいのは、ヒートマップを標準化して、ルールの数に関係なく、すべての因子レベルが (0,1,2,3) になるようにすることです。たとえば、上記のヒート マップを再レンダリングして、その特定のデータ フレームにそのインスタンスがない場合でも、ゼロ ルールの行を含めたいと考えています。

私はこれを、ブレークやスケールの設定などを含むさまざまな R の呪文で打ち負かしましたが、役に立ちませんでした。私の直感では、これには簡単な解決策がありますが、見つけることができません。

更新

への呼び出しでレベルを手動で指定するとfactor、ゼロ ルールの行が追加されます。

ggplot(subset(numRules, Generation < 21), aes(x=Generation, y=factor(NumRules,levels=c("0","1","2","3")))) + stat_bin(aes(fill=..count..), geom="tile", binwidth=1, position="identity") + ylab('Number of Rules')

これはこれをもたらします

残念ながら、ご覧のとおり、この新しい行は適切に色付けされていません。そこに着く!

4

2 に答える 2

5

関心のあるすべてが因子のレベルである場合は、 inNumRulesを指定するだけでこれを修正できます。drop=FALSEscale_y_discrete()

numRules = read.table(text="  Job Generation NumRules
1   0          0        2
2   0          1        1
3   0          2        1
4   0          3        1
5   0          4        1
6   0          5        1", header=TRUE)

numRules$NumRules = factor(numRules$NumRules, levels=c(1, 2, 3))

ggplot(subset(numRules, Generation < 21), aes(x=Generation, y=NumRules)) +
  scale_y_discrete(drop=FALSE) +
  stat_bin(aes(fill=..count..), geom="tile", binwidth=1, position="identity") +
  ylab('Number of Rules')

結果:

すべての要因が示されています

于 2013-03-22T06:15:05.163 に答える
1

この状況では、データを変更する方が簡単です。まず、データを読み取ります。次に、変数NumRulesを必要なすべてのレベル (0 から 3) で factor に設定します。

numRules = read.table(text="  Job Generation NumRules
1   0          0        2
2   0          1        1
3   0          2        1
4   0          3        1
5   0          4        1
6   0          5        1", header=TRUE)

numRules$NumRules = factor(numRules$NumRules, levels=c(0, 1, 2, 3))

NumRulesとの各組み合わせがGeneration関数を使用してデータに存在する回数を計算しtable()、それを何らかのオブジェクトに保存します。

tab<-table(numRules$NumRules,numRules$Generation)
tab

    0 1 2 3 4 5
  0 0 0 0 0 0 0
  1 0 1 1 1 1 1
  2 1 0 0 0 0 0
  3 0 0 0 0 0 0

melt()ライブラリの関数を使用しreshape2て、このテーブルを長い形式にし、列名を変更します

library(reshape2)
tab.long<-melt(tab)
colnames(tab.long)<-c("NumRules","Generation","Count")

実際のカウントを含む列を使用geom_tile()および設定して、新しいデータ フレームでデータをプロットします。fill=

ggplot(tab.long, aes(x=Generation, y=NumRules,fill=Count)) +
    geom_tile() +
  ylab('Number of Rules')

ここに画像の説明を入力

于 2013-03-22T06:54:08.543 に答える