美文网首页基本图形绘制R plot
R语言ggplot2做簇状柱形图并添加误差线的一个完整示例

R语言ggplot2做簇状柱形图并添加误差线的一个完整示例

作者: 小明的数据分析笔记本 | 来源:发表于2021-12-12 10:05 被阅读0次

    本文是回到B站关注者的提问,他的问题如下

    原始数据存储在一个excel文件里,这个excel文件里有三个子表格,每一个子表格的数据如下:

    image.png

    总的数据格式

    image.png

    现在的需要是做如下的图

    image.png

    接下来就介绍如何利用原始数据到最终的图的ggplot2的代码

    首先是将3个子表格的数据整理到一张表格里

    比如这里我新建了一个子表格sheet4,数据最终的格式如下

    image.png

    接下来R语言里操作

    首先是读取数据

    library(readxl)
    df<-read_excel("prac.xlsx",
                   sheet = "sheet4")
    df
    

    将宽格式转换为长格式

    library(tidyverse)
    df %>% 
      pivot_longer(!var4) -> new_df
    new_df
    

    定义误差线函数

    这里用到的是标准误

    ebtop<-function(x){
      return(mean(x)+sd(x)/sqrt(length(x)))
    }
    ebbottom<-function(x){
      return(mean(x)-sd(x)/sqrt(length(x)))
    }
    

    ggplot2作图

    library(ggplot2)
    
    ggplot(data=new_df,aes(x=name,y=value,fill=var4))+
      stat_summary(geom = "bar",fun = "mean",
                   position = position_dodge(0.9))+
      stat_summary(geom = "errorbar",
                   fun.min = ebbottom,
                   fun.max = ebtop,
                   position = position_dodge(0.9),
                   width=0.2)+
      scale_y_continuous(expand = expansion(mult = c(0,0.1)))+
      theme_bw()+
      theme(panel.grid = element_blank())+
      scale_fill_manual(values = c("#e20612","#ffd401","#00b0eb"),
                        name="")+
      labs(x="XXXXX",y="YYYYY")
    
    image.png

    调整不同分组之间的顺序

    new_df$name<-factor(new_df$name,
                        levels = c("var2","var3","var1"))
    
    ggplot(data=new_df,aes(x=name,y=value,fill=var4))+
      stat_summary(geom = "bar",fun = "mean",
                   position = position_dodge(0.9))+
      stat_summary(geom = "errorbar",
                   fun.min = ebbottom,
                   fun.max = ebtop,
                   position = position_dodge(0.9),
                   width=0.2)+
      scale_y_continuous(expand = expansion(mult = c(0,0.1)))+
      theme_bw()+
      theme(panel.grid = element_blank())+
      scale_fill_manual(values = c("#e20612","#ffd401","#00b0eb"),
                        name="")+
      labs(x="XXXXX",y="YYYYY")
    
    image.png

    调整组内柱子之间的顺序

    new_df$var4<-factor(new_df$var4,
                        levels = c("group2",
                                   "group3",
                                   "group1"))
    ggplot(data=new_df,aes(x=name,y=value,fill=var4))+
      stat_summary(geom = "bar",fun = "mean",
                   position = position_dodge(0.9))+
      stat_summary(geom = "errorbar",
                   fun.min = ebbottom,
                   fun.max = ebtop,
                   position = position_dodge(0.9),
                   width=0.2)+
      scale_y_continuous(expand = expansion(mult = c(0,0.1)))+
      theme_bw()+
      theme(panel.grid = element_blank())+
      scale_fill_manual(values = c("#e20612","#ffd401","#00b0eb"),
                        name="")+
      labs(x="XXXXX",y="YYYYY")
    
    image.png

    这里新学到一个知识点是,柱子默认是不贴底的,如果要贴底使用函数scale_y_continuous(expand = expansion(mult = c(0,0.1)))

    mult对应的两个值一个是控制下面,一个是控制上面,贴底就设置为0 就可以了

    公众号推文由获取数据和代码的方式

    欢迎大家关注我的公众号

    小明的数据分析笔记本

    小明的数据分析笔记本 公众号 主要分享:1、R语言和python做数据分析和数据可视化的简单小例子;2、园艺植物相关转录组学、基因组学、群体遗传学文献阅读笔记;3、生物信息学入门学习资料及自己的学习笔记!

    相关文章

      网友评论

        本文标题:R语言ggplot2做簇状柱形图并添加误差线的一个完整示例

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