科研绘图系列:R语言双侧条形图(bar Plot)

文摘   2024-07-06 08:27   广东  

专注收集和自写可发表的科研图形的数据和代码分享,该系列的数据均可从以下链接下载:

百度云盘链接: https://pan.baidu.com/s/1M4vgU1ls0tilt0oSwFbqYQ
提取码: 请关注WX公zhong号 生信学习者 后台发送 科研绘图 获取提取码

介绍

双侧条形图上的每个条形代表一个特定的细菌属,条形的高度表示该属的LDA得分的对数值,颜色用来区分不同的分类群或组别,它具有以下优点:

  1. 可视化差异:条形图可以直观地展示不同细菌属在得分上的差异。

  2. 强调重要性:较高的条形表示某些特征在区分不同组别中具有重要作用。

  3. 对数刻度:使用对数刻度可以帮助展示得分的相对大小,尤其是在得分范围很广的情况下。

  4. 分类展示:通过颜色或分组,可以展示不同分类群或组别中的特征的分布情况。

加载R包

knitr::opts_chunk$set(echo = TRUE, message = FALSE, warning = FALSE)

library(tidyverse)

rm(list = ls())
options(stringsAsFactors = F)

# group & color
group_names <- c("groupA", "groupB")
group_colors <- c('#0073C2FF','#E69F00')

导入数据

构建符合双侧条形图的画图数据,它有三列数据构成:

  • genus:Y轴显示的标签名字也即是变量名称

  • class:Y轴标签的分类分组变量

  • value:X轴的数值(假设为LDA score)

inputdata <- data.frame(
genus = c("Prevotella", "Streptococcus", "YRC22", "Phascolarctobacterium", "SMB53", "Epulopiscium",
"CF231", "Anaerovibrio", "Paludibacter", "Parabacteroides", "Desulfovibrio", "Sutterella",
"Roseburia", "Others__0_5_", "Akkermansia", "Bifidobacterium", "Campylobacter", "Fibrobacter",
"Coprobacillus", "Bulleidia", "f_02d06", "Dorea","Blautia", "Enterococcus", "Eubacterium",
"p_75_a5", "Clostridium", "Coprococcus", "Oscillospira", "Escherichia", "Lactobacillus"),
class = c(rep("groupA", 18), rep("groupB", 13)),
value = c(4.497311, 4.082377, 3.578472, 3.567310, 3.410453, 3.390026,
3.363542, 3.354532, 3.335634, 3.284165, 3.280838, 3.218053,
3.071454, 3.026663, 3.021749, 3.004152, 2.917656, 2.811455,
-2.997631, -3.074314, -3.117659, -3.151276, -3.170631, -3.194323,
-3.225207, -3.274281, -3.299712, -3.299875, -3.689051, -3.692055, -4.733154)
)

head(inputdata)
genusclassvalue

1PrevotellagroupA4.497311
2StreptococcusgroupA4.082377
3YRC22groupA3.578472
4PhascolarctobacteriumgroupA3.567310
5SMB53groupA3.410453
6EpulopisciumgroupA3.390026

数据预处理

  • 按照数值大小对Y轴标签进行排序

  • 计算Y轴标签的位置信息和水平位置校正数值

plotdata <- inputdata %>%
dplyr::mutate(
genus = factor(genus, levels = genus[order(value, decreasing = TRUE)]),
label_y = ifelse(value < 0, 0.2, -0.2),
label_hjust = ifelse(value < 0, 0, 1)) |>
dplyr::mutate(class = factor(class, levels = group_names))

head(plotdata)
genusclassvaluelabel_ylabel_hjust
1PrevotellagroupA4.497311-0.21
2StreptococcusgroupA4.082377-0.21
3YRC22groupA3.578472-0.21
4PhascolarctobacteriumgroupA3.567310-0.21
5SMB53groupA3.410453-0.21
6EpulopisciumgroupA3.390026-0.21

双侧条形图

使用ggplot2语法画图,下列是代码的解释:

  1. ggplot(plotdata, aes(x = genus, y = value, fill = class)):初始化ggplot对象。plotdata是包含绘图数据的数据框(data frame)。aes()函数定义了美学映射,即数据如何映射到图形的美学属性上。这里将genus映射到x轴,value映射到y轴,class用于填充颜色。

  2. geom_bar(stat = "identity", col = "black", width = 0.7):添加条形图层。stat = "identity"表示使用数据中的value作为条形的高度,col = "black"设置条形的边框颜色为黑色,width = 0.7设置条形的宽度。

  3. geom_text(aes(y = label_y, label = genus, hjust = label_hjust)):在条形图上添加文本标签。这里文本标签的内容是genus,位置通过label_yhjust(水平对齐方式)来确定。

  4. coord_flip():将坐标轴翻转,使得x轴和y轴互换位置。

  5. scale_fill_manual(values = group_colors):手动设置条形的填充颜色。group_colors是一个包含颜色值的向量,用于为不同的class值指定颜色。

  6. scale_y_continuous(expression(log[10](italic("LDA score"))), breaks = -6:6, limits = c(-6, 6)):设置y轴的刻度和标签。这里使用对数刻度(10的对数),标签使用斜体表示"LDA score"。breaks定义了y轴的刻度间隔,limits定义了y轴的范围。

  7. theme_minimal():应用一个简洁的主题样式。

  8. theme()函数中的多个参数用于自定义图表的外观,包括:

  • axis.text.y = element_blank():隐藏y轴的文本标签。

  • axis.ticks.y = element_blank():隐藏y轴的刻度线。

  • axis.title.y = element_blank():隐藏y轴的标题。

  • legend.position = "top":将图例放在顶部。

  • legend.justification = 0.05:图例的水平对齐方式。

  • legend.title = element_blank():隐藏图例的标题。

  • panel.grid.major.y = element_blank():隐藏y轴的主网格线。

  • panel.grid.minor.y = element_blank():隐藏y轴的次网格线。

  • panel.grid.major.x = element_line(colour = "grey80", linetype = "dashed"):设置x轴的主网格线样式为灰色虚线。

  • text = element_text(size = 9, color = "black"):设置文本的大小和颜色。

pl <- ggplot(plotdata, aes(x = genus, y = value, fill = class)) +
geom_bar(stat = "identity", col = "black", width = 0.7) +
geom_text(aes(y = label_y, label = genus, hjust = label_hjust)) +
coord_flip() +
scale_fill_manual(values = group_colors) +
scale_y_continuous(expression(log[10](italic("LDA score"))),
breaks = -6:6, limits = c(-6, 6)) +
theme_minimal() +
theme(axis.text.y = element_blank(),
axis.ticks.y = element_blank(),
axis.title.y = element_blank(),
legend.position = "top",
legend.justification = 0.05,
legend.title = element_blank(),
panel.grid.major.y = element_blank(),
panel.grid.minor.y = element_blank(),
panel.grid.major.x = element_line(colour = "grey80", linetype = "dashed"),
text = element_text(size = 9, color = "black"))

pl

结果:双侧显示不同分组的数值的条形图更为直观表示组间的差异。

如果大家有任何问题,欢迎留言沟通交流

生信学习者
生信教程分享,专注数据分析和科研绘图方向欢迎大家关注,也可一起探讨生信问题