代码之家  ›  专栏  ›  技术社区  ›  Nono_sad

R ggplot按组在排名数据上创建小提琴图

  •  0
  • Nono_sad  · 技术社区  · 6 年前

    我有点被困在图上,想弄个数字。

    所以我有一个数据帧,长度=21685

    这里是我的数据的一个小例子

    x <- data.frame("Genes" = c("Gene_1","Gene_2","Gene_3","Gene_4","Gene_5",
    "Gene_6","Gene_2","Gene_8","Gene_4","Gene_10"),
    "Start" = c(1,1,50,400,400,500,700,700,2000,2000), 
    "End" = c(10,10,200,600,600,600,1000,1000,3000,3000),
    "Log2_FC"=c(-1.2,-1.2,-0.7,-0.1,-0.1,0.3,1,1,1.5,1.5),
    "TPM"=c(0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1))
    

    (x只是我以df命名的原始数据帧的一部分)

    所以我有很多坐标,对于每个坐标:

    • 一个相关基因(同一坐标可以有多个基因,不同坐标可以有一个已经与给定位置相关的基因)

    • 每个坐标的唯一Log2(FC)值

    • 唯一TPM值/每个坐标/每个基因(代表与该坐标相关的给定基因的活动)

    我按“Log2_FC”对数据进行了排序。

    所以我要做的是按1000人一组绘制我的数据。 为此,我在数据框中添加了另一列

    df$TPM_range_1000=
    rep(seq(1000, 22000, by=1000), each=1000, length.out=21685)
    df$TPM_range_1000<-as.factor(df$TPM_range_1000)
    

    然后做我的身材:

     (fig1<-ggplot(df, aes(x=TPM_range_1000,y=TPM))+
      geom_violin(scale = "width",adjust = .5,fill='#A4A4A4', color="darkred")+
      geom_boxplot(width=0.1) + theme_minimal()+
      stat_summary(fun.y=mean, geom="point",size=2,color="red",aes(shape="Mean")) +
      theme(axis.text.x = element_text(angle = 90, hjust = 1))+
      guides(colour=guide_legend(order=1), shape=guide_legend(title=NULL, order=2)))
    

    我得到了这样的东西:

    enter image description here

    所以在这里,我有几个问题。。。 第一个是,除最后一组=685外,所有组均为=1000。 如何根据给定组的长度更改x标签。因为这里最后一组等于685,但对于其他数据,它可能不同。

    另一件事是,我如何在相同的坐标上合并并保留不同的TPM。因为实际上我的数据框应该更短,但我不想在TPM列中丢失信息,因为我需要在这里绘制值。

    所以,如果有人能帮我解决至少一个问题,那就太好了。 谢谢你阅读这篇文章,这很棘手,也不容易解释,但我尽力了:)。

    最好的

    0 回复  |  直到 6 年前
        1
  •  0
  •   Nono_sad    6 年前

    我至少找到了一个问题的解决方案。如果有人需要答案,我会发布答案。你也可以给我你对我的解决方案的看法。

    所以我根据“开始”“结束”“Log2_FC”删除了重复项,它应该是唯一的。 因为我想每个坐标只保留一个值,所以我计算了有几个TPM的坐标的平均值。

    #Here I drop duplicates and compute mean for coordinates which have several TPM
    test =as.data.frame( df %>% group_by(start,end,Log_FC) %>% summarise(TPM=mean(TPM))) 
    
    #I order by Log_FC value
    test=test[order(test$Log_FC),]
    
    #them make group of 500. So first 500 coordinates will have lowest Log2_FC value
    test$TPM_range_500=rep(seq(500, 15000, by=500), each=500,length.out=length(test[,1])) 
    
    #To be plot as a factor
    test$TPM_range_500<-as.factor(test$TPM_range_500) 
    

    所以我得到了这个图表:

    enter image description here

    但我仍然有一个问题来表示我的数据。

    我的数据帧长度等于14470。所以数据:

    • 第一组(500人)将在0-500人之间
    • 在13500-14000之间将在14000组
    • 14000-14470之间将是最后一组:14500

    但这里的问题是最后一组比另一组短。所以我想至少更改最后一个x标签,以替换为组的长度。

    谢谢你的帮助。。。