在ggplot2中叠加多个geom_tile图

时间:2013-01-24 01:36:52

标签: r ggplot2 heatmap

我的第一个问题,希望它的措辞正确。我找不到任何东西,所以我会咬紧牙关。

我想创建一个geom_tile图,其中对于xy的每个组合,我有z的5个变量,它们总和为1 。我希望每个x-y组合的正方形颜色能够反映哪个z数字最大。例如,假设我有5个z变量abcde。如果a=1b=c=d=e=0,则方格为蓝色,b=1a=c=d=e=0为红色等。如果a=b=0.5且其他为零,它将是一种插值颜色(即紫色)。也许更好,一个红色和蓝色的交叉线,但我不知道ggplot是否可以这样做。

我不确定如何最好地继续前进。我想过将5个geom_tile图绘制在彼此的顶部,其中每个图是不同的颜色,并且alpha由例如缩放。 a的值(因此,a = 0时单元格是透明的,a = 1时单元格是强烈着色的)。可能还有一种方法可以使用颜色渐变,但我也在那里画了一个空白。

如果有人能够看到如何做到这一点,我会非常感激。这是一个随机数的数据集,其格式与我的实际数据相同。

rand <- matrix(runif(50*50*5), ncol=5, nrow=50*50)
rand <- rand / apply(rand, 1, sum) # Make sure the numbers sum to one in each row
d <- data.frame(a = rand[,1],
                b = rand[,2],
                c = rand[,3],
                d = rand[,4],
                e = rand[,5],
                expand.grid(x = 1:50, y = 1:50))

更新:通过使用sebastian-c和我自己的数据集的第一个答案,我能够制作这个数字。我使用包RColorBrewer中的函数brewer.pal(5,“Spectral”)获得了颜色。需要一个自定义传奇,但除此之外我对它非常满意。纯色显示纯粹的“进化稳定策略”(ESS;即不能被突变策略打败的策略)。重叠颜色区域显示混合ESS,其中均衡是两种或更多策略的稳定平衡。

Overlapped geom_tile plots ESS

1 个答案:

答案 0 :(得分:1)

我冒昧地将你的例子简化为3列。老实说,我不认为这适用于任何超过2,但这是我如何去做。我也滥用了alpha通道,所以如果你按照不同的顺序放下瓷砖,颜色就会改变。希望这可以作为其他人的起点。首先,我们将生成数据:

set.seed(100)

rand <- matrix(runif(100*3), ncol=3, nrow=100)
rand <- rand / apply(rand, 1, sum) # Make sure the numbers sum to one in each row
d <- data.frame(a = rand[,1],
                b = rand[,2],
                c = rand[,3],
                expand.grid(x=1:10, y=1:10))

现在的情节:

ggplot(d, aes(x=x, y=y))+
  theme_bw() + #For a clearer background
  geom_tile(alpha=d$a, fill="red")+
  geom_tile(alpha=d$b, fill="blue")+
  geom_tile(alpha=d$c, fill="green")+
  theme(panel.grid.major=element_blank())

enter image description here

对于3列,我正在考虑使用红色,绿色和蓝色的数量,但这对于任何超过3列的内容都不起作用。

编辑:最多3列的特定解决方案(我混合了蓝色和绿色):

d2 <- data.frame(col=rgb(rand), expand.grid(x=1:10, y=1:10))

ggplot(d2, aes(x=x, y=y)) +
  theme_bw()+
  geom_tile(aes(fill=col))+
  scale_fill_identity()

enter image description here

如果将红色,绿色或蓝色中的一个设置为0,则可以使用2种颜色执行此操作。