R语言ggplot2可视化:分组堆叠条形图,展示不同分组的多个处理数据特征,动态交互式条形图

在实验数据可视化过程中,经常需要对多个样本在多个处理条件下多种指标进行比较,使用下面这种分组堆叠条形图能从多个角度同时展示数据特征。

R语言ggplot2可视化:分组堆叠条形图,展示不同分组的多个处理数据特征,动态交互式条形图_第1张图片

备注:图中横轴以“0”为界左右分为两部分,可以用来表示处理A和处理B,纵轴表示样品,每行条形图中不同颜色分别代表不同类型的指标。

今天分享的内容是在R语言中绘制该图的方法,包括数据的整理准备过程,以及绘图所用的代码,所有数据均随机生成,无实际意义。

R语言ggplot2可视化:分组堆叠条形图,展示不同分组的多个处理数据特征,动态交互式条形图_第2张图片

使用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")

整理完成之后,数据格式如下:

R语言ggplot2可视化:分组堆叠条形图,展示不同分组的多个处理数据特征,动态交互式条形图_第3张图片

绘制堆叠条形图

df %>% 
    ggplot(aes(y=class,x = ifelse(group == "A",-value,value),fill =type)) + 
    geom_bar(stat = "identity",position = "stack")
R语言ggplot2可视化:分组堆叠条形图,展示不同分组的多个处理数据特征,动态交互式条形图_第4张图片

先使用最基础的条形图进行绘制,已经能大概看到雏形了,主要是颜色的区别,接下来调整颜色。

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")
R语言ggplot2可视化:分组堆叠条形图,展示不同分组的多个处理数据特征,动态交互式条形图_第5张图片

然后在进行稍微的美化,添加上主题设置代码,即可大功告成。

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)
    )
R语言ggplot2可视化:分组堆叠条形图,展示不同分组的多个处理数据特征,动态交互式条形图_第6张图片

还有一个隐藏小细节,在上图中标注分组“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")
R语言ggplot2可视化:分组堆叠条形图,展示不同分组的多个处理数据特征,动态交互式条形图_第7张图片

动态交互图

通过刚刚的绘图过程已经得到了一个ggplot2对象,使用plotly即可对其进行转换,变为交互式图像。

plotly::ggplotly(p)
R语言ggplot2可视化:分组堆叠条形图,展示不同分组的多个处理数据特征,动态交互式条形图_第8张图片

至此,感谢您的阅读!如果您喜欢本文分享的可视化方法,欢迎转发分享给更多朋友,如需获得本文测试数据和代码,后台联系即可免费下载。

参考资料:https://mp.weixin.qq.com/s/GPQ5LPSlU6yq08nOb3t5Qg

本文由 mdnice 多平台发布

你可能感兴趣的:(后端)