R语言ggplot dodged barplot标签不对齐问题如何解决?
问题原因
geom_text的美学映射中未指定分组变量ustanova,ggplot无法识别标签需要和柱状图按照同一分组规则偏移,导致不同分组的标签偏移逻辑错位。geom_text设置的position_dodge(width = 1)和geom_bar默认的闪避宽度(默认值为0.9)不匹配,两者偏移幅度不一致自然无法对齐。- 复现代码存在笔误:
ggplot(bar)需要改为ggplot(dtf),否则会因找不到数据集报错。
修正方案
核心调整为三点:统一映射分组规则、统一柱状图和标签的闪避宽度、适配翻转坐标的对齐参数,修正后代码如下:
library(tidyverse) dtf <- structure(list(variable = structure(c(1L, 1L, 2L, 2L, 3L, 3L, 4L, 4L, 5L, 5L), .Label = c("vma", "vla", "ia", "fma", "fla"), class = "factor"), ustanova = structure(c(1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L), .Label = c("srednja škola", "fakultet"), class = "factor"), `(all)` = c(42.9542857142857, 38.7803203661327, 37.8996138996139, 33.7672811059908, 29.591439688716, 26.1890660592255, 27.9557692307692, 23.9426605504587, 33.2200772200772, 26.9493087557604)), .Names = c("variable", "ustanova", "(all)"), row.names = c(NA, 10L), class = c("cast_df", "data.frame"), idvars = c("variable", "ustanova"), rdimnames = list( structure(list(variable = structure(c(1L, 1L, 2L, 2L, 3L, 3L, 4L, 4L, 5L, 5L), .Label = c("vma", "vla", "ia", "fma", "fla"), class = "factor"), ustanova = structure(c(1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L), .Label = c("srednja škola", "fakultet"), class = "factor")), .Names = c("variable", "ustanova" ), row.names = c("vma_srednja škola", "vma_fakultet", "vla_srednja škola", "vla_fakultet", "ia_srednja škola", "ia_fakultet", "fma_srednja škola", "fma_fakultet", "fla_srednja škola", "fla_fakultet"), class = "data.frame"), structure(list(value = structure(1L, .Label = "(all)", class = "factor")), .Names = "value", row.names = "(all)", class = "data.frame"))) # 修正后绘图代码 ggplot(dtf, aes(x = variable, y = `(all)`, fill = ustanova)) + geom_col(position = position_dodge(width = 0.9)) + # 显式指定柱状图闪避宽度,geom_col适合直接传入y值生成柱状图 geom_text(aes(label = sprintf("%2.1f", `(all)`)), position = position_dodge(width = 0.9), # 和柱状图闪避宽度完全一致 vjust = 0.5) + # 垂直居中,适配翻转后的坐标布局 coord_flip()
如果需要标签显示在柱子外侧而非居中,只需把vjust调整为0,再加nudge_y = 1(数值可根据显示效果自行调整)即可。
内容的提问来源于stack exchange,提问作者djc55
相关产品推荐
相关产品推荐

