用于刻面的两个函数
1. facet_wrap()
facet_wrap() 将数据拆分为多个小面板(子图),并以单一维度或者一维连续排列的方式展示。
语法
facet_wrap(facets, nrow = NULL, ncol = NULL, scales = "fixed")
facets: 一个公式(通常用~表示),指定分组变量。例如,~var1表示以变量var1进行分面。nrow和ncol: 控制行数和列数,用来调整分面的排列布局。scales: 控制坐标轴的缩放方式,取值包括:"fixed": 所有子图共享相同的 x 和 y 轴(默认)。"free": 每个子图的 x 和 y 轴独立缩放。"free_x": 每个子图的 x 轴独立缩放,y 轴固定。"free_y": 每个子图的 y 轴独立缩放,x 轴固定。
示例
library(ggplot2)
# 使用mtcars数据集绘制分面图
ggplot(mtcars, aes(x = mpg, y = wt)) +
geom_point() +
facet_wrap(~ cyl, nrow = 2) # 根据 cyl 变量分面,每行最多 2 个面板
特点
- 适用于单变量分组。
- 自动调整排列布局。
2. facet_grid()
facet_grid() 用于创建基于两个变量的网格分面,子图排列为行和列。
语法
facet_grid(rows, cols, scales = "fixed")
rows和cols: 用公式表示,指定行和列的分组变量。例如:facet_grid(rows = vars(var1), cols = vars(var2))。- 或者使用简写:
facet_grid(var1 ~ var2)。
scales: 与facet_wrap()的scales参数一致。
示例
ggplot(mtcars, aes(x = mpg, y = wt)) +
geom_point() +
facet_grid(cyl ~ gear) # 行按cyl分组,列按gear分组
特点
- 适用于双变量分组。
- 创建网格状的布局,所有面板排列整齐。
- 如果只想按行或列分组,可以设置另一方向为
.:facet_grid(cyl ~ .):只按行分组。facet_grid(. ~ gear):只按列分组。

代码
1. 引入必要的库
library(ggplot2)
library(dplyr)
library(RColorBrewer)
library(viridis)
library(ggpubr)
library(rstatix)
library(gghalves)
library(showtext)
library(patchwork)
ggplot2: 主图形绘制包。dplyr: 数据处理包(未在此代码中直接使用)。RColorBrewer和viridis: 提供调色板。ggpubr: 提供高级绘图功能(未直接使用)。rstatix: 用于统计分析(未直接使用)。gghalves: 提供geom_half_violin用于绘制半小提琴图。showtext: 支持中文和其他字体。patchwork: 用于组合多个 ggplot 图(未直接使用)。
2. 设置字体
font_all <- font_files()
font_add("ST", regular = "simsun.ttc")
font_add("TN", regular = "times.ttf")
font_add("TNS", regular = "timesi.ttf")
showtext_auto(enable=TRUE)
font_files(): 查看系统字体文件。font_add(): 添加字体:"ST": 使用simsun.ttc(宋体)。"TN"和"TNS": 分别使用 Times 和 Times Italic 字体。
showtext_auto(): 自动启用字体支持,确保在图形中正确显示字体。
3. 定义颜色
colors = c('#889ECE','#F4E636','#29C4A1','#F3642E','lightgreen')
names(colors) = c('20','60','420','360','700')
- 定义颜色列表,使用 HEX 色码。
- 为每种颜色命名,对应到分组变量(如
delay的具体值)。
4. 创建 ggplot 图
p <- ggplot(data1, aes(x = delay, y = prob)) +
data1: 数据集,未提供具体数据。aes(x = delay, y = prob): 指定数据映射,将delay映射到 x 轴,prob映射到 y 轴。
(1) 添加半小提琴图
geom_half_violin(aes(fill = delay, color = delay), side = 'r', position = position_nudge(x = 0.42, y = 0))
geom_half_violin(): 绘制半小提琴图,用于显示数据分布。fill和color: 以delay分组着色。side = 'r': 绘制右半部分小提琴。position_nudge(): 将图形沿 x 轴稍微偏移。
(2) 添加箱线图
geom_boxplot(aes(fill = delay, color = delay), outliers = FALSE, width = 0.12, cex = 0.8, alpha = 0.5, position = position_nudge(x = 0.42, y = 0))
geom_boxplot(): 添加箱线图,显示数据的五数概括。outliers = FALSE: 不显示离群点。width和cex: 调整箱线图宽度和线条大小。alpha = 0.5: 设定透明度。
(3) 添加散点图
geom_jitter(color = "grey60", width = 0.1, size = 0.6, alpha = 0.9)
geom_jitter(): 添加抖动散点图,显示数据点。width = 0.1: 设置散点抖动幅度。color = "grey60": 设置散点颜色。
(4) 设置分面
facet_wrap(~ outcome, scales = "free")
facet_wrap(): 按outcome变量分面,生成多个子图。scales = "free": 每个子图的 y 轴范围可以独立调整。
5. 设置轴与标题
labs(
x = "Delay (Days)",
y = "Probability (%)",
fill = "延迟天数",
color = "延迟天数"
) +
ggtitle("个体等量参数转换点---按金额水平分面")
labs(): 设置坐标轴标题和图例标题。ggtitle(): 添加图表标题。
6. 自定义主题
theme_minimal() +
theme(
text = element_text(size = 42),
plot.title = element_text(size = 42, face = "bold", family = "ST", color = "black", hjust = 0.5),
...
)
theme_minimal(): 使用简洁主题。theme(): 进一步自定义主题。element_text(): 调整文本大小、字体、颜色等。plot.title: 图表标题样式。axis.text.x和axis.text.y: 调整 x 和 y 轴标签样式。legend.title和legend.text: 图例标题和文本样式。
7. 显示图形和保存
print(p)
ggsave(filename = "云雨图_按Outcome分面_单.png", plot = p, width = 10, height = 6)
print(p): 显示绘制的图形。ggsave(): 保存图形到文件,格式为 PNG,尺寸为 10×6 英寸。
总结
# 加载必要的库
library(ggplot2)
library(dplyr)
library(RColorBrewer)
library(viridis)
library(ggpubr)
library(rstatix)
library(gghalves)
library(showtext)
library(patchwork)
# 配置字体
font_all <- font_files()
font_add("ST", regular = "simsun.ttc") # 添加宋体
font_add("TN", regular = "times.ttf") # 添加Times字体
font_add("TNS", regular = "timesi.ttf") # 添加Times斜体
showtext_auto(enable = TRUE)
# 定义颜色
colors <- c('#889ECE', '#F4E636', '#29C4A1', '#F3642E', 'lightgreen')
names(colors) <- c('20', '60', '420', '360', '700') # 为每种颜色命名
# 绘图
p <- ggplot(data1, aes(x = delay, y = prob)) +
# 半小提琴图
geom_half_violin(aes(fill = delay, color = delay), side = 'r', position = position_nudge(x = 0.42, y = 0)) +
# 箱线图
geom_boxplot(aes(fill = delay, color = delay), outliers = FALSE, width = 0.12, cex = 0.8, alpha = 0.5, position = position_nudge(x = 0.42, y = 0)) +
# 散点图
geom_jitter(color = "grey60", width = 0.1, size = 0.6, alpha = 0.9) +
# 自定义颜色和填充
scale_color_manual(values = colors) +
scale_fill_manual(values = colors) +
# 设置坐标轴范围和标签
scale_y_continuous(limits = c(0, 100)) +
scale_x_discrete() +
coord_flip() +
# 按照 outcome 分面
facet_wrap(~ outcome, scales = "free") +
# 设置标签和标题
labs(
x = "Delay (Days)",
y = "Probability (%)",
fill = "延迟天数",
color = "延迟天数"
) +
ggtitle("个体等量参数转换点---按金额水平分面") +
# 主题设置
theme_minimal() +
theme(
text = element_text(size = 42),
plot.title = element_text(size = 42, face = "bold", family = "ST", color = "black", hjust = 0.5),
axis.text.x = element_text(size = 42, family = "TN", color = "black", margin = margin(t = 6)),
axis.text.y = element_text(size = 42, family = "TN", color = "black", margin = margin(r = 4)),
axis.title.x = element_text(size = 42, family = "TN", color = "black"),
axis.title.y = element_text(size = 42, family = "TN", color = "black"),
legend.title = element_text(size = 42, family = "ST", color = "black", face = "bold"),
legend.text = element_text(size = 42, family = "TN", color = "black"),
axis.ticks.x = element_line(linewidth = 0.6),
axis.ticks.y = element_line(linewidth = 0.6),
axis.ticks.length = unit(-0.15, "cm"),
axis.line = element_line(linewidth = 0.7),
panel.grid = element_blank(),
strip.text = element_text(size = 42, family = "TN", color = "black", face = "bold")
)
# 显示图形
print(p)
# 保存图像
ggsave(filename = "云雨图_按Outcome分面_单.png", plot = p, width = 10, height = 6)
1485

被折叠的 条评论
为什么被折叠?



