我正在尝试使用两种基因型(“rsh3”和“iron”)差异表达基因的基因本体的 -log(FDR) 制作热图。在这两列中,“rsh3”和“iron”被写入 GO 项的 -log(FDR)。
我不明白是我写错了代码还是我在数据框中错误地显示了我的数据。
以防万一我不清楚,这就是我的数据框的样子:
我尝试了这段代码:
library(ggplot2)
heat <- read_excel("directory/heat_final.xlsx")
heat_matrix <- as.matrix(heat)
ggplot(heat, aes(x = factor(c("rsh3", "iron")), y = GO_term)) +
geom_tile()
我收到此错误:
> ggplot(heat, aes(x = factor(c("rsh3", "iron")), y = GO_term)) +
+ geom_tile()
Error in `geom_tile()`:
! Problem while computing aesthetics.
ℹ Error occurred in the 1st layer.
Caused by error in `check_aesthetics()`:
! Aesthetics must be either length 1 or the same as the data (288)
✖ Fix the following mappings: `x`
Run `rlang::last_trace()` to see where the error occurred.
我实际上正在尝试获取类似于本文图 3 的热图:
https://www.tandfonline.com/doi/full/10.1080/21580103.2020.1801524
您的主要问题是,在
ggplot(aes())
中,x
应该是包含基因型的列名称,而不是包含列名称的因子。
旁注是
ggplot()
期望的是 data.frame 中的数据,而不是矩阵,因此您的转换充其量是无用的(将立即恢复),或者可能会使事情变得更糟。
因此,您需要的是一个带有
GO_term
列(可以映射到 y
)和 genotype
列(可以映射到 x
)的 data.frame。当然,您可以映射到 fill
颜色的列,我们称之为 log_FDR
。
这意味着您需要获取与基因型相对应的列,并将它们折叠为单个列,以使您的数据整洁,例如与
pivot_longer()
。
因此使用虚拟数据来说明,这是一个可重现的示例:
library(tidyverse)
# dummy data
heat <- tribble(~GO_term, ~rsh3, ~iron, ~mutant2,
"GO1", 1.81, 1.86, 2.5,
"GO2", 3.2, 0, 1)
heat |>
select(GO_term, rsh3, iron) |>
pivot_longer(-GO_term,
names_to = "genotype",
values_to = "log_FDR") |>
ggplot(aes(x = genotype, y = GO_term, fill = log_FDR)) +
geom_tile()