美文网首页R可视化专题
R语言之为堆积图添加连接线

R语言之为堆积图添加连接线

作者: Oodelay | 来源:发表于2019-03-04 13:35 被阅读0次

    示例数据
    提取码:kydo

    加载工具包
    library(magrittr) # need to run every time you start R and want to use %>%
    library(dplyr)    # alternative, this also loads %>%
    
    读入数据
    map = read.table('map.txt', row.names = 1, header = T)
    taxa = read.table('taxa_L2.txt', row.names = 1, header = T,sep = '\t')
    taxa = t(taxa) %>% as.data.frame() #转置(行列调换)并设定数据格式为数据框
    taxa = taxa[rownames(map),]#将两文件的行顺序调为一致,方便后续合并
    dat = cbind(taxa,map)#按列合并两文件
    dat = dat[,-8]#去除无效部分
    
    数据按组求均值并调整数据格式
    library('reshape2')
    dat = aggregate(. ~ Week*Site, data = dat, mean) %>% #同时依据Week和Site两个条件求组内均值,这里我们定义Site为大组,Week为小组
      melt() %>% #数据格式调整,各个变量分别成列
      dcast(variable + Site ~ Week)#数据格式调整,variable和Site为行,Week为列
    
    调整行和列的顺序,组与组之间数据不要串行
    dat = dat[order(dat$Site, dat$variable,decreasing = F),c('variable','Site','W1','W2','W4','W8','W16')]
    
    定义组,组内数据按列累加
    library('dplyr')
    link_dat <- dat %>% 
      group_by(Site) %>% #按大组Site进行分组,后续作图以Site进行分页展示
      mutate_if(is.numeric, cumsum) %>% #判断是否为数值型变量,才执行本操作
      as.data.frame()
    
    设定组间连接线
    bar.width <- 0.7
    link_dat <- link_dat[, c(1,2,3,rep(4:(ncol(link_dat)-1),each=2),ncol(link_dat))] #对数值型变量部分,掐头去尾,对中间的变量各复制一遍
    link_dat <- data.frame(y=t(matrix(t(link_dat[,-c(1,2)]), nrow=2)))#除去非数值型变量后,转换为两列的数据框,分别作为连接线的两个端点的纵坐标
    link_dat$x.1 <- 1:4 + bar.width/2 #设定连接线的两个端点的横坐标,1:n,n = 小组数-1,类似于砍木头,4刀5段
    link_dat$x.2 <- 1:4 + (1-bar.width/2)#同上
    link_dat$Site = rep(levels(dat$Site),each = 28)#这里就呼应了上文的组与组之间数据不要串行
    

    至此,我们有两套数据,

    • 已经分组就均值的数据dat
    • 以及定义连接线的数据link_dat
    数据格式调整和重命名
    library('reshape2')
    dat = melt(dat)
    names(dat) = c('taxa','Site','Week','value')
    
    调整变量出图顺序
    dat$taxa = factor(dat$taxa,levels = c('Carbonyl','Aromatic_C-O','Aromatic_C','O-C-O_anomeric_C', 'O-alkyl_C','O-CH3/NCH','Alkyl_C'))
    
    dat$Week = factor(dat$Week,levels = c('W1',"W2","W4","W8","W16"))
    
    levels(dat$Week) = c('1','2','4','8','16')#将变量重命名,必须和上面`dat$Week`设定的顺序保持一致
    

    这里设定的dat$taxa顺序,务必和dat中相应的数据相反,因为这里的顺序表示堆积图中的变量从上到下排列,而连接线数据link_dat中的数据则是从下往上累加。为了保证连接线与堆积图相匹配,切记要注意变量的出图顺序。

    初步成图
    library('ggplot2')
    library("scales")#用来设定百分比形式的纵坐标
    
    p <- ggplot(data = dat, aes(x = Week, y = value, fill = taxa)) + 
      
      theme_bw()+
      
      facet_grid(~ Site,scales = 'free') + #出图以Site为组进行分页展示
      
      labs(x= '',y ='',fill = '') +#设定坐标轴和填充色属性的名称
      
      geom_bar(stat = "identity", width=bar.width, col='black')  + #stat = 'identity'为堆积图
     
     #是否显示对应的具体数据标签
     # geom_text(aes(label = paste0(sprintf("%1.1f", value*100),"%")), #数据显示为保留一个小数点的百分数
      #           size = 4,fontface='bold',position =position_stack(vjust=0.5)) +
      
      geom_segment(data=link_dat, aes(x=x.1, xend=x.2, y=y.1, yend=y.2), inherit.aes = F) +#加载小组间的连接线
    
      #scale_y_continuous(labels = percent) +  # 百分比坐标轴(需加载scales包)
      #自定义颜色,注意顺序
      scale_fill_manual(values = c('gold4','chocolate4','coral1',
                                   'cornflowerblue','darkgoldenrod1',
                                   'darkmagenta','firebrick1','violetred',
                                   'forestgreen','gold4','darkviolet','orange1',
                                   'deeppink','salmon1','steelblue','darkred','grey')) + 
      #自定义属性
      theme(strip.text = element_text(face = 'bold',color = 'black',size = 14),#设定分页图的标题属性
            axis.title.y = element_text(face = 'bold',color = 'black',size = 14),
            axis.title.x = element_text(face = 'bold',color = 'black',size = 14,vjust = -1.2),
            axis.text.y = element_text(face = 'bold',color = 'black',size = 10),
            axis.text.x = element_text(face = 'bold',color = 'black',size = 10),
            legend.text = element_text(face = 'bold',color = 'black',size = 10))
    
    输出图片
    ggsave(p, filename = 'L2.jpg', width = 8, height = 4, dpi = 600)
    

    相关文章

      网友评论

        本文标题:R语言之为堆积图添加连接线

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