zoukankan      html  css  js  c++  java
  • R绘图(1): 在散点图边缘加上直方图/密度图/箱型图

    当我们在绘制散点图的时候,可能会遇到点特别多的情况,这时点与点之间过度重合,影响我们对图的认知。为了更好地反映特征,我们可以加上点的密度信息,比如在原来散点所在的位置将密度用热图的形式呈现出来,再比如在主图的边缘加上直方图等来反映密度。具体实现如下:
    先导入数据,除了ggplot2,还有一个ggExtra包

    library(ggplot2)
    library(tidyverse)
    library(ggExtra)
    df=read.table("20191126P31_HTODemux_CiteFuse.txt",header = T,row.names = 1,sep = "	",stringsAsFactors = F)
    
    #数据格式如下
    # head(df)
    # HTODemux tag2 tag3 CiteFuse
    # AAACCCAAGTCATACC  doublet 6323 1582  doublet
    # AAACCCAAGTTGTCGT     tag3   17 3760     tag3
    # AAACCCACATGAGAAT     tag3   32 2614     tag3
    # AAACCCAGTAACTGCT     tag3   30  699     tag3
    # AAACCCAGTACCAGAG     tag2 4425   60     tag2
    # AAACCCAGTACGATGG     tag3   40 8043     tag3
    
    #每一组的占比,可以放在图的右上角
    group_labels=paste("tag2: 0.3844",
                       "tag3: 0.5000",
                       "doublet: 0.0844",
                       "negative: 0.0312",sep = "
    ")
    

    原图的绘制

    p=df%>%ggplot(aes(x=log(tag2),y=log(tag3),color=CiteFuse))+geom_point(size=2)+
      annotate("text",x=11,y=11,label=group_labels,color="black",size=6)+ #注释类型为“文本”类型,位置在x=11,y=11的位置,这张图横纵轴大约为12,因此(11,11)大概在右上角的地方
      scale_x_continuous("tag2_UMI_ln",breaks = seq(0,12,2))+
      scale_y_continuous("tag3_UMI_ln",breaks = seq(0,12,2))+
      theme_bw()+
      theme(
        axis.text.x.bottom = element_text(size = 16), #下面两行调整坐标轴刻度的文本大小
        axis.text.y.left = element_text(size = 16),
        axis.title.x = element_text(size = 18), #下面两行调整坐标轴title的文本大小
        axis.title.y = element_text(size = 18),
        legend.text = element_text(size = 18), #下面两行调整图例文本大小
        legend.title = element_text(size = 18),
        legend.position = c(0.9,0.1), #图例的位置,(0.9,0.1)是一个相对坐标,假设横纵轴长为1
        legend.key = element_blank(), #下面两行将图例的底层去掉,因为是白色的,所以去不去看不出来,只有在AI编辑图片的时候才能看到
        legend.background = element_blank(),
        panel.grid.major = element_blank(), #下面两行将图中ggplot2默认的横线竖线去掉
        panel.grid.minor = element_blank()
      )
    pdf("raw.pdf",width = 10, height = 10)
    p
    dev.off()
    


    密度图可以用smoothScatter()绘制

    pdf("smoothScatter.pdf",width = 7, height = 7.5)
    smoothScatter(log(df$tag2),log(df$tag3),xlab="tag2_UMI_ln",ylab="tag3_UMI_ln")
    dev.off()
    


    这种密度图还是比较常用的,不过在此处与原图相比,失去了分组信息,有点顾此失彼。我们看一下另一种方案,主要用到的就是ggExtra包里面的ggMarginal()函数。

    p1=ggMarginal(p, type="histogram", fill = "lightblue", xparams = list(bins=40), yparams = list(bins=40))
    pdf("histogram.pdf",width = 10, height = 10)
    p1
    dev.off()
    

    xparams和yparams分别用来调整两个方向的参数,这里我只调整了bin的数量,即每一个方向有40个柱形。

    p2=ggMarginal(p, type="density", fill="lightgrey", color="lightgrey")
    pdf("density.pdf",width = 10, height = 10)
    p2
    dev.off()
    

    fill和color分别调整填充颜色和边的颜色

    p3=ggMarginal(p, type="boxplot", size=7, xparams = list(color="black",size=1), yparams = list(color="grey",size=1))
    pdf("boxplot.pdf",width = 10, height = 10)
    p3
    dev.off()
    

    size=7表示主图长/宽是附图的7倍,list()里面的size表示箱型图边的宽窄

    p4=ggMarginal(p, type="densigram",fill="lightblue",color="purple")
    pdf("densigram.pdf",width = 10, height = 10)
    p4
    dev.off()
    

    最后一个图是直方图和密度图的组合


    针对我给出的原图,在主图的边缘加密度图看上去是不错的选择,感兴趣的小伙伴可以试试看~

    因水平有限,有错误的地方,欢迎批评指正!

  • 相关阅读:
    (easy)LeetCode 223.Rectangle Area
    (easy)LeetCode 205.Reverse Linked List
    (easy)LeetCode 205.Isomorphic Strings (*)
    (easy)LeetCode 204.Count Primes
    (easy)LeetCode 203.Remove Linked List Elements
    (easy)LeetCode 202.Happy Number
    (easy)LeetCode 198.House Robber
    (easy)LeetCode 191.Number of 1 Bits
    试题分析
    使用ADO.NET访问数据库
  • 原文地址:https://www.cnblogs.com/TOP-Bio/p/14221187.html
Copyright © 2011-2022 走看看