跟着高分SCI学画图:GPT教你绘制环状堆积柱状图和树状堆积柱状图

文摘   2024-08-12 19:30   德国  

跟着高分SCI学画图:GPT教你绘制环状堆积柱状图和树状堆积柱状图

介绍

环状柱状堆积图是一种数据可视化技术,它通过柱状图的不同排列和组合来展示数据的层次结构和组成。在这些图表中,不同的类型通过不同的方式展示数据的堆叠和分布效果。以下是几种常见的柱状堆积图类型:

堆叠柱状图(Stacked Bar Chart):堆叠柱状图将多个类别的数据堆叠在一起,每个柱子代表一个整体,而每个颜色层代表整体中的一部分。这种图表可以直观地展示各部分对整体的贡献以及各部分之间的比较。

环状条形图(Doughnut Bar Chart):环状条形图是条形图的一种变体,它将数据分成几个部分,每个部分用一个环形的条形表示。这种图表可以展示数据的组成比例,并且由于环形的设计,使得图表更加紧凑和美观。

柱状堆积图(Stacked Bar Chart with Percentages):柱状堆积图与堆叠柱状图类似,但每个柱子的高度是固定的,通常设置为100%。每个颜色层的高度是根据该部分在整体中的比例来计算的。这种图表可以清晰地展示各部分在整体中的比例关系。

分组柱状图(Grouped Bar Chart):分组柱状图将多个类别的数据并列显示,每个类别用一个柱子表示,不同类别的柱子并排放置。这种图表适合比较不同类别之间的数据。

树图+柱状堆积图(Tree Map + Stacked Bar Chart)--物种组成可视化:树图和柱状堆积图的结合是一种强大的数据可视化方式,可以用来展示复杂的层次结构和组成。树图通过嵌套的矩形展示层次结构,而柱状堆积图可以展示每个节点的组成部分。在物种组成的可视化中,这种组合图表可以清晰地展示不同物种及其在各层次结构中的比例和分布,帮助更好地理解生态系统的组成和动态。

我们分两期介绍如何用R实现这些图。

可视化展示

示例一:堆叠图

示例二:环状条形图

示例三:环状柱状堆积图+分组

示例四:树图+柱状堆积图--物种组成可视化

代码

示例一:数据展示

# Load necessary libraries
#如果没安装运行:  if(!require(你要安装的包))install.packages("你要安装的包")
if(!require(officer))install.packages("officer")
library(ggplot2)
library(reshape2)
library(dplyr)
library(officer)

# Read the dataset
data <- read.csv('你自己的数据.csv')
head(data, n = 10) 
# Calculate percentages for each cell type within each sample
data <- data %>%
  rowwise() %>%
  mutate(sum = sum(c_across(-Sample)), across(-Sample, ~ .x / sum)) %>%
  select(-sum)

# Reshape the data for plotting
data_melted <- melt(data, id.vars = 'Sample')

# Define the colors
my_colors <- c('#E69F00','#86b880''#067b41''#56B4E9''#6a984c''#F0E442',
               '#009E73''#94c54e''#a2d6f0''#0785ba''#404999''#c12740')

# Plot the percentage stacked bar chart with the specified colors and adjusted bar width
ggplot(data_melted, aes(x = Sample, y = value, fill = variable)) +
  geom_bar(stat = 'identity', position = 'fill', width = 0.75) +  # Adjust bar width here
  scale_fill_manual(values = my_colors) +
  theme_minimal() +
  labs(x = 'Sample', y = 'Percentage', fill = 'Cell Type')

# 保存图形到文件
ggsave("1.png", width = 9, height = 9, dpi = 600)
# 保存绘图
library(eoffice)
topptx(filename="堆叠图.pptx", height = 8, width = 7)

示例二:数据展示

  # 设置工作目录
  setwd("你自己的工作目录")
  
  # 读取CSV文件
  data <- read.csv('你自己的数据.csv', stringsAsFactors = TRUE)
  head(data, n = 10)
  
  # 创建顺序向量
  category_order <- c(...)  #你自己的数据的向量
  
  # 确保数据框中的Category列是一个因子并且按照我们提供的顺序来
  data$Category <- factor(data$Category, levels = category_order)
  
  # 载入必要的包
  library(ggplot2)
  library(reshape2)
  
  # 将数据从宽格式转换为长格式,以适合ggplot2使用
  data_long <- melt(data, id.vars = 'Category', variable.name = 'ConservationStatus', value.name = 'Percentage')
  
  # 创建ggplot对象
  p <- ggplot(data_long, aes(x = Category, y = Percentage, fill = ConservationStatus))
  
  # 添加柱状图,堆积列图在极坐标中不适用,因此这里不使用position='stack'
  p <- p + geom_bar(stat = 'identity')
  
  # 设置极坐标,但请注意极坐标系不适用于堆积条形图
  p <- p + coord_polar(theta = "x"
  
  # 设置颜色比例尺
  p <- p + scale_fill_brewer(palette = "Set3")
  
  # 设置主题
  p <- p + theme_minimal() +
    theme(axis.text.x = element_text(angle = 45, hjust = 1))
  
  # 打印图表查看效果
  print(p)
  
  # 保存图表
  ggsave("2.png", p, height = 6, width = 12)
  
  # 如果需要将图表保存到 PowerPoint,使用eoffice包
  library(eoffice)
  topptx(filename = "2.pptx", value = p, height = 5, width = 7)

示例三:数据展示

setwd("你自己的工作目录")
# 调用R包
#如果没安装这些包运行:  if(!require(你要安装的包))install.packages("你要安装的包")
if(!require(viridis))install.packages("viridis")
library(tidyverse)
library(viridis)

# 读取数据
data <- read.csv("你自己的数据.csv")
head(data,n=10)
# 数据预处理和添加空白间隔的代码保持不变
empty_bar <- 2
data <- data %>% arrange(group, individual)
data$id <- rep(seq(1, nrow(data)/length(unique(data$observation))), each=length(unique(data$observation)))

# 获取每个标签的名称和y轴位置
label_data <- data %>% group_by(id, individual) %>% summarize(tot=sum(value, na.rm=T))
number_of_bar <- nrow(label_data)
angle <- 90 - 360 * (label_data$id-0.5) /number_of_bar
label_data$hjust <- ifelse(angle < -90, 1, 0)
label_data$angle <- ifelse(angle < -90, angle+180, angle)

# 为基线准备一个数据帧
base_data <- data %>% 
  group_by(group) %>% 
  summarize(start=min(id), end=max(id) - empty_bar) %>% 
  rowwise() %>% 
  mutate(title=mean(c(start, end)))

# 为grid准备一个数据帧
grid_data <- base_data
grid_data$end <- grid_data$end[ c( nrow(grid_data), 1:nrow(grid_data)-1)] + 1
grid_data$start <- grid_data$start - 1
grid_data <- grid_data[-1,]

# 绘图
p <- ggplot(data) +      
  geom_bar(aes(x=as.factor(id), y=value, fill=observation), stat="identity", alpha=0.8) +
  # scale_fill_viridis(discrete=TRUE) +
  # scale_fill_manual(values=c("#98d09d", "#f7a895", "#9b8191","#d7e698")) +  # 使用自定义颜色
  # scale_fill_manual(values=c("#DAF2E1", "#7CD7B1", "#327AA3", "#3E458B")) +  # 使用自定义颜色
  scale_fill_manual(values=c( "#56B4E9""#a2d6f0","#7CD7B1","#DAF2E1")) +  # 使用自定义颜色

  # Add a val=100/75/50/25 lines.
  geom_segment(data=grid_data, aes(x = end, y = 0, xend = start, yend = 0), colour = "grey", alpha=1, size=0.3 , inherit.aes = FALSE ) +
  geom_segment(data=grid_data, aes(x = end, y = 50, xend = start, yend = 50), colour = "grey", alpha=1, size=0.3 , inherit.aes = FALSE ) +
  geom_segment(data=grid_data, aes(x = end, y = 100, xend = start, yend = 100), colour = "grey", alpha=1, size=0.3 , inherit.aes = FALSE ) +
  geom_segment(data=grid_data, aes(x = end, y = 150, xend = start, yend = 150), colour = "grey", alpha=1, size=0.3 , inherit.aes = FALSE ) +
  geom_segment(data=grid_data, aes(x = end, y = 200, xend = start, yend = 200), colour = "grey", alpha=1, size=0.3 , inherit.aes = FALSE ) +
  
  # 添加显示100/75/50/25的文本
  # ggplot2::annotate("text", x = rep(max(data$id),5), y = c(0, 50, 100, 150, 200), label = c("0", "50", "100", "150", "200") , color="grey", size=6 , angle=0, fontface="bold", hjust=1) +
  
  ylim(-150,max(label_data$tot, na.rm=T)) +
  theme_minimal() +
  theme(
    # legend.position = "none", # 注释掉这行,以显示图例
    axis.text = element_blank(),
    axis.title = element_blank(),
    panel.grid = element_blank(),
    plot.margin = unit(rep(-1,4), "cm"
  ) +
  coord_polar() +
  
  # 在每个条形图顶部添加一个标签
  geom_text(data=label_data, aes(x=id, y=tot+10, label=individual, hjust=hjust), color="black", fontface="bold",alpha=0.6, size=5, angle= label_data$angle, inherit.aes = FALSE ) +
  
  # 添加基线信息
  geom_segment(data=base_data, aes(x = start, y = -5, xend = end, yend = -5), colour = "black", alpha=0.8, size=0.6 , inherit.aes = FALSE )  +
  geom_text(data=base_data, aes(x = title, y = -18, label=group), hjust=c(1,1,0,0), colour = "black", alpha=0.8, size=4, fontface="bold", inherit.aes = FALSE)

p

#保存绘图
library(eoffice)
topptx(filename="2.pptx",height = 4,width = 5)

# 输出图片(可选)
ggsave(p, file="output.png", width=10, height=10,bg="white")

示例四:数据展示

rm(list=ls())#clear Global Environment
setwd("你自己的工作目录")

#加载R包
#如果没安装这些包运行:  if(!require(你要安装的包))install.packages("你要安装的包")
if(!require(ggtree))install.packages("ggtree")
if(!require(vegan))install.packages("vegan")
library (reshape2)
library(ggplot2) # Create Elegant Data Visualisations Using the Grammar of Graphics
library(plyr) # Tools for Splitting, Applying and Combining Data
library(ggtree) # an R package for visualization of tree and annotation data
library(vegan) # Community Ecology Package
library(ape) # Analyses of Phylogenetics and Evolution
library( RColorBrewer) # not installed on this machine
library(aplot) # Decorate a 'ggplot' with Associated Information

#读取数据
df1 <- read.table(file="你自己的数据.txt",sep="\t",header=T,check.names=FALSE)
#查看前10行
head(df1,n=10)
##利用循环处理具有重复的数据
#初始化
data<-aggregate(E ~ Tax,data=df1,sum)
#重命名
colnames(data)[2]<-"example"
for (i in colnames(df1)[2:length(colnames(df1))]){
  #计算每列的和
  data1<-aggregate(df1[,i]~Tax,data=df1,sum)
  colnames(data1)[2]<-i  
  #合并列
  data<-merge(data,data1,by="Tax")
  }
df2<-data[,-2]
rownames(df2)=df2$Tax#修改行名
df3=df2[,-1]#删除多的列

#计算物种总丰度并降序排列
df3$rowsum <- apply(df3,1,sum)
df4 <- df3[order (df3$rowsum,decreasing=TRUE),]
df5 = df4[,-6]#删除求和列
#求物种相对丰度
df6 <- apply(df5,2,function(x) x/sum(x))
#由于之间已经按照每行的和进行过升序排列,所以可以直接取前10行
df7 <-  df6[1:10,]
df8 <- 1-apply(df7, 2, sum) #计算剩下物种的总丰度
#合并数据
df9 <- rbind(df7,df8)
row.names(df9)[11]="Others"
#导出数据
write.table (df9, file ="genus_x.csv",sep =",", quote =FALSE)
#变量格式转换,宽数据转化为长数据,方便后续作图
df_genus <- melt(df9)
names(df_genus)[1:2] <- c("Taxonomy","sample")  #修改列名
#颜色
col <-colorRampPalette(brewer.pal(12,"Paired"))(11)
##柱状堆积图绘制绘图
p1<-ggplot(df_genus, aes( x = sample,y=100 * value,fill = Taxonomy))+#geom_col和geom_bar这两条命令都可以绘制堆叠柱形图
  geom_col(position = 'stack',width = 0.8)+
  #geom_bar(position = "stack", stat = "identity", width = 0.6) 
  scale_y_continuous(expand = c(0,0))+# 调整y轴属性,使柱子与X轴坐标接触
  labs(x=NULL,y="Relative Abundance(%)",#设置X轴和Y轴的名称以及添加标题
       fill="Taxonomy")+
  guides(fill=guide_legend(keywidth = 1, keyheight = 1)) +
  coord_flip()+
  theme(panel.grid = element_blank(),
        panel.background = element_blank())+
  scale_fill_manual(values = col)
p1     

####聚类树
data2 <- df3[-6]
#计算距离矩阵
df_dist <- vegdist(t(data2),method = 'bray')#使用bray curtis方法计算距离矩阵
####进行层次聚类,可选择方法有single、complete、median、mcquitty、average 、centroid 、ward 
df_hc <- hclust(df_dist,method="average")#使用类平均法进行聚类
#绘图
plot(as.dendrogram(df_hc),type="rectangle",horiz=T)#实现将垂直的聚类树变成水平聚类树,绘图
# 将聚类结果转成系统发育格式
df_tree <- as.phylo(df_hc)
# 对树分组
gro <- list(group1=c("A","E"),
            group2=c("C","D"),
            group3=c("B"))
# 将分组信息和进化树组合到一起
tree<-groupOTU(df_tree,gro)
# ggtree绘图
p2 <- ggtree(tree,size=1.2)+
  geom_tiplab(aes(color=group),size=5,align = F,
              offset = 0.008,show.legend = F)+
  geom_tippoint(aes(shape=group,color=group),
              show.legend = T,
              size=4)
p2


#####将柱状堆积图与树图进行组合
p1 <- p1+theme(axis.text.y = element_text(color = "grey",size=12))
col2 <-colorRampPalette(brewer.pal(9,"Set1"))(3)
p3 <- ggtree(tree,size=1)+
  geom_tippoint(aes(shape=group,color=group),
                show.legend = T,
                size=4)+
  scale_color_manual(values = col2)
p <- p1%>%insert_left(p3,width = 0.3)
p

本文作者:李家旭


现在:


长按扫码关注:科研生信充电宝


10元赞赏本文,即喜欢作者~


即可直接解锁:


《跟着高分SCI学画图:GPT教你绘制环状堆积柱状图和树状堆积柱状图》对应资源哦~


看到这里你还不心动吗?


赶紧关注、转发、点赞、分享,领取你的专属福利吧~



好啦,以上就是今天推文的全部内容啦!


版权声明:本文内容由互联网用户自发贡献,版权归作者所有,本公众号不拥有所有权,也不承担相关法律责任。

如果您发现本公众号中有涉嫌抄袭的内容,欢迎发送邮件至:kysxcdb@163.com 进行举报,一经查实,本公众号将立刻删除涉嫌侵权内容。



科研生信充电宝
介绍科研;介绍统计;介绍生信;
 最新文章