大数跨境

分享10种好看的特色条形图绘制方法

分享10种好看的特色条形图绘制方法 奥智生物
2025-09-19
4
导读:全是干货!
line-height: 1.75;visibility: visible;" data-pm-slice="0 0 []" mpa-from-tpl="t">

Omicsmaster

点击蓝字 关注我们









url(from=appmsg");background-size: 100% 100% !important;background-position: 50% 50% !important;">

深度定制 让研究突破预期


条形图在科研数据展示中使用频率非常高,样式也丰富多样!下面主要为大家分享10种好看的特色条形图绘制方法,使用工具主要包含ggplot2、Origin、DeepSeek、OmicShare tools等,希望对大家有帮助。


1. 显著性标记柱状图




#读取数据
dt <- read.csv("test.csv",header = T)
#载入rstatix包
library(rstatix)
library(dplyr)
#按分组统计信息
stats_summary <- dt %>% df_group_by(Group) %>% get_summary_stats()
#对数据进行正态性检验(Shapiro-Wilk Normality Test);
dt %>% shapiro_test(vars = "Expressions")
# 使用两种方法进行方差齐性检验;
#Levene’s test for homogeneity of variance;
dt$Group <- as.factor(dt$Group)
dt %>% levene_test(Expressions ~ Group)
#Bartlett test of homogeneity of variances;
bartlett.test(Expressions~Group,data = dt)


从两种方法的统计结果来看(p-value 分别为0.1629 和0.278),方差是齐性的。


#使用rstatix包进行方差分析
dt %>% anova_test(Expressions~Group)
#使用基础函数进行方差分析,整体来看差异显著;
oneway<-aov(Expressions~Group,data = dt)
anova(oneway)

#使用Fisher LSD法进行均值比较;
#LSD法(Fisher’s Least Significant Difference);
#LSD法检验微小的差异,比较方便的是直接得出显著性字母标记,不需人工标记;
#install.packages("agricolae")
library("agricolae")
out <- LSD.test(oneway,"Group",p.adj="bonferroni")
# 整理用于作图的数据框
rowname<-row.names(out$means)
mean<-out$means[,1]
sd<-out$means[,2]
marker<-out$groups$groups
plotdata<-data.frame(rowname,mean,sd,marker)
plotdata



#ggplot2 绘制带显著性标记的柱状图
library("ggplot2")
p1<-ggplot(plotdata,aes(x=factor(rowname),y=mean))+geom_bar(position =position_dodge(0),fill="orange",width = 0.52,stat = "identity")
p2<-p1+geom_errorbar(aes(ymin=mean-sd,ymax=mean+sd),position=position_dodge(0.6),width=0.25)
p3<-p2+geom_text(aes(x=factor(rowname),y=mean+sd+0.1,label=marker),size=4,position = position_dodge(0.6))
p4<-p3+xlab("")+ylab("Lesion diameter (mm)")
p5<-p4+scale_y_continuous(limits = c(0, 4),expand=expansion(add = c(0, 0)))
#更改y轴显示范围,这里的expand默认为TRUE。
mytheme<-theme_classic()+theme(axis.title = element_text(size = 12),
                               axis.text = element_text(size=12),
                               panel.grid.major = element_line(color = "white"),
                               panel.grid.minor = element_line(colour = "white"),
                               axis.text.x = element_text(size = 12,angle=45,vjust=0.7,hjust=0.8,color = "black"),
                               axis.text.y = element_text(size = 12,color = "black"),
                               legend.text = element_text(size = 12),legend.title = element_blank(),
                               plot.margin = unit(c(0.5,0.5,0.5,0.5), "cm"))
p5+mytheme



2. 云雨图+柱状图组合图




#读入本地数据
df <- read.csv("testdata1.csv",header = T)
#载入dplyr包
library(dplyr)
#转成tibble格式
dt <- as_tibble(df)
#载入gghalves包和ggplot2包
library(ggplot2)
library(gghalves)
#自定义图表主题,对图表做精细调整;
top.mar=0.2
right.mar=0.2
bottom.mar=0.2
left.mar=0.2
#自定义绘图主题1
mytheme1 <- theme(panel.background = element_blank(),
                  axis.ticks.length=unit(1.6,"mm"),
                  plot.margin=unit(x=c(top.mar,right.mar,bottom.mar,left.mar),
                                   units="inches"))
#自定义绘图主题2
# 隐藏纵轴,并对字体样式、坐标轴的粗细、颜色、刻度长度进行限定;
mytheme2<-theme_classic()+
theme(text=element_text(family = "sans",colour ="gray30",size = 12),
        axis.line = element_line(linewidth = 0.6,colour = "gray30"),
        axis.ticks = element_line(linewidth = 0.6,colour = "gray30"),
        axis.ticks.length = unit(1.5,units = "mm"),
        plot.margin=unit(x=c(top.mar,right.mar,bottom.mar,left.mar),
                         units="inches"))
# 无需提前计算均值和标准差,直接绘制柱状图;
p1 <- ggplot(data=dt,mapping=aes(x=Sample,y=Linalool_content,
                                 color=Sample,fill=Sample))+
stat_summary(fun = mean,geom="col",alpha=0.6,
               width = 0.4,position = "identity",show.legend=F)
# 添加误差线;
# 这里的mult即multiplier(乘数,乘子),这里将误差线缩小到原本的一半;
p2 <- p1+stat_summary(fun.data=mean_sdl, fun.args = list(mult=1),
                      geom="errorbar",width=0.3,position = "dodge",show.legend=F)
# 在柱状图右侧添加云雨图;
p3<-p2+geom_half_violin(show.legend=F,nudge=0.3,scale="width",width = 0.3,
                        side='r',adjust=0.8,trim=F,color=NA,alpha=0.4)+
geom_half_point_panel(show.legend=F,nudge=0.6,
                        side = "r", shape=21, size=2.5, color="white")
# 使用position_nudge函数继续调整散点偏移位置;
p3<-p2+geom_half_violin(position=position_nudge(x=0.4,y=0),
                        show.legend=F,scale="width",width = 0.3,
                        side='r',adjust=0.8,trim=F,color=NA,alpha=0.4)+
geom_half_point_panel(position=position_nudge(x=0.1,y=0),
                        show.legend=F,side = "r", shape=21, 
                        size=3, color="white")
# 自定义颜色;
mycolor <- c("#6ca3d4","#bf95c1","#61c1bf","#a5d395","#edd283","#e1807e")
mycolor <- c("#0077c1","#00a99e","#6bc72b","#ff5a20","#ff1620","#752995")
# 修改坐标轴样式;
p4 <- p3 + scale_colour_manual(values=alpha(mycolor,1))+
scale_fill_manual(values=alpha(mycolor,0.4))+
scale_x_discrete( name = "") +
scale_y_continuous(name = "Linalool content",
                     expand = expansion(add = c(0.1,0.5)))
# 应用主题样式1;
p4+mytheme1



# 应用主题样式2;
p4+mytheme2



3. 上下对称条形图




# 读取差异分析表格;
exp <- read.csv("patient-control_diff_new.csv")
# 预览数据;
head(exp)



# 去掉没有symbol号的探针记录;
expr1 <- exp[exp$GENE_SYMBOL!='',]
# 查看筛选后的数据量;
dim(expr1)
#[1] 29833 6
library(dplyr)
# 根据logFC对表格进行降序排列;
expr2 <- arrange(expr1,desc(logFC))
# 根据Gene symbol列移除包含重复的行,.keep_all保留所有列;
expr3<- expr2 %>% distinct(GENE_SYMBOL, .keep_all = TRUE)
# 查看表格的行列数;
dim(expr3)
#[1] 21754 6
# 转成tibble便于后续使用,去掉不需要的列;
dt <- as_tibble(expr3[c(6,4,3)])
# 对p值取对数;
dt$log10PValue <- -log10(dt$P.Value)
# 生成显著上下调数据的分组标签;
dt$group <- case_when(dt$logFC > 1 & dt$P.Value < 0.05 ~ "Up",
                      dt$logFC < -1 & dt$P.Value < 0.05 ~ "Down",
                      abs(dt$logFC) <= 1 ~ "None",
                      dt$P.Value >= 0.05 ~ "None")
# 分别获取表达差异最显著的10个上下调基因;
up <- filter(dt,group=="Up") %>% top_n(10,logFC)
down <- filter(dt,group=="Down") %>% top_n(10,abs(logFC))
# 合并数据框;
df <- rbind.data.frame(up,down)
# 指定绘图顺序(从下到上),将group列转成因子型;
up$GENE_SYMBOL <- factor(up$GENE_SYMBOL,levels = rev(up$GENE_SYMBOL),ordered = T)
down$GENE_SYMBOL <- factor(down$GENE_SYMBOL,levels = rev(down$GENE_SYMBOL),ordered = T)
df$GENE_SYMBOL <- factor(df$GENE_SYMBOL,levels = rev(df$GENE_SYMBOL),ordered = T)
df



# 自定义图表主题1,对图表做精细调整;
mytheme1 <- theme_classic() +
theme(axis.text = element_blank(),
        axis.ticks = element_blank(),
        axis.line = element_blank(),
        axis.title = element_blank(),
        panel.border = element_blank(),
        legend.title.position = "left",
        legend.key.height=unit(0.5, "cm"),,
        legend.key.width=unit(0.4, "cm"),,
        legend.title = element_text(size = 9,hjust = 0.5, angle = 90),
        plot.margin=unit(x=c(0.5,0.2,0,0.2),units="inches"))

# 绘制上调基因部分的图表;
f1 <- ggplot(df, aes(x = logFC,y = GENE_SYMBOL,fill = log10PValue)) +
geom_col(data=up,color = "white",width=0.9,linewidth=0.7) +
labs(x="log2FC",y="",fill="-log10 Pvalue")+
geom_text(data=up,aes(label = GENE_SYMBOL,x = lx[1:10],color = group,
                hjust = ifelse(logFC < 0, 0, 1)),
            show.legend = F,size = 3,fontface = "bold")+
scale_color_manual(values = mycolor[2])+
scale_fill_gradient(low = "#ffffff",high = mycolor[2],
                      limits = c(0,12),breaks = c(0,3,6,9,12))+
scale_x_continuous(breaks = seq(-8, 8, by = 2),
                     limits = c(-8, 8),expand = c(0,0)) +
geom_text(data=up,aes(label = round(logFC,2),
                hjust = ifelse(logFC < 0, -0.2, 1.2),vjust = 0.5),
            color="vk9pt" style="color: #576B95 !important;" data-topic="1">#ffffff",size = 3,fontface = "bold")+
mytheme1
# 自定义图表主题2,对图表做精细调整;
mytheme2 <- theme_classic() +
theme(axis.text.y = element_blank(),
        axis.ticks.y = element_blank(),
        axis.line.y = element_blank(),
        panel.border = element_blank(),
        legend.title.position = "left",
        legend.key.height=unit(0.5, "cm"),,
        legend.key.width=unit(0.4, "cm"),,
        legend.title = element_text(size = 9,hjust = 0.5, angle = 90),
        axis.line = element_line(linewidth = 0.5,lineend = "square"),
        plot.margin=unit(x=c(0,0.2,0.1,0.2),units="inches"))

# 绘制下调基因部分的图表;
f2 <- ggplot(df, aes(x = logFC,y = GENE_SYMBOL,fill = log10PValue)) +
geom_col(data=down,color = "white",width=0.9,linewidth=0.7) +
labs(x="log2FC",y="",fill="-log10 Pvalue")+
geom_text(data=down,aes(label = GENE_SYMBOL,x = lx[11:20],color = group,
                hjust = ifelse(logFC < 0, 0, 1)),show.legend = F,
            size = 3,fontface = "bold")+
scale_color_manual(values = mycolor[1])+
scale_fill_gradient(low = "#ffffff",high = mycolor[1],
                      limits = c(0,12),breaks = c(0,3,6,9,12))+
scale_x_continuous(breaks = seq(-8, 8, by = 2),
                     limits = c(-8, 8),expand = c(0,0)) +
geom_text(data=down,aes(label = round(logFC,2),
                hjust = ifelse(logFC < 0, -0.2, 1.2),vjust = 0.5),
            color="#ffffff",size = 3,fontface = "bold")+
mytheme2
# 载入cowplot包进行上下拼图;;
library(cowplot)
plot_grid(f1, f2, ncol = 1, align = "v")



4. 线框标记柱状图




# 读入绘图数据;
dt <- read.table("out.Level2.xls",header = T,sep="\t")
head(dt,10)



# 载入所需R包;
library(dplyr)
# 按分组对数据进行降序排列;
df <- dt %>% arrange(Class,desc(number_of_gene))
# 转成因子,防止绘图时重新排序;
df$GO_Term <- factor(df$GO_Term,levels=df$GO_Term,ordered=TRUE)
# 载入ggplot2绘图包;
library(ggplot2)
# 绘制柱状图,隐藏横轴标签、标题、刻度、线条等;
p1 <- ggplot(df,aes(x=GO_Term,y=number_of_gene,fill=Class))+geom_col(width=0.8)+
labs(y = "Number of Genes")+
geom_text(aes(x=GO_Term,y=number_of_gene,label=number_of_gene),size=2.5,hjust=0.5,vjust=-0.3)+
# 设置纵轴位置与刻度标签;
scale_y_continuous(limits = c(0, 80),
                     breaks = c(0,20, 40, 60,80),
                     label = c("0","20""40""60","80"),
                     expand = expansion(mult = c(0,0)),
                     position = "right")+
scale_x_discrete(expand = expansion(mult = c(0.2,0.05)))+
# 设置图表样式和图例位置;
theme_classic()+
theme(axis.title.x = element_blank(),
        axis.text.x = element_blank(),
        axis.line.x = element_blank(),
        legend.position = "top",
        legend.title = element_blank(),
        legend.key.size = unit(3,"mm"),
        plot.margin = margin(t = 0, r = 10, b = 0, l = 10, unit = "mm"))
# 自定义颜色;
p2 <- p1+scale_fill_manual(values = c("#FF99CC","#99CC00","#FF9900"))
p2



# 以新图表的方式单独绘制横轴标签,隐藏掉坐标轴;
f1 <- ggplot(df,aes(x=GO_Term,y=1))
f2 <- f1+geom_text(aes(x=GO_Term,y=0,label=GO_Term),size=3,angle=60,hjust=1,vjust=0.5)+
scale_y_continuous(expand = expansion(mult = c(0.2,0)),position = "right")+
scale_x_discrete(expand = expansion(mult = c(0.2,0.05)))+
theme_void()+
theme(axis.text = element_blank(),
        axis.ticks = element_blank(),
        axis.title = element_blank(),
        plot.margin=margin(t = 1, r = 5, b = 1, l = 5, unit = "mm"))
# 创建线框路径的节点坐标数据框;
coord1 <- data.frame(x=c(0.4,-4.4,10.4,15.4),
                    y=c(0,-1,-1,0),
                    class=c(rep("BP",4)))

coord2 <- data.frame(x=c(0.6+15,-4.4+15,10.4+10,15.4+10),
                     y=c(0,-1,-1,0),
                     class=c(rep("CC",4)))

coord3 <- data.frame(x=c(0.5+15+10+0.1,-4.5+15+10+0.1,10.5+10+5+0.1,15.5+10+5+0.1),
                     y=c(0,-1,-1,0),
                     class=c(rep("MF",4)))
# 绘制线框;
f3 <- f2+geom_path(data=coord1,aes(x=x,y=y),color="#FF99CC",linewidth = 0.6)+
geom_path(data=coord2,aes(x=x,y=y),color="#99CC00",linewidth = 0.6)+
geom_path(data=coord3,aes(x=x,y=y),color="#FF9900",linewidth = 0.6)
f3



# 上下组合图表,完成图表绘制;
library(patchwork)
p2/f3



5. 富集分析条形图





原教程链接:

如何使用DeepSeek绘制彩色标签富集分析条形图?


6. 环状条形图




关于环状条形图的绘制,推荐使用OmicShare的动态柱状图工具,无需考虑太多,只需按照示例文件整理数据即可。



如果将形状类型设置为环状,则可以绘制文章中较为常见的环状条形图。



工具链接:

https://www.omicshare.com/tools/home/report/reporthistogram.html


原教程链接:

如何绘制“弯弯”的环状条形图?


7. 嵌套柱状图




这种“相互嵌套”的柱状图,非常适合组合比较。一般来说,适合这种图表的数据,需要满足一组数据的数值低于另一组。



原教程链接:

如何绘制“套在一起”的分组柱状图?


8. “中断”坐标轴柱状图




使用Origin绘制分组柱状图,然后给Y轴加“break“,点击Y轴,右键选择Scale,弹出的窗口,在Break选项卡,Number of设为1,取消勾选Auto Position,自定义截断区域。绘制效果如下:



原教程链接:

如何绘制坐标轴加“break”的柱状图?


9. 3D条形图




Origin可绘制多种类型的3D图表,使用鼠标可以对视图“推拉摇移”,方便切换不同的视角进行观察。特别是绘制水晶质感的透视3D柱状图,特别好看。



原教程链接:

如何绘制梦幻的“水晶”3D图表?


10. UpSet条形图




比较组数量过多时,可使用upset韦恩图进行展示,我们可以使用UpSetR包绘制该类图表。上方柱形图展示了集合特有或共有的交集元素数量,左方条形图展示各个集合中的元素总数,中心的交集矩阵中,单个颜色节点表示统计的特有元素信息,连线节点则表示统计的共有元素信息。



原教程链接:

让我看看是谁还不会画Upset图?


好啦,本次的特色条形图绘制教程就分享到这里啦!



*未经许可,不得以任何方式复制或抄袭本篇文章之部分或全部内容。版权所有,侵权必究。


Omicsmaster



让每一分科研投入

都物超所值


#科研绘图#条形图#生信分析#工具推荐#R语言

【声明】内容源于网络
0
0
奥智生物
广州奥智生物科技有限公司官方账号,旨在分享前沿组学技术、实用生信技巧、数据挖掘思路,一起在科研路上打怪升级啊!
内容 68
粉丝 0
奥智生物 广州奥智生物科技有限公司官方账号,旨在分享前沿组学技术、实用生信技巧、数据挖掘思路,一起在科研路上打怪升级啊!
总阅读237
粉丝0
内容68