我有包含 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))
现在我想按每个样本关联的类别构建 10 x 10 热图,即
A,B
或 C
在这个例子中。但是,如果我使用 facet_grid ...last_plot() + facet_grid(facetA~facetB)
...这导致 30 x 30 而不是 10 x 10 热图,热图被分割为 3 个类别(尽管仍然只显示 100 个值)。我记得用
last_plot() + facet_grid(facetA~facetB, scales = "free", space = "free")
然而,在过去,我不能再重现这一点。所需的解决方案看起来像这样(这是 gimped,不是 ggplot 生成的):
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
这包含您想要的所有面板。要获得您要求的订单,只需重新排列行即可。这可以通过设置
facetB
的级别顺序来完成。 (编辑:或者,正如@user20650 在评论中所建议的,通过设置 as.table=FALSE
in facet_grid()
):data1 <- data
data1$facetB <- factor(data1$facetB, levels = c("C", "B", "A"))
p %+% data1
关于r - 在 ggplot2 中使用 facet_grid 进行成对值(热图)可视化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33037926/