美文网首页R包R plot数据可视化
桑基图的绘制(基础知识,R与origin)

桑基图的绘制(基础知识,R与origin)

作者: 单细胞空间交响乐 | 来源:发表于2021-06-20 10:23 被阅读0次

    最近年中总结,我们学习一下基础知识

    R版本

    桑基图绘制


    清除当前环境中的变量

    rm(list=ls())
    
    

    设置工作目录

    setwd("C:/Users/Dell/Desktop/R_Plots/23sankey/")
    
    

    使用riverplot包绘制桑基图

    # 安装并加载所需的R包
    #install.packages("riverplot")
    library(riverplot)
    
    # 构建测序数据集
    nodes <- c( LETTERS[1:5] )
    nodes
    ## [1] "A" "B" "C" "D" "E"
    
    edges <- list( A = list( C= 6 ), 
                   B = list( C= 5 ),
                   C = list( D= 4 ),
                   E = list( C= 3 )
                   )
    edges
    ## $A
    ## $A$C
    ## [1] 6
    ##
    ##
    ## $B
    ## $B$C
    ## [1] 5
    ##
    ##
    ## $C
    ## $C$D
    ## [1] 4
    ##
    ##
    ## $E
    ## $E$C
    ## [1] 3
    
    # 使用makeRiver函数构造riverplot对象
    r <- makeRiver( nodes, edges, 
                    node_xpos= c( 1,1,2,3,3 ),
                    node_labels= c( A= "Node A", B= "Node B", C= "Node C", D= "Node D", E= "Node E" ),
                    node_styles= list( A= list( col= "yellow" ), D= list( col= "blue" ), E= list( col= "red" )))
    r
    ## $edges
    ##        ID N1 N2 Value
    ## A->C A->C  A  C     6
    ## B->C B->C  B  C     5
    ## C->D C->D  C  D     4
    ## E->C E->C  E  C     3
    ## 
    ## $nodes
    ##   ID x labels
    ## A  A 1 Node A
    ## B  B 1 Node B
    ## C  C 2 Node C
    ## D  D 3 Node D
    ## E  E 3 Node E
    ## 
    ## $styles
    ## $styles$A
    ## $styles$A$col
    ## [1] "yellow"
    ## 
    ## 
    ## $styles$D
    ## $styles$D$col
    ## [1] "blue"
    ## 
    ## 
    ## $styles$E
    ## $styles$E$col
    ## [1] "red"
    ## 
    ## 
    ## 
    ## attr(,"class")
    ## [1] "list"      "riverplot"
    
    # 使用riverplot函数绘制桑基图
    riverplot(r)
    
    
    image
    # 绘制一个DNA双螺旋
    # a DNA strand
    plot.new()
    par( usr= c( 0, 4, -2.5, 2.5 ) )
    
    w <- 0.4
    cols <- c( "blue", "green" )
    init <- c( -0.8, -0.5 )
    pos  <- c( 1, -1 )
    step <- 0.5
    
    # Draw a curved segment
    for( i in rep( rep( c( 1, 2 ), each= 2 ), 5 ) ) {
      curveseg( init[i], init[i] + step, pos[1], pos[2], width= w, col= cols[i] )
      init[i] <- init[i] + step
      pos <- pos * -1
    }
    
    
    image

    使用ggforce包绘制桑基图

    # 安装并加载所需的R包
    #install.packages("ggforce")
    library(ggforce)
    
    # 构建示例数据
    data <- reshape2::melt(Titanic)
    head(data)
    ##  Class    Sex   Age Survived value
    ## 1   1st   Male Child       No     0
    ## 2   2nd   Male Child       No     0
    ## 3   3rd   Male Child       No    35
    ## 4  Crew   Male Child       No     0
    ## 5   1st Female Child       No     0
    ## 6   2nd Female Child       No     0
    
    data <- gather_set_data(data, 1:4)
    head(data)
    ##   Class    Sex   Age Survived value id     x    y
    ## 1   1st   Male Child       No     0  1 Class  1st
    ## 2   2nd   Male Child       No     0  2 Class  2nd
    ## 3   3rd   Male Child       No    35  3 Class  3rd
    ## 4  Crew   Male Child       No     0  4 Class Crew
    ## 5   1st Female Child       No     0  5 Class  1st
    ## 6   2nd Female Child       No     0  6 Class  2nd
    
    # 使用geom_parallel_setsh函数绘制桑基图
    ggplot(data, aes(x, id = id, split = y, value = value)) +
      geom_parallel_sets(aes(fill = Sex), alpha = 0.5, axis.width = 0.1) +
      geom_parallel_sets_axes(axis.width = 0.2,fill="black",color="red") +
      geom_parallel_sets_labels(colour = 'white',angle = 45) +
      theme_bw()
    
    
    image

    使用ggalluvial包绘制桑基图

    # 安装并加载所需的R包
    #install.packages("ggalluvial")
    library(ggalluvial)
    
    # 使用geom_alluvium函数绘制桑基图
    admissions <- as.data.frame(UCBAdmissions)
    head(admissions)
    ##      Admit Gender Dept Freq
    ## 1 Admitted   Male    A  512
    ## 2 Rejected   Male    A  313
    ## 3 Admitted Female    A   89
    ## 4 Rejected Female    A   19
    ## 5 Admitted   Male    B  353
    ## 6 Rejected   Male    B  207
    
    ggplot(admissions,
           aes(y = Freq, axis1 = Gender, axis2 = Dept)) +
      geom_alluvium(aes(fill = Admit), width = 1/12) +
      geom_stratum(width = 1/12, fill = "black", color = "grey") +
      geom_label(stat = "stratum", aes(label = after_stat(stratum))) +
      scale_x_discrete(limits = c("Gender", "Dept"), expand = c(.05, .05)) +
      scale_fill_brewer(type = "qual", palette = "Set1") +
      ggtitle("UC Berkeley admissions and rejections, by sex and department")
    
    
    image
    data <- as.data.frame(Titanic)
    head(data)
    ##   Class    Sex   Age Survived Freq
    ## 1   1st   Male Child       No    0
    ## 2   2nd   Male Child       No    0
    ## 3   3rd   Male Child       No   35
    ## 4  Crew   Male Child       No    0
    ## 5   1st Female Child       No    0
    ## 6   2nd Female Child       No    0
    
    ggplot(data,
           aes(y = Freq,
               axis1 = Survived, axis2 = Sex, axis3 = Class)) +
      geom_alluvium(aes(fill = Class),width = 0, 
                    knot.pos = 0, reverse = FALSE) +
      guides(fill = FALSE) +
      geom_stratum(width = 1/8, reverse = FALSE) +
      geom_text(stat = "stratum", aes(label = after_stat(stratum)),reverse = FALSE) +
      scale_x_continuous(breaks = 1:3, labels = c("Survived", "Sex", "Class")) +
      coord_flip() +
      ggtitle("Titanic survival by class and sex")
    
    
    image
    data(vaccinations)
    levels(vaccinations$response) <- rev(levels(vaccinations$response))
    head(vaccinations)
    ##      survey freq subject response start_date   end_date
    ## 1 ms153_NSA   48       1  Missing 2010-09-22 2010-10-25
    ## 2 ms153_NSA    9       2  Missing 2010-09-22 2010-10-25
    ## 3 ms153_NSA   66       3  Missing 2010-09-22 2010-10-25
    ## 4 ms153_NSA    1       4  Missing 2010-09-22 2010-10-25
    ## 5 ms153_NSA   11       5  Missing 2010-09-22 2010-10-25
    ## 6 ms153_NSA    1       6  Missing 2010-09-22 2010-10-25
    
    ggplot(vaccinations,
           aes(x = survey, stratum = response, alluvium = subject,
               y = freq,
               fill = response, label = response)) +
      scale_x_discrete(expand = c(.1, .1)) +
      geom_flow() +
      geom_stratum(alpha = .5) +
      geom_text(stat = "stratum", size = 4) +
      theme(legend.position = "none") +
      ggtitle("vaccination survey responses at three points in time")
    
    
    image

    origin版本(非代码,手动操作)

    数据准备

    在之前的文章中有提到按“F11”键就可以快速进入origin的“Origin central”直接套用模板去学习作图,如下图,在新版的Origin 2019已将“Origin centra1”改为“Learning center”。 今天我们就直接用它的实例数据作图。

    ###

    双击实例中的图表即可打开实例图表的工程文件,我这里只需数据,所以复制了一份到文件夹Folder1中,数据为历史上著名的泰坦尼克号事故中旅客和船员的是否获救记录(如下图)。数据只要是原始的分类记录即可,不需要手动计数。注意,Origin 2019的数据介绍弄错了,嗯,希望它接下来改进吧。

    image

    双坐标轴图

    为了便于理解,我这里先画两个坐标轴的桑基图,看一下成人和小孩的幸存情况。类似Excel的操作,将鼠标指针悬停在表格列名上然后选中3、4列数据(包括分组数据),如下。

    image

    然后进入Plot菜单,找到Parallel Sets。

    image

    点击一下Parallel Sets即可完成绘制,初始结果如下:

    image

    可见孩子的存活比例比成人高,虽然女人和孩子可优先乘坐救生船,但仍有约一半的小孩没能获救。

    三坐标轴

    接下来增加点复杂度,同样的方法选择数据,这次加入性别数据,如下图。

    image

    绘制的初始结果如下:

    image

    类似于常规图表,双击坐标轴可以对坐标轴的粗细、颜色、刻度朝向等进行调整,如下。

    image

    双击图表区域,在Plot Details窗口也可改变颜色,可选择已有的配色方案,比如这里选Q05。

    image

    类似《如何用Origin绘制分边小提琴图》一文,如果对Q05的颜色不满意,还可点右侧的“✏”,自定义颜色列表,如下图。

    image

    调整配色后的结果如下:

    image

    勾选Combined Sets可将相同“流向”的数据进行合并,如下图。

    image

    具体的合并方式和结果见下图:

    image

    四坐标轴

    同样的方法将4列数据全选,绘制结果如下图:

    image

    Transparency调整颜色的透明度,Curvature(曲率) 调整颜色“条带”的转角。

    image

    如果将Curvature(曲率)值调为0 %,就得到下图的效果。“直的”也不错,嗯,我还是觉得“弯的”比较好看。

    image

    曲率这里改回默认的30 %,换一下配色,最终可得到多种效果,如下:

    image

    个人都试了一下,origin最好,可视化操作,不用写代码,而且相当好看

    相关文章

      网友评论

        本文标题:桑基图的绘制(基础知识,R与origin)

        本文链接:https://www.haomeiwen.com/subject/kyijyltx.html