您的示例数据与您在本问题和上一个问题中使用的“nba”示例显着不同。这就是为什么你有这么多麻烦。以下是可视化实际数据的三种方法:
1.) Tidyverse geom_tile() 方法:
library(tidyverse)
#install.packages("vroom")
library(vroom)
#install.packages("ggrepel")
library(ggrepel)
df <- vroom(file = "example.txt")
df %>%
pivot_longer(cols = -c(Name), names_to = "category") %>%
ggplot(aes(x = Name, y = category, fill = value)) +
geom_tile(colour = "white") +
geom_text(aes(label = ifelse(Name == "BCI0503", category, "")),
nudge_x = -0.5) +
geom_text_repel(aes(label = ifelse(category == "TEM", Name, "")),
nudge_y = 2) +
scale_fill_gradient(low = "beige", high = "red", breaks = c(0, 1)) +
coord_polar(theta="x") +
theme_void()
这看起来不太好 - 你可以在中间打一个“洞”,但我不认为这种类型的图适合你的数据。
2.) Circlize https://jokergoo.github.io/circlize_book/book/马戏团情节
#install.packages("circlize")
library(circlize)
mat = data.matrix(df)[,2:9]
rownames(mat) <- df$Name
col_fun1 = colorRamp2(c(0, 1), c("beige", "red"))
circos.par(gap.after = c(20))
circos.heatmap(mat, col = col_fun1,
rownames.side = "outside",
track.height = 0.4)
circos.track(track.index = get.current.track.index(),
panel.fun = function(x, y) {
if(CELL_META$sector.numeric.index == 1) { # the last sector
cn = colnames(mat)
n = length(cn)
circos.text(rep(CELL_META$cell.xlim[2], n) + convert_x(1, "mm"),
1:n - 0.5, cn,
cex = 0.5, adj = c(0, 0.5), facing = "inside")
}
}, bg.border = NA)
这更好了,但仍然不是很好。我相信问题是你的“计数”要么是 0 要么是 1 - 我认为另一种方法更适合这种类型的数据:UpSetR 图
3.) UpSetR 图 https://github.com/hms-dbmi/UpSetR
#install.packages("UpSetR")
library(UpSetR)
df_int <- df %>%
mutate(across(c(2:9), as.integer)) %>%
as.data.frame()
upset(df_int, order.by = "freq", sets.bar.color = "#56B4E9")
这就是我可视化此类数据的方式,但显然这取决于您最终想要如何描绘它。
如果您在原来的问题中包含了实际数据的样本,那么这个答案将需要大约 10 分钟而不是一个小时。在以后的问题中,请确保您的示例数据集与您的实际数据准确匹配。