ggplot barplot and error bars
sunqi
2020/8/3
barplot
主要的函数和参数
geom_col() 绘图函数
color, fill, width: same as above
代码
代码语言:javascript复制rm(list = ls())
build_data <- function(){
df <- data.frame(dose=c("D0.5", "D1", "D2"),
len=c(4.2, 10, 29.5))
df2 <- data.frame(supp=rep(c("VC", "OJ"), each=3),
dose=rep(c("D0.5", "D1", "D2"),2),
len=c(6.8, 15, 33, 4.2, 10, 29.5))
dataset <- list(df=df,df2=df2)
return(dataset)
}
dataset <- build_data()
library(ggplot2)
library(tidyverse)
library(patchwork)
theme_set(
theme_classic()
theme(legend.position = "top")
)
# 基本绘图单元
p <- dataset$df %>% ggplot(aes(x = dose, y = len))
# 简单的绘图
p geom_col()
代码语言:javascript复制# 填充颜色和在头部添加标签
# 使用geom_text
p1 <- p geom_col(fill = "#0073C2FF")
geom_text(aes(label = len), vjust = -0.3)
# 在条图内部添加标签
p2 <- p geom_col(fill = "#0073C2FF")
geom_text(aes(label = len), vjust = 1.6, color = "white")
p1 p2
代码语言:javascript复制# 按照组改变bar的颜色
p3 <- p geom_col(aes(color = dose), fill = "white")
# 自定义填充颜色
scale_color_manual(values = c("#00AFBB", "#E7B800", "#FC4E07"))
# 按组改变bar的填充颜色
p4 <- p geom_col(aes(fill = dose))
# 自定义填充颜色
scale_fill_manual(values = c("#00AFBB", "#E7B800", "#FC4E07"))
p3 p4
代码语言:javascript复制# 堆叠条形图
p5 <- dataset$df2 %>% ggplot(aes(x = dose, y = len))
# 使用position参数设置堆叠
geom_col(aes(color = supp, fill = supp), position = position_stack())
# 自定义配色
scale_color_manual(values = c("#0073C2FF", "#EFC000FF"))
scale_fill_manual(values = c("#0073C2FF", "#EFC000FF"))
# 使用 position = position_dodge()
# 这里分组的柱状图被改为相邻的图
p6 <- dataset$df2 %>% ggplot(aes(x = dose, y = len))
geom_col(aes(color = supp, fill = supp), position = position_dodge(0.8), width = 0.7)
scale_color_manual(values = c("#0073C2FF", "#EFC000FF"))
scale_fill_manual(values = c("#0073C2FF", "#EFC000FF"))
p6 p5
代码语言:javascript复制# 添加标签
p5 geom_text(
# lebel为len,
aes(label = len, group = supp),
# 位置需要与p5的位置0.8保持一致,这样才能一一对应
position = position_dodge(0.8),
vjust = -0.3, size = 3.5
)
error bar
主要的函数
geom_crossbar() 空心的bar
geom_errorbar() 误差bar
geom_errorbarh() 水平误差bar
geom_linerange() 垂直区间
geom_pointrange()中间有一点的误差bar
代码
代码语言:javascript复制rm(list = ls())
#需要的包
library(tidyverse)
library(ggplot2)
library(patchwork)
# 准备数据
get_data <- function() {
dataset <- ToothGrowth
dataset$dose <- as.factor(dataset$dose)
dataset_summary <- dataset %>%
# 分组
group_by(dose) %>%
#计算需要的均值和标准差
summarise(sd = sd(len, na.rm = TRUE),
len = mean(len))
return(dataset_summary)
}
dataset_summary <- get_data()
# 绘图
## 基础绘图单元
p <- dataset_summary %>% ggplot(aes(
x = dose,
y = len,
ymin = len - sd,
ymax = len sd
))
# 中间有点的垂直线
p geom_pointrange()
代码语言:javascript复制# 标准差线段
p geom_errorbar(width = 0.2)
geom_point(size = 1.5)
代码语言:javascript复制# 水平误差线
# 这里的使用的x来计算最大值和最小值
# 同时x和y互换
dataset_summary %>% ggplot(aes(
x = len,
y = dose,
xmin = len - sd,
xmax = len sd
))
geom_point()
geom_errorbarh(height = .2)
代码语言:javascript复制# 和点图合并
# 需要注意的是这两部分使用的是不同的数据集
dataset <- ToothGrowth
dataset$dose <- as.factor(dataset$dose)
p1 <- dataset %>% ggplot(aes(dose, len))
geom_jitter(position = position_jitter(0.2), color = "darkgray")
# 这里将最大值和最小值的计算放在这里
geom_pointrange(aes(ymin = len - sd, ymax = len sd), data = dataset_summary)
# 和小提琴图合并
p2 <- ggplot(dataset, aes(dose, len))
geom_violin(color = "darkgray", trim = FALSE)
geom_pointrange(aes(ymin = len - sd, ymax = len sd), data = dataset_summary)
# 和线图、条图合并
p3 <- dataset_summary %>% ggplot(aes(dose, len))
# 线的绘制,这里需要制定只有一个组
geom_line(aes(group = 1))
# 误差bar绘制
geom_errorbar(aes(ymin = len - sd, ymax = len sd), width = 0.2)
# 点图
geom_point(size = 2)
# 条图
p4 <- dataset_summary %>% ggplot(aes(dose, len))
# 条图
geom_col(fill = "lightgray", color = "black")
# 添加线
geom_errorbar(aes(ymin = len, ymax = len sd), width = 0.2)
p1 p2 p3 p4
结束语
关于这个误差bar的添加,主要的问题其实是计算的问题,需要max和min,如果存在分组的问题,那么就需要使用按照分组再计算max和min,然后再在aes中使用。 love&peace