簡體   English   中英

用數據框中的另一列標記x軸

[英]Labeling x-axis with another column from dataframe

我有一個從運行的GWAS的輸出派生的數據框。 每行都是基因組中的SNP,具有染色體,位置和P.value。 從這個數據框中,我想生成一個曼哈頓圖,其中x軸從Chr 1上的第一個SNP到Chr 5上的最后一個SNP,而y軸是-log10(P.value)。 為此,我生成了一個Index列以沿x軸以正確順序繪制SNP,但是,我希望x軸由染色體列而不是Index標記。 不幸的是,我不能使用染色體來繪制我的x軸,因為任何給定染色體上的所有SNP都將被繪制在一個點列中。

這是一個可以使用的示例數據框:

library(tidyverse)

df <- tibble(Index = seq(1, 500, by = 1),
             Chromosome = rep(seq(1, 5, by = 1), each = 100),
             Position = rep(seq(1, 500, by = 5), 5),
             P.value = sample(seq(1e-5, 1e-2, by = 1e-5), 500, replace = TRUE))

到目前為止,我的情節是:

df %>%
    ggplot(aes(x = Index, y = -log10(P.value), color = as.factor(Chromosome))) +
    geom_point()

我嘗試過使用scale_x_discrete選項,但是還沒有找到解決方案。

這是我在網上找到的曼哈頓情節的示例。 看看如何根據染色體標記x軸? 那是我想要的輸出。

曼哈頓情節示例

geom_jitter是您的朋友:

df %>%
    ggplot(aes(x = Chromosome, y = -log10(P.value), color = as.factor(Chromosome))) +
    geom_jitter()

編輯給定OP的評論:

使用基數R圖,您可以執行以下操作:

cols = sample(colors(), length(unique(df$Chromosome)))[df$Chromosome]

plot(df$Index, -log10(df$P.value), col=cols, xaxt="n")
axis(1, at=c(50, 150, 250, 350, 450), labels=c(1:5))

您需要確切指定每個染色體標簽在axis功能中的位置。 感謝這篇文章

編輯#2:

我使用ggplot2找到了答案。 您可以使用annotate功能按坐標繪制點,並使用scale_x_discrete函數(如您建議的那樣)根據染色體將標簽放置在x軸上。 我們還需要定義pos向量以獲取圖的標簽位置。 我以每個組的“ Index列的平均值為例,但是您可以根據需要手動定義它。

pos <- df %>% 
    group_by(Chromosome) %>% 
    summarize(avg = round(mean(Index))) %>% 
    pull(avg)

ggplot(df) +
    annotate("point", x=df$Index, y=-log10(df$P.value),
          color=as.factor(df$Chromosome)) +
    scale_x_discrete(limits = pos, 
          labels = unique(df$Chromosome))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM