R Shiny中如何在柱状图顶部添加数值与百分比差值标注
实现方案
你可以按以下逻辑修改server端绘图代码,同步实现柱顶数值标注、跨柱百分比下降率标注,完全兼容动态选择的Y轴字段:
- 绘图前先加载数据集,提取当前选中Y列的有序数值,提前计算好需要标注的下降率
- 用
geom_text图层给每个柱体顶部添加对应Y值标签 - 用
annotate图层在两柱中间的上方位置添加百分比差值标注,同时调整Y轴范围避免标签被截断
修改后的server.R代码
output$plot1 <- renderPlot({ # 加载绘图数据集 plot_df <- phnData1_load(df) # 动态获取当前选中的Y列数值,顺序和x轴quarter从左到右的柱顺序一致 current_y <- plot_df[[input$column1]] # 计算从右往左的百分比下降率,默认图中包含2根柱:左为第1根、右为第2根 # 计算逻辑:(右柱值 - 左柱值)/右柱值,格式化为百分比保留1位小数 right_col_val <- current_y[2] left_col_val <- current_y[1] drop_rate <- scales::percent((right_col_val - left_col_val)/right_col_val, accuracy = 0.1) ggplot(plot_df, aes(x = quarter, y = .data[[input$column1]])) + geom_col(fill = "blue") + # 若blue是你提前定义的颜色变量可去掉引号 # 柱顶添加Y轴数值标签,vjust设为负值让标签显示在柱顶上方 geom_text(aes(label = .data[[input$column1]]), vjust = -0.6, size = 3.8) + # 两柱中间上方标注下降率 annotate( geom = "text", x = 1.5, # 第一根柱x坐标为1、第二根为2,中间位置为1.5 y = max(current_y) * 1.12, # 位置比最高柱高12%,避免遮挡柱体 label = paste0("环比下降", drop_rate), color = "#d92121", size = 4 ) + xlab("QUARTER") + # 扩展Y轴顶部20%的空间,防止标签被画布边缘截断 scale_y_continuous(expand = expansion(mult = c(0, 0.2))) })
注意事项
- 请确保
plot_df中quarter字段的排序和你期望的从左到右柱顺序一致,如果quarter是因子类型,请提前设置好因子水平,否则会出现数值对应错位的问题 - 如果你的柱状图包含多于2个季度,只需调整
right_col_val、left_col_val的取值索引,以及标注对应的x轴坐标即可 - 如果没有安装
scales包,可以把百分比计算行替换为drop_rate <- paste0(round((right_col_val - left_col_val)/right_col_val*100, 1), "%"),不需要额外装包 - 如果你的下降率计算逻辑是(左柱值-右柱值)/左柱值,直接修改括号内的计算公式即可适配业务需求
内容的提问来源于stack exchange,提问作者Zerone
相关产品推荐
相关产品推荐

