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

这产生了这个

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

4

2 回答 2

5

如果NumRules您感兴趣的只是因素的水平,那么您可以通过仅指定drop=FALSEin来解决此问题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')

结果:

显示的所有因素

于 2013-03-22T06:15:05.163 回答
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))

现在计算 和 的每个组合出现在您的数据中的次数NumRulesGeneration并将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 回答