本文是回答B站关注者的提问,他的问题如下
原始数据存储在一个excel文件里,这个excel文件里有三个子表格,每一个子表格的数据如下:
总的数据格式
现在的需要是做如下的图
接下来就介绍如何利用原始数据到最终的图的ggplot2的代码
首先是将3个子表格的数据整理到一张表格里
比如这里我新建了一个子表格sheet4,数据最终的格式如下(原始数据里第一列的编号是没有用的,可以直接删掉)
接下来R语言里操作
首先是读取数据
代码语言:javascript复制library(readxl)
df<-read_excel("prac.xlsx",
sheet = "sheet4")
df
将宽格式转换为长格式
代码语言:javascript复制library(tidyverse)
df %>%
pivot_longer(!var4) -> new_df
new_df
定义误差线函数
这里用到的是标准误
代码语言:javascript复制ebtop<-function(x){
return(mean(x) sd(x)/sqrt(length(x)))
}
ebbottom<-function(x){
return(mean(x)-sd(x)/sqrt(length(x)))
}
ggplot2作图
代码语言:javascript复制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")
调整不同分组之间的顺序
代码语言:javascript复制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")
调整组内柱子之间的顺序
代码语言:javascript复制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")
这里新学到一个知识点是,柱子默认是不贴底的,如果要贴底使用函数scale_y_continuous(expand = expansion(mult = c(0,0.1)))
mult对应的两个值一个是控制下面,一个是控制上面,贴底就设置为0 就可以了
还有一个知识点是 expand.grid(x=c(1,2,3),y=c(4,5,6)) 可以生成两两配对的数据