ggplot barplot and error bars

2020-09-15 15:41:34 浏览数 (2)

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

0 人点赞