教你如何用一张呈现多张图信息!

用于刻面的两个函数

1. facet_wrap()

facet_wrap() 将数据拆分为多个小面板(子图),并以单一维度或者一维连续排列的方式展示。

语法
facet_wrap(facets, nrow = NULL, ncol = NULL, scales = "fixed")
  • facets: 一个公式(通常用 ~ 表示),指定分组变量。例如,~var1 表示以变量 var1 进行分面。
  • nrowncol: 控制行数和列数,用来调整分面的排列布局。
  • 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")
  • rowscols: 用公式表示,指定行和列的分组变量。例如:
    • 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: 数据处理包(未在此代码中直接使用)。
  • RColorBrewerviridis: 提供调色板。
  • 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(): 绘制半小提琴图,用于显示数据分布。
  • fillcolor: 以 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: 不显示离群点。
  • widthcex: 调整箱线图宽度和线条大小。
  • 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.xaxis.text.y: 调整 x 和 y 轴标签样式。
    • legend.titlelegend.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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱做科研的桶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值