将缺失因子水平添加到 ggplot2 热图中

Mar*_*tti 3 r heatmap ggplot2

我有一个基于 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"
Run Code Online (Sandbox Code Playgroud)

我使用以下代码来渲染一个漂亮的热图,该热图计算所有作业每代规则的数量:

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')
Run Code Online (Sandbox Code Playgroud)

所有作业的规则数量热图(按代)

所以热图表明,大多数情况下,运行对于给定的一代只有一个规则,但有时你会得到两个,在极少数情况下你会得到三个。

现在,对于给定的一代,一组完全不同的运行实际上可能具有零规则。然而,进行并排比较会有点混乱,因为一个热图的 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')

从而产生这个.

不幸的是,正如您所看到的,这个新行的颜色不正确。到达那里!

Mar*_*ius 5

如果NumRules您感兴趣的只是因子的水平,那么您只需drop=FALSE在 中指定即可解决此问题scale_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')
Run Code Online (Sandbox Code Playgroud)

结果:

显示的所有因素