ggplot:堆叠条形图添加文本标签及次坐标轴均值问题
问题解答
问题1:堆叠条形图文本标签异常
你的代码里geom_text没设置堆叠位置参数,导致所有文本标签都挤在柱子底部重叠在一起。给geom_text加上position = position_stack(vjust = 0.5),就能让标签居中显示在对应堆叠区域内。
修正后的完整代码:
# Sample Data n <- 100 df <- data.frame(item = sample(paste("Item", 1:4), size=n, replace=TRUE), value = sample(1:5, size=n, replace=TRUE)) # Create stacked barplot df %>% group_by(item) %>% count(value) %>% mutate(percent = 1 / sum(n) * n, answer = factor(value, ordered=TRUE)) %>% ggplot(aes(x = item, y = percent, fill = fct_rev(answer))) + geom_col() + scale_y_continuous(labels = scales::percent) + geom_text(aes(label = paste0(round(percent, 1), "%")), # 加上%让百分比更直观 position = position_stack(vjust = 0.5)) + labs(fill = "Answer")
注:如果不需要标签带%符号,删掉paste0部分即可
问题2:添加次坐标轴展示均值
虽然你清楚统计上的矛盾,但可以通过坐标轴转换实现需求。具体步骤如下:
- 先计算每个
item的均值 - 建立主轴(0-1,百分比)和次轴(1-5,均值范围)的转换关系:次轴值 = 主轴值×4 +1,主轴值 = (次轴值-1)/4
- 用
geom_point绘制均值点,对应转换后的主轴位置 - 在
scale_y_continuous中配置次坐标轴
完整代码:
# 计算每个item的均值 mean_df <- df %>% group_by(item) %>% summarize(mean_val = mean(value)) # 绘制图表 df %>% group_by(item) %>% count(value) %>% mutate(percent = 1 / sum(n) * n, answer = factor(value, ordered=TRUE)) %>% ggplot(aes(x = item, y = percent, fill = fct_rev(answer))) + geom_col() + # 设置主、次坐标轴 scale_y_continuous( labels = scales::percent, sec.axis = sec_axis( trans = ~ .x*4 +1, # 主轴转次轴的公式 name = "均值", breaks = 1:5 ) ) + geom_text(aes(label = paste0(round(percent, 1), "%")), position = position_stack(vjust = 0.5)) + # 添加均值点,y值转换为主轴范围 geom_point(data = mean_df, aes(x = item, y = (mean_val -1)/4, fill = NULL), color = "red", size = 3) + labs(fill = "Answer")
注:均值点用红色突出,可根据需求调整颜色、大小等参数
内容的提问来源于stack exchange,提问作者D. Studer
相关产品推荐
相关产品推荐

