r - ggplot geom_tile 相关图混合排序轴刻度标签创建奇怪的图
问题描述
我在网上找不到任何答案,所以希望有人有解决方案。我正在尝试使用 ggplot2geom_tile
绘制带有成对染色体臂的共现/互斥图。下面是我的数据框的片段。(此处链接到完整数据集:https ://pastebin.com/imxfZNRX )
Event1 Event2 label
1017 16p gain 16p loss exclusion
666 13q gain 13q loss exclusion
1523 19p gain 19q gain co-occur
1565 19p gain 9q gain co-occur
1738 1p loss 1q loss co-occur
染色体臂的名称是数字和字母的混合。所以我使用mixedsort()
from gtools 对它们进行排序。并考虑了我的 y/x 轴刻度标签。
library(gtools)
library(dplyr)
event1 <- mixedsort(unique(cooccur.table$Event1 %>% as.vector()), decreasing = F); event1
event2 <- mixedsort(unique(cooccur.table$Event2 %>% as.vector()), decreasing = T); event2
cooccur.table$Event1 <- factor(cooccur.table$Event1, levels = event1)
cooccur.table$Event2 <- factor(cooccur.table$Event2, levels = event2)
当我试图绘制时,
library(ggplot2)
ggplot(cooccur.table, aes(x = Event1, y = Event2, fill = label, label = label)) +
geom_tile(colour="black") +
coord_equal() +
scale_fill_manual(values = c("#08d9d6", "#e84a5f", "#ffffff")) +
# scale_y_discrete(limits = rev(levels(cooccur.table$Event1)[2:72])) +
theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust = 1.4),
axis.text.y = element_text(hjust = 1.5),
legend.position = "right",
axis.line.x = element_line(size = 0.2),
axis.line.y = element_line(size = 0.2),
axis.ticks = element_blank())
这是结果……
(我在想,因为它是成对比较,geom_tile
所以试图摆脱那个,所以它错开了比较,但它与排序混淆了......但我不知道如何解决它所以我得到一个三角形阴谋)
解决方案
试试这个(评论中的解释):
# create ONE set of factor levels that cover both columns
event.levels <- mixedsort(unique(c(cooccur.table$Event1, cooccur.table$Event2)))
# create combined table such that we have both Event1-Event2 and Event2-Event1 pairs
new.cooccur.table <- rbind(cooccur.table,
cooccur.table %>%
rename(Event2 = Event1, Event1 = Event2) %>%
select(Event1, Event2, label)) %>%
# convert both event columns to factor, with the same set of factor levels defined above
mutate(across(starts_with("Event"),
~factor(.x, levels = event.levels))) %>%
# keep only rows where Event1's is smaller than Event2 (this creates the triangle)
filter(as.integer(Event1) < as.integer(Event2)) %>%
# reverse the factor level order for Event2
mutate(Event2 = forcats::fct_rev(Event2))
# plot
ggplot(new.cooccur.table,
aes(x = Event1, y = Event2, fill = label, label = label)) +
geom_tile(colour="black") +
coord_equal() +
scale_fill_manual(values = c("#08d9d6", "#e84a5f", "#ffffff"))
用于重现性的小数据样本:
cooccur.table <- structure(list(Event1 = c("9p gain", "19q gain", "19p gain",
"9q gain", "10q gain", "19p gain", "19p gain", "9p gain", "19p gain",
"19q gain", "10q gain", "10q gain", "9p loss", "19p loss", "10q loss",
"19q loss", "19p loss", "19p gain", "10q loss", "10q loss", "10q loss",
"19q gain", "9p loss", "19p loss", "19q loss", "19p gain", "10q gain",
"10q gain", "19p loss", "19q gain", "10q gain", "19p loss", "10q loss",
"10q loss", "19q loss", "19q loss", "10q gain", "19p gain", "10q gain",
"19p loss", "10q gain", "19q gain", "10q loss", "10q loss", "9p gain"
), Event2 = c("9p loss", "19q loss", "19p loss", "9q loss", "10q loss",
"19q gain", "9q gain", "9q gain", "19q loss", "9q gain", "19p gain",
"9q gain", "9q loss", "19q loss", "9q loss", "9q loss", "9q loss",
"9q loss", "9p loss", "19p loss", "19q loss", "9p gain", "9q gain",
"9p loss", "9p loss", "9p loss", "9p gain", "19q gain", "9q gain",
"9p loss", "19q loss", "9p gain", "19q gain", "9p gain", "9q gain",
"9p gain", "9q loss", "9p gain", "9p loss", "19q gain", "19p loss",
"9q loss", "9q gain", "19p gain", "9q loss"), label = c("exclusion",
"exclusion", "exclusion", "exclusion", "exclusion", "co-occur",
"co-occur", "co-occur", "exclusion", "co-occur", "co-occur",
"co-occur", "co-occur", "co-occur", "neutral", "neutral", "neutral",
"neutral", "neutral", "neutral", "neutral", "neutral", "neutral",
"neutral", "neutral", "neutral", "neutral", "neutral", "neutral",
"neutral", "neutral", "neutral", "neutral", "neutral", "neutral",
"neutral", "neutral", "neutral", "neutral", "neutral", "neutral",
"neutral", "neutral", "neutral", "neutral")), row.names = c(NA,
-45L), class = "data.frame")
示例数据说明:
推荐阅读
- html - 如何使用固定侧边栏获得 100% 高度布局?
- angular - 如何从模板Angular中的循环传递变量值?
- node.js - 如何忽略“firebase-admin 似乎已安装在不受支持的环境中。”?
- jquery - 从 .each 方法中缓存好吗?
- java - 如何避免静态方法中的长 switch/case 块
- php - Laravel Blade 使用不同的循环进行迭代
- php - 如何在特定产品的 woocommerce 产品库下方添加内容?
- shell - 使用 shell/awk 脚本添加时间戳
- ios - React-native 函数在调试模式下工作但不在发布模式下
- python-3.x - 使用 lambda 从输入中获取函数