r - 在 ggplot2 中使用 facet_grid 进行成对值(热图)可视化

标签 r ggplot2 data-visualization heatmap facet

我有包含 10 个样本的成对数值数据的数据:

data = dget(url("https://git.io/vCTpG"))

数据如下所示:
sampleB  sampleA  ol   labelA  labelB  facetA  facetB
2409     2409     100  2409|B  2409|B  B       B
2409     2413     0    2413|A  2409|B  A       B
2409     2414     0    2414|A  2409|B  A       B
2409     2417     0    2417|C  2409|B  C       B
2409     2411     0    2411|A  2409|B  A       B
2409     2418     0    2418|B  2409|B  B       B
2409     2416     0    2416|C  2409|B  C       B
2409     2412     4    2412|B  2409|B  B       B
2409     2415     0    2415|C  2409|B  C       B
2409     2410     19   2410|A  2409|B  A       B
...      ...      ...  ...     ...     ...     ...

我想形象化 ol热图中的值:
library(ggplot2)
ggplot(data = data, mapping = aes(x=labelA, y=labelB)) + 
  geom_tile(mapping = aes(fill=ol)) +
  scale_fill_gradient(low = "white", high = "black") + 
  theme(legend.position = "none") +
  theme(axis.text.x = element_text(angle = 90, hjust = 1))

plot without facet

现在我想按每个样本关联的类别构建 10 x 10 热图,即 A,BC在这个例子中。但是,如果我使用 facet_grid ...
last_plot() + facet_grid(facetA~facetB)

plot with facet

...这导致 30 x 30 而不是 10 x 10 热图,热图被分割为 3 个类别(尽管仍然只显示 100 个值)。我记得用
last_plot() + facet_grid(facetA~facetB, scales = "free", space = "free")

然而,在过去,我不能再重现这一点。所需的解决方案看起来像这样(这是 gimped,不是 ggplot 生成的):

enter image description here

IE。一个重新排序的 10 x 10 分组矩阵。

最佳答案

您需要使用 facet_wrap()而不是 facet_grid()或更改 facet_grid() 中刻面的顺序正如评论中所建议的那样。

原因是,根据定义,facet_grid不允许 y 轴限制在同一行中的面板之间不同。换句话说,顶行中的所有三个面板必须具有相同的 y 限制,第二行中的所有三个面板必须具有相同的 y 限制,依此类推。添加 scales = "free_y"意味着允许第一行与第二行具有不同的 y 限制(但在给定行内,所有面板必须始终具有相同的 y 限制)。在您的示例中,当您使用

facet_grid(facetA ~ facetB, scales = "free")

你在强制ggplot对所有行使用所有 y 值;例如,顶行的左侧面板必须包含值 2418|B因为该值存在于顶行的中间面板中。在这种情况下,由于数据的结构,颠倒方面的顺序恰好可以完成这项工作。
(我只是举了一个 y 轴的例子,但同样适用于使用 scales = "free_x" 时的 x 轴限制。)

如果您想为每个面板设置不同的 x 和 y 比例,与其旁边的面板无关,您将需要使用 facet_wrap .

编辑
有关如何获得所需图形的更详细说明。回到你的具体例子,反转你的方面会给
p <- ggplot(data = data, mapping = aes(x=labelA, y=labelB)) + 
    geom_tile(mapping = aes(fill=ol)) +
    scale_fill_gradient(low = "white", high = "black") + 
    theme(legend.position = "none") +
    theme(axis.text.x = element_text(angle = 90, hjust = 1)) + 
    facet_grid(facetB ~ facetA, scales = "free")
p

enter image description here

这包含您想要的所有面板。要获得您要求的订单,只需重新排列行即可。这可以通过设置 facetB 的级别顺序来完成。 (编辑:或者,正如@user20650 在评论中所建议的,通过设置 as.table=FALSE in facet_grid() ):
data1 <- data    
data1$facetB <- factor(data1$facetB, levels = c("C", "B", "A"))
p %+% data1

enter image description here

关于r - 在 ggplot2 中使用 facet_grid 进行成对值(热图)可视化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33037926/

相关文章:

r - 热图中 z 分数和相应 p 值的共享图例

r - GGanimate:具有数值的 geom_text 以十进制数字而不是整数进行动画

r - 用虚线连接多个面的多个点

javascript - 仅当我在最后写入 Enter() 时图形才会更新

python - 根据不同列中的另外 2 个值求和一列的值

visualization - 如何在Gephi中获得面积比例节点?

r - 将 "character"矩阵转换为 "logical"

r - 在 R 中模仿来自 Stata 的制表命令

r - gganimate 在帧之间更改轴

r - ggvis:将多个数据集合并在一个图中