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矩阵分组.
您需要按照评论中的建议使用而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)