将facet_grid用于ggplot2中的成对值(热图)可视化

bar*_*baz 5 r data-visualization facet heatmap ggplot2

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

data = dget(url("https://git.io/vCTpG"))
Run Code Online (Sandbox Code Playgroud)

数据如下所示:

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

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

没有刻面的情节

现在我想由每个样品与,即相关联的类别来构造10×10的热图A,B或C在这个例子中.但是,如果我使用facet_grid ...

last_plot() + facet_grid(facetA~facetB)
Run Code Online (Sandbox Code Playgroud)

情节与方面

...这导致30乘30而不是10乘10的热图,它被细分为3个类别(尽管仍然只显示100个值).我记得已经修好了

last_plot() + facet_grid(facetA~facetB, scales = "free", space = "free")
Run Code Online (Sandbox Code Playgroud)

然而,在过去,我再也无法重现这一点.期望的解决方案看起来像这样(这是gimped,而不是生成ggplot):

在此输入图像描述

即重新排序,按10×10矩阵分组.

kon*_*vas 2

您需要按照评论中的建议使用而facet_wrap()不是facet_grid()更改方面的顺序。facet_grid()

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

facet_grid(facetA ~ facetB, scales = "free")
Run Code Online (Sandbox Code Playgroud)

您强制ggplot对所有行使用所有 y 值;例如,顶行的左侧面板必须包含该值2418|B,因为该值存在于顶行的中间面板中。在这种情况下,由于数据的结构,反转方面的顺序恰好可以完成这项工作。(我只是给出 y 轴的示例,但使用 时,这同样适用于 x 轴限制scales = "free_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
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

这包含您想要的所有面板。要获得您要求的顺序,只需重新排列行即可。这可以通过设置级别的顺序来完成facetB(编辑:或者,如评论中建议的@user20650,通过设置as.table=FALSE in facet_grid()):

data1 <- data    
data1$facetB <- factor(data1$facetB, levels = c("C", "B", "A"))
p %+% data1
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述