如何在ggplot2金字塔图中添加带%且无负号的标签?
金字塔图标签格式修正方案
要实现移除标签负号、添加%符号的需求,只需修改geom_text的标签生成逻辑,并调整文本位置避免遮挡,具体操作如下:
核心修改内容
- 用
abs(Value)去除负号,通过paste0()拼接%生成目标标签文本 - 添加
hjust参数,根据性别调整文本对齐方向,让标签显示在柱子外侧
修改后的完整代码
library(tidyverse) library(plotly) # 绘制金字塔图 gg_pop_hisp = ggplot(pop_hisp_df, aes( x = forcats::as_factor(age_group), y = Value, fill = Type)) + geom_bar(data = subset(pop_hisp_df, Type == "Females"), stat = "identity") + # 修正标签格式与位置 geom_text(aes(label = paste0(abs(Value), "%"), hjust = ifelse(Type == "Males", 1.1, -0.1))) + geom_bar(data = subset(pop_hisp_df, Type == "Males"), stat = "identity") + scale_y_continuous(limits=c(-20,20), breaks=c(-15,-10,0,10,15), labels=paste0(c(15,10,0,10,15), "%")) + scale_fill_manual(name = "", values = c("Females"="#FC921F", "Males"="#149ECE"), labels = c("Females", "Males")) + ggtitle("HISPANIC POPULATION BY GENDER AND AGE GROUP") + labs(x = "AGE GROUPS", y = "PERCENTAGE POPULATION", fill = "Gender") + theme_minimal() + theme(legend.position="bottom") + coord_flip() # 转换为交互式图表 ggplotly(gg_pop_hisp) %>% layout( legend = list( orientation = 'h', x = 0.3, y = -0.3, title = list(text = '') ) )
说明
- 标签格式化:
paste0(abs(Value), "%")一步完成“取绝对值去负号+拼接%符号”的需求,替代原代码中错误的label = Value, "%"写法。 - 文本位置优化:
hjust = ifelse(Type == "Males", 1.1, -0.1)让男性标签(y值为负)显示在柱子左侧,女性标签显示在柱子右侧,避免被柱子遮挡,提升可读性。 - 坐标轴保持:原代码中
scale_y_continuous的坐标轴标签格式已经正确,无需修改。
内容的提问来源于stack exchange,提问作者Ed_Gravy
相关产品推荐
相关产品推荐

