ggplot2环形柱状图:轴线条、文本背景及网格层级问题求助
环形柱状图复刻问题解决方案
目标
复刻指定环形柱状图
数据(修正语法错误后)
library(dplyr) data <- data.frame( labels = c("A","B","C","D","E","F","G","H"), values = c(88, 61, 56, 77, 83, 63, 42, 60) ) %>% mutate( bar_color = case_when( values < 62 ~ "#ff7d48", values < 85 ~ "#76c5d0", values >= 85 ~ "#4b7d84" ) )
现有代码问题修复及优化
以下是解决所有问题后的完整代码:
library(ggplot2) library(dplyr) library(ggtext) # 用于实现文本框背景 # 手动定义网格线位置 y_grid <- seq(20, 80, by = 20) x_grid <- 1:nrow(data) ggplot(data) + # 先画环形网格(y轴方向),置于底层 geom_hline(yintercept = y_grid, linewidth = .8, color = "grey70") + # 再画径向网格(x轴方向),置于环形网格上方 geom_vline(xintercept = x_grid + 0.5, linewidth = .8, color = "grey30") + # 绘制环形柱状图 geom_bar( stat = "identity", aes( x = labels, y = values, fill = bar_color ), size = 1, color = "gray20", width = 1, alpha = 0.9 ) + # 添加外圈灰色线条(替代无效的axis.line.x.top) annotate("path", x = seq(0, 2*pi, length.out = 100), y = max(data$values) + 3, # 略大于最大值,保证在外圈 color = "grey30", size = 1) + # 极坐标转换,调整起始角度让标签对齐柱子 coord_polar(start = -pi/nrow(data)) + # 填充色映射 scale_fill_identity() + # 调整y轴范围,给外圈线条和标签预留空间 scale_y_continuous(limits = c(0, max(data$values) + 10)) + # 主题设置 theme( axis.title = element_blank(), panel.background = element_blank(), axis.ticks.y = element_blank(), axis.text.y = element_blank(), # 用ggtext的文本框给x轴标签加白色背景 axis.text.x = element_textbox_simple( fill = "white", color = "black", padding = margin(2, 4, 2, 4), # 调整文本与背景框的内边距 lineheight = 1.2 ), # 关闭默认网格,改用手动绘制的网格 panel.grid = element_blank() )
问题逐一解决说明
x轴顶部外圈线条:
极坐标下axis.line.x.top不生效,改用annotate("path")绘制一个半径略大于数据最大值的圆形,模拟外圈线条,颜色设为grey30。x轴文本添加矩形背景:
使用ggtext包的element_textbox_simple替代报错的element_textbox,它支持矢量化渲染,直接在theme(axis.text.x)中设置即可,通过padding参数调整文本与背景框的间距。调整网格层顺序:
关闭默认的panel.grid,手动用geom_hline先绘制环形网格(y方向),再用geom_vline绘制径向网格(x方向),让径向网格自动置于环形网格上方,无需依赖透明度区分。
内容的提问来源于stack exchange,提问作者isaid-hi
相关产品推荐
相关产品推荐

