【问题标题】:Overlaying multiple geom_tile plots in ggplot2在ggplot2中覆盖多个geom_tile图
【发布时间】:2013-01-24 01:36:52
【问题描述】:

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

我想创建一个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,其中的平衡是两种或多种策略的稳定平衡。

【问题讨论】:

  • 假设你有四种颜色:红色、蓝色、绿色和紫色。如何区分红色和蓝色的组合与紫色?
  • @sebastian-c,我同意这是这种方法的一个主要问题:必须将 5 维向量投影到 3d 颜色空间上。此外,连续的 3d 色彩空间不具有良好的感知质量。这样的数字可能看起来很混乱或混乱(取决于数据......)
  • @bdemarest - 对于这个示例数据集,你是完全正确的。但在实际数据中,有大块纯色,它们之间有重叠区域,所以很清楚发生了什么。我只是不知道如何链接到我在这个网站上的数据,并且重现它的代码需要几个小时才能运行,所以我认为使用随机数来证明概念会很好。

标签: r ggplot2 heatmap


【解决方案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())

我在考虑,对于 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()

如果将红色、绿色或蓝色中的一种设置为 0,则可以使用 2 种颜色。

【讨论】:

  • 嗨 Sebastian,非常感谢您的帮助(很抱歉搞砸了随机数矩阵 - 现在已修复)。我喜欢您的第一个解决方案的外观,但运行它会给我错误“错误:setting 美学时,它们可能只取一个值。问题:alpha”。另外,在我的实际数据中,大多数正方形至少有 3 个零,所以通常只有一两种颜色重叠,不会像随机数示例中那样难以解释。
  • @lukeholman 您是否将其放在aes 电话中?我没有。您使用的是最新的 ggplot2 (0.9.3) 吗?
  • 解决了!我想在上次更新中改变了一些非常基本的东西。再次感谢您的帮助,当我有有用的东西时,我会玩弄这个数字并回复。
猜你喜欢
  • 2011-03-23
  • 1970-01-01
  • 1970-01-01
  • 2011-10-20
  • 2020-09-30
  • 2014-03-01
  • 1970-01-01
  • 2022-07-04
  • 2014-07-27
相关资源
最近更新 更多