在实验数据可视化过程中,经常需要对多个样本在多个处理条件下多种指标进行比较,使用下面这种分组堆叠条形图能从多个角度同时展示数据特征。
备注:图中横轴以“0”为界左右分为两部分,可以用来表示处理A和处理B,纵轴表示样品,每行条形图中不同颜色分别代表不同类型的指标。
今天分享的内容是在R语言中绘制该图的方法,包括数据的整理准备过程,以及绘图所用的代码,所有数据均随机生成,无实际意义。
使用R语言中plotly包可以将堆叠条形图转换为交互式动态图,鼠标移动时即可显示每个彩色小条的具体信息,方便进行数据探索和挖掘。
library(tidyverse)
library(ggtext)
library(magrittr)
library(ggprism)
library(MetBrewer)
library(plotly)
以上是绘图所用到的一些R包,主要是使用R语言中ggplot绘图体系,动态交互使用plotly实现。
df <- as.data.frame(matrix(nrow = 1000,ncol = 4))
df$V1[1:500] <- runif(500,min = 10,max = 30)
df$V1[501:800] <- runif(300,min = 50,max = 100)
df$V1[801:1000] <- runif(200,min = 90,max = 120)
第一列数字是随机生成的1000个值,用于映射绘图时每个条形图的长度。
df$V2[sample(1000,400)] <- "A"
df$V2[is.na(df$V2)] <- "B"
-------------------------------
df$V3[1:100] <- "Type 1"
df$V3[101:200] <- "Type 2"
df$V3[201:300] <- "Type 3"
df$V3[301:400] <- "Type 4"
df$V3[401:500] <- "Type 5"
df$V3[501:600] <- "Type 6"
df$V3[601:700] <- "Type 7"
df$V3[701:900] <- "Type 8"
df$V3[901:1000] <- "Type 9"
第二列分随机分成A和B两组,用来表示处理前和处理后,或者其他分组处理。第三类添加分类信息,绘图时用不同颜色映射不同分类。
df$V4 <- rep(paste0("Sam",1:25),40)
df$V4 <- factor(df$V4,levels = c(paste0("Sam",1:25)))
colnames(df) <- c("value","group","type","class")
整理完成之后,数据格式如下:
df %>%
ggplot(aes(y=class,x = ifelse(group == "A",-value,value),fill =type)) +
geom_bar(stat = "identity",position = "stack")
先使用最基础的条形图进行绘制,已经能大概看到雏形了,主要是颜色的区别,接下来调整颜色。
p <- df %>%
ggplot(aes(y=class,x = ifelse(group == "A",-value,value),fill =type)) +
geom_bar(stat = "identity",position = "stack")+
scale_fill_manual(values=met.brewer("Cassatt2",9))+
scale_x_continuous(guide = "prism_minor",expand = c(0,0),limits=c(-1500,2000),
breaks=seq(-1500,1500,300))+
geom_vline(xintercept = 0,linetype = 2)+ # 添加垂直线
labs(x="Some test value",y="Some Sample ID")
然后在进行稍微的美化,添加上主题设置代码,即可大功告成。
p <- p + theme(axis.text.y=element_text(color="black",size=8,margin=margin(r=1)),
axis.text.x=element_text(color="black",size=9,margin=margin(t=8)),
axis.title.x = element_text(size=11,margin=margin(t=8),color="black",face="bold"),
plot.margin=unit(c(0.3,0.3,0.3,0.3),units=,"cm"),
panel.background = element_blank(),
prism.ticks.length.y = unit(2, "pt"),
prism.ticks.length.x = unit(-5, "pt"),
axis.line = element_line(color="black"),
axis.ticks.length.x = unit(-.2, "cm"),
legend.key = element_blank(),
legend.background = element_blank(),
legend.title = element_blank(),
legend.text=element_text(size=8,color="black"),
legend.spacing.x=unit(0.1,'cm'),
legend.key.width=unit(0.4,"cm"),
legend.key.height=unit(0.4,"cm"),
legend.position = c(0.001,1.02), # 定义图例位置
legend.justification = c(0,1)
)
还有一个隐藏小细节,在上图中标注分组“A”和“B”,使用annotate功能添加。
p <- p + annotate(geom="text",y=5,x=-1200,label="A",size=4,fontface="bold")+
annotate(geom="text",y=5,x=1700,label="B",size=4,fontface="bold")
通过刚刚的绘图过程已经得到了一个ggplot2对象,使用plotly即可对其进行转换,变为交互式图像。
plotly::ggplotly(p)
至此,感谢您的阅读!如果您喜欢本文分享的可视化方法,欢迎转发分享给更多朋友,如需获得本文测试数据和代码,后台联系即可免费下载。
参考资料:https://mp.weixin.qq.com/s/GPQ5LPSlU6yq08nOb3t5Qg
本文由 mdnice 多平台发布