准备工作
加载使用的包
library(tidyverse)
library(gghalves)
数据集
这里我们使用 iris 这个数据集,先看一下数据集的格式
iris 是R 语言中自带的数据集,可以在R中输入 data() 查看所有数据集
head(iris)
从变量的角度来说,该数据集有两个重复测量变量(被试内变量),一个被试间变量,目前的数据结构是无法直接使用ggplot绘图的,因此我们需要先将数据进行 宽转长 的操作
data <- iris %>%
# 使用 pivot_longer 函数进行宽转长
pivot_longer(names_to = "condition",values_to = "value", 1:4) %>%
# 将生成的变量拆分成两个变量var1 和 var2
mutate( var1 = case_when(
condition == "Sepal.Length" ~ "Sepal",
condition == "Sepal.Width" ~ "Sepal",
condition == "Petal.Length" ~ "Petal",
condition == "Petal.Width" ~ "Petal"
)) %>%
mutate( var2 = case_when(
condition == "Sepal.Length" ~ "Length",
condition == "Sepal.Width" ~ "Width",
condition == "Petal.Length" ~ "Length",
condition == "Petal.Width" ~ "Width"
))
# 再查看生成的数据格式
head(data)
绘图
考虑到数据结构共有三个变量,假定我们最想要比较的差异是Species, 因此我们将另外两个变量(var1,var2)采用分面的方式呈现
# 绘制画布
p <- ggplot(data, aes(x = var1, y = value)) +
theme_bw() +
facet_grid(Species~var2)
p
逐步添加元素
# 添加点图
p +
geom_point(data = data, aes( fill = var1, color = var1),
position = position_jitterdodge(jitter.width = .2, jitter.height = .1,dodge.width = 0.6),
size = 3, shape = 20, alpha = 0.6)
# 添加箱图
p +
geom_point(data = data, aes( fill = var1, color = var1),
position = position_jitterdodge(jitter.width = .2, jitter.height = .1,dodge.width = 0.6),
size = 3, shape = 20, alpha = 0.6) +
# 同样将颜色映射到箱体上,后面的参数可用于修改箱体外观和大小
geom_boxplot( aes( fill = var1, color = var1),position = position_nudge(x = 0.2), width = .1, alpha = .3, outlier.shape = NA)
# 添加分半小提琴图
p +
geom_point(aes( fill = var1, color = var1),
position = position_jitterdodge(jitter.width = .2, jitter.height = .1,dodge.width = 0.6),
size = 3, shape = 20, alpha = 0.6) +
geom_boxplot( aes( fill = var1, color = var1),position = position_nudge(x = -0.2),
width = .1, alpha = .3, outlier.shape = NA) +
# 这里我们需要用到gghalves包中的geom_half_violin 函数画分半小提琴图
geom_half_violin(aes(fill = var1, color = var1) ,position = position_nudge(x = -.25),
adjust = 1, trim = T, alpha = .5, colour = NA, side = "l")
以上的图就已经把所有基本元素都放置在画布上了,接下来就是修改绘图细节,可以按照论文发表期刊的要求修改
p +
geom_point(data = data, aes( fill = var1, color = var1),
position = position_jitterdodge(jitter.width = .2, jitter.height = .1,dodge.width = 0.6),
size = 3, shape = 20, alpha = 0.6) +
geom_boxplot( aes( fill = var1, color = var1),position = position_nudge(x = -0.2), width = .1, alpha = .3, outlier.shape = NA) +
geom_half_violin(aes(fill = var1, color = var1) ,position = position_nudge(x = -.25),
adjust = 1, trim = T, alpha = .5, colour = NA, side = "l")+
#以下很多操作也可以通过其他的函数达到相同的目的,在这里仅举例我最常使用的
## 通过*labs*函数修改坐标轴标签
labs(y = "Value", x = "Location") +
## 通过* coord_cartesian*函数修改坐标轴范围
coord_cartesian(ylim = c(0,10))+
## 通过theme函数设置图形界面
### 在这部分中,theme主要是通过四个函数来完成定义的
#### element_line() 定义线条
#### element_text() 定义文本
#### element_rect() 定义边界
#### element_blank() 定义空集
theme(axis.title.x = element_text(size = 15),
axis.title.y = element_text(size = 15),
axis.text.x = element_text(size = 12),
axis.text.y = element_text(size = 12),
strip.text.x = element_text(size = 12),
legend.position = "none",
panel.grid.major = element_blank(),
panel.grid.minor = element_blank()
) +
## 通过 scale 系列函数自定义标度
scale_fill_brewer(palette = "Dark2")+
scale_color_brewer(palette = "Dark2")
这样,一幅简单的图就基本完成啦!