向ggplot2热力图添加缺失的因子水平

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')

所有工作的按代数计算规则数量的热力图

因此,热力图表示大多数情况下,每一代运行只有一个规则,但有时会出现两个规则,极少数情况下会出现三个。

另外,完全不同的一组运行可能实际上在某一代中没有任何规则。然而,进行并排比较可能会有点混乱,因为一个热力图的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')

它会产生 这个

不幸的是,正如您所见,新行的颜色没有正确地呈现。到达那里!

2个回答

5
如果你感兴趣的所有NumRules都是因素的级别,那么你可以通过在scale_y_discrete()中指定drop=FALSE来解决这个问题。
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')

结果:

显示所有因素


不幸的是,Marius,级别“3”的“规则数量”整行也应该是深蓝色而不是透明的。这基本上就是我现在的情况。 - Mark Coletti

1
在这种情况下,更改您的数据会更容易。首先,阅读您的数据。然后将变量NumRules设置为具有所有必要级别(从0到3)的因子。
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))

现在使用函数 table() 计算您的数据中每个 NumRulesGeneration 组合出现的次数,并将其保存到某个对象中。
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

使用reshape2库中的melt()函数将此表格转换为长格式并更改列名称。
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')

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接