首页 > 解决方案 > 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所以试图摆脱那个,所以它错开了比较,但它与排序混淆了......但我不知道如何解决它所以我得到一个三角形阴谋)

标签: rggplot2

解决方案


试试这个(评论中的解释):

# 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")

示例数据说明:

插图


推荐阅读