错位条形图中geom_text的水平对齐
我正在研究一个图形,按建议将其从一个“堆叠式”柱状图改为一个“并排柱状图”。看起来一切都运行正常;然而,我添加的 geom_text 标签现在完全错位……
具体来说,它们应该位于每个柱子中间(水平居中于每一列之上),但由于某些原因似乎没有发生。非常感谢您的帮助,下面是我使用的代码和绘图输出。
library(ggh4x)
library(ggtext)
library(ggplot2)
library(MetBrewer)
ggplot(eval, aes(fill=reference, alpha=technology, y=value, x=metric)) +
geom_bar(position=position_dodge2(width=.4,
padding=0,
preserve="single"),
stat="identity") +
facet_wrap2(~variant_type) + theme_bw() +
theme(legend.title=element_text(face='italic'), legend.position='bottom',
axis.title.x=element_blank(), axis.title.y=element_blank(),
panel.grid=element_blank()) +
guides(fill=guide_legend(title.position='top', title.hjust=.5),
alpha=guide_legend(title.position='top', title.hjust=.5)) +
scale_fill_manual(values=met.brewer("Navajo", 5)[c(4,3)]
) +
scale_alpha_manual(values=c(
"PacBio HiFi"=.75,
"Illumina PE"=.5
)
) +
geom_text(aes(y=value, x=metric, label=paste0(formatC(round(value, 4),format="f", digits=4))), angle=75,
hjust=-.1, size=2, fontface="bold", position=position_dodge2(width=.4),
show.legend=FALSE, inherit.aes=FALSE) +
scale_y_continuous(expand=expansion(mult=0, add=c(0,0.05)))

dput 属于 eval
eval <- structure(list(variant_type = structure(c(1L, 1L, 1L, 1L, 1L,
1L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 1L, 1L, 1L,
1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L), levels = c("SNVs", "INDELs",
"SVs"), class = "factor"), reference = c("linear", "linear",
"linear", "graph", "graph", "graph", "linear", "linear", "linear",
"graph", "graph", "graph", "linear", "linear", "linear", "graph",
"graph", "graph", "linear", "linear", "linear", "graph", "graph",
"graph", "linear", "linear", "linear", "graph", "graph", "graph"
), metric = structure(c(1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L,
2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L,
3L, 1L, 2L, 3L), levels = c("recall", "precision", "F1"), class = "factor"),
value = c(0.750453, 0.954913, 0.840426, 0.865383, 0.981827,
0.919935, 0.771026, 0.878681, 0.821341, 0.670769, 0.449633,
0.538378, 0.729574, 0.944749, 0.823335, 0.948476, 0.740902,
0.831937, 0.599937, 0.946995, 0.734534, 0.80045, 0.974009,
0.878741, 0.608545, 0.795764, 0.689675, 0.778621, 0.814081,
0.795956), technology = c("PacBio HiFi", "PacBio HiFi", "PacBio HiFi",
"PacBio HiFi", "PacBio HiFi", "PacBio HiFi", "PacBio HiFi",
"PacBio HiFi", "PacBio HiFi", "PacBio HiFi", "PacBio HiFi",
"PacBio HiFi", "PacBio HiFi", "PacBio HiFi", "PacBio HiFi",
"PacBio HiFi", "PacBio HiFi", "PacBio HiFi", "Illumina PE",
"Illumina PE", "Illumina PE", "Illumina PE", "Illumina PE",
"Illumina PE", "Illumina PE", "Illumina PE", "Illumina PE",
"Illumina PE", "Illumina PE", "Illumina PE")), row.names = c(NA,
-30L), class = c("tbl_df", "tbl", "data.frame"))
解决方案
将 data = ~dplyr::arrange(., reference, technology), 添加到geom_text的层级。
问题在于柱状层是按这种方式排序,而文本层则按数据中出现的顺序绘制,并且在dodge的影响下,导致标签与柱状之间错位。
(我也调整到了 position=position_dodge2(width = 0.9, preserve = "single"),,但我不清楚为何需要这样做。)
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。
