专注收集和自写可发表的科研图形的数据和代码分享,该系列的数据均可从以下链接下载:
百度云盘链接: https://pan.baidu.com/s/1M4vgU1ls0tilt0oSwFbqYQ
提取码: 请关注WX公zhong号 生信学习者 后台发送 科研绘图 获取提取码
介绍
双侧条形图上的每个条形代表一个特定的细菌属,条形的高度表示该属的LDA得分的对数值,颜色用来区分不同的分类群或组别,它具有以下优点:
可视化差异:条形图可以直观地展示不同细菌属在得分上的差异。
强调重要性:较高的条形表示某些特征在区分不同组别中具有重要作用。
对数刻度:使用对数刻度可以帮助展示得分的相对大小,尤其是在得分范围很广的情况下。
分类展示:通过颜色或分组,可以展示不同分类群或组别中的特征的分布情况。
加载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)
genus | class | value | ||
---|---|---|---|---|
1 | Prevotella | groupA | 4.497311 | |
2 | Streptococcus | groupA | 4.082377 | |
3 | YRC22 | groupA | 3.578472 | |
4 | Phascolarctobacterium | groupA | 3.567310 | |
5 | SMB53 | groupA | 3.410453 | |
6 | Epulopiscium | groupA | 3.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)
genus | class | value | label_y | label_hjust | |
---|---|---|---|---|---|
1 | Prevotella | groupA | 4.497311 | -0.2 | 1 |
2 | Streptococcus | groupA | 4.082377 | -0.2 | 1 |
3 | YRC22 | groupA | 3.578472 | -0.2 | 1 |
4 | Phascolarctobacterium | groupA | 3.567310 | -0.2 | 1 |
5 | SMB53 | groupA | 3.410453 | -0.2 | 1 |
6 | Epulopiscium | groupA | 3.390026 | -0.2 | 1 |
双侧条形图
使用ggplot2语法画图,下列是代码的解释:
ggplot(plotdata, aes(x = genus, y = value, fill = class))
:初始化ggplot对象。plotdata
是包含绘图数据的数据框(data frame)。aes()
函数定义了美学映射,即数据如何映射到图形的美学属性上。这里将genus
映射到x轴,value
映射到y轴,class
用于填充颜色。geom_bar(stat = "identity", col = "black", width = 0.7)
:添加条形图层。stat = "identity"
表示使用数据中的value
作为条形的高度,col = "black"
设置条形的边框颜色为黑色,width = 0.7
设置条形的宽度。geom_text(aes(y = label_y, label = genus, hjust = label_hjust))
:在条形图上添加文本标签。这里文本标签的内容是genus
,位置通过label_y
和hjust
(水平对齐方式)来确定。coord_flip()
:将坐标轴翻转,使得x轴和y轴互换位置。scale_fill_manual(values = group_colors)
:手动设置条形的填充颜色。group_colors
是一个包含颜色值的向量,用于为不同的class
值指定颜色。scale_y_continuous(expression(log[10](italic("LDA score"))), breaks = -6:6, limits = c(-6, 6))
:设置y轴的刻度和标签。这里使用对数刻度(10的对数),标签使用斜体表示"LDA score"。breaks
定义了y轴的刻度间隔,limits
定义了y轴的范围。theme_minimal()
:应用一个简洁的主题样式。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
结果:双侧显示不同分组的数值的条形图更为直观表示组间的差异。
如果大家有任何问题,欢迎留言沟通交流