如何使用ggplot2以不同的方式在此负数和正数栏中添加轴文本?

鸭博士

我绘制了研究熟悉的带有正负条形的条形图但是,我的代码使用graphics::plot()显得极为不便和冗长graphics::text()如下所示。element_text我所能,我可以在中找到用于实现的解决方案ggplot2ggplot2预先提供帮助或尝试提供一些想法。谢谢。在此处输入图片说明

# my data
df <- 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)
     )

# bar graph 
tiff(file="lefse.tiff",width=2000,height=2000,res=400)
par(mar=c(5,2,1,1))
barplot(df[,3],horiz=T,xlim=c(-6,6),xlab="LDA score (log 10)",
        col=c(rep("forestgreen",length(which(df[,2]=="groupA"))),
              rep("goldenrod",length(which(df[,2]=="groupB")))))
axis(1,at=seq(-6,6,by=1))
# add text
text(0.85,36.7,label=df[,1][31],cex=0.6);text(0.75,35.4,label=df[,1][30],cex=0.6)
text(0.75,34.1,label=df[,1][29],cex=0.6);text(0.85,33.0,label=df[,1][28],cex=0.6)
text(0.75,31.8,label=df[,1][27],cex=0.6);text(0.6,30.6,label=df[,1][26],cex=0.6)
text(0.8,29.5,label=df[,1][25],cex=0.6);text(0.85,28.3,label=df[,1][24],cex=0.6)
text(0.45,27.1,label=df[,1][23],cex=0.6);text(0.4,25.9,label=df[,1][22],cex=0.6)
text(0.55,24.7,label=df[,1][21],cex=0.6);text(0.55,23.5,label=df[,1][20],cex=0.6)
text(0.85,22.3,label=df[,1][19],cex=0.6);text(-0.75,21.1,label=df[,1][18],cex=0.6)
text(-1,19.9,label=df[,1][17],cex=0.6);text(-1,18.8,label=df[,1][16],cex=0.6)
text(-0.85,17.6,label=df[,1][15],cex=0.6);text(-0.85,16.3,label=df[,1][14],cex=0.6)
text(-0.7,15.1,label=df[,1][13],cex=0.6);text(-0.65,13.9,label=df[,1][12],cex=0.6)
text(-0.85,12.7,label=df[,1][11],cex=0.6);text(-1.05,11.5,label=df[,1][10],cex=0.6)
text(-0.85,10.3,label=df[,1][9],cex=0.6);text(-0.85,9.1,label=df[,1][8],cex=0.6)
text(-0.47,7.9,label=df[,1][7],cex=0.6);text(-0.85,6.7,label=df[,1][6],cex=0.6)
text(-0.49,5.5,label=df[,1][5],cex=0.6);text(-1.44,4.3,label=df[,1][4],cex=0.6)
text(-0.49,3.1,label=df[,1][3],cex=0.6);text(-0.93,1.9,label=df[,1][2],cex=0.6)
text(-0.69,0.7,label=df[,1][1],cex=0.6)
# add lines
segments(0,-1,0,40,lty=3,col="grey")
segments(2,-1,2,40,lty=3,col="grey")
segments(4,-1,4,40,lty=3,col="grey")
segments(6,-1,6,40,lty=3,col="grey")
segments(4,-1,4,40,lty=3,col="grey")
segments(-2,-1,-2,40,lty=3,col="grey")
segments(-4,-1,-4,40,lty=3,col="grey")
segments(-6,-1,-6,40,lty=3,col="grey")
legend("topleft",bty="n",cex=0.65,inset=c(0.01,-0.02),ncol=2,
       legend=c("groupA","groupB"),
       col=c("forestgreen", "goldenrod"),pch=c(15,15))
dev.off()
尼克·肯尼迪

这是一个解决方案dplyr,用于为标签位置和对正创建一些额外的列,然后为绘图设置主题以使其与您原来的内容合理匹配:

library("dplyr")
library("ggplot2")
df <- df %>%
  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)
  )

my_plot <- ggplot(df, aes(x = genus, y = value, fill = class)) +
  geom_bar(stat = "identity", col = "black") +
  geom_text(aes(y = label_y, label = genus, hjust = label_hjust)) +
  coord_flip() +
  scale_fill_manual(values = c(groupA = "forestgreen", groupB = "goldenrod")) +
  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"),
        panel.grid.minor.x = element_blank()) +
  scale_y_continuous(expression(log[10](italic("LDA score"))),
                     breaks = -6:6, limits = c(-6, 6))

print(my_plot)
ggsave("lefse.tiff", width = 5, height = 5, dpi = 400, my_plot)

在此处输入图片说明

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用ggplot2在此图中获取轴刻度和刻度?

如何从同一列中添加正数和负数

Javascript如何添加负数和正数

如何在ggplot2 R中向轴添加子文本

ggplot2直方图:如何使用ggplot2将文本注释添加到直方图栏上

在ggplot2中添加x和y轴标签

如何在 ggplot2 轴刻度标签中添加上标逗号和空格?

ggplot2轴文本中的上标

以编程方式处理ggplot2轴文本面

如何使用日期删除ggplot2中轴和区域图之间的空间

如何在躲避的条形图(ggplot2)中向x轴添加图例文本

如何在ggplot2中使用geom_tile控制连续轴和离散轴的长宽比?

使用x和y轴在ggplot2中的日志缩放方面有所不同

为ggplot2中的每个方面添加不同的辅助x轴

使用ggplot2在轴的特定点添加自定义文本

如何在ggplot2中使用不同的映射向散点图添加函数

使用“表达式”在ggplot2轴文本中制作特殊字符时的文本对齐

如何更改ggplot2中x和y轴的刻度标签,轴消失

ggplot2:如何调整绘图区域和轴文本之间的间距

使用ggplot2和facet_wrap显示不同的轴标签

更改ggplot2中轴文本的字体大小和方向

如何从列表中计算每组中的负数和正数?

如何从数组中定位负数,并获取所有正数的和?

如何使用ggplot2在R中的2-y轴图的两个轴上添加千位分隔符

用ggplot2中的不同列标记y轴

使用javascript将数组中的正数和负数分开

使用ggplot2将文本注释为x轴

使用 ggplot2 stat_summary 和 geom col 创建不同的总和栏

在ggplot2中添加辅助x轴标签