目标
复制此圆形条形图:
数据
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",
)
)
我的代码
ggplot(data) +
geom_bar(
stat = "identity",
aes(
x = labels,
y = values,
fill = bar_color
),
size = 1,
color = "gray20",
width = 1,
alpha = 0.9
) +
coord_polar() +
scale_fill_identity() +
theme(
panel.grid.major.x = element_line(
linewidth = .8,
color = "grey30"
),
panel.grid.major.y = element_line(
linewidth = .8,
color = alpha("grey70", 0.5)
),
axis.title = element_blank(),
panel.background = element_blank(),
axis.line.x.top = element_line(
color = "grey20"
),
axis.ticks.y = element_blank(),
axis.text.y = element_blank()
)
基于我的代码的初始结果:
需要帮助:
grey30
。 axis.line.x.top
似乎没有效果。即使我删除coord_polar()
只是为了测试,它也没有显示任何灰线。axis.text.x = element_textbox(color = "black",fill = "white")
,它返回错误:Error: The function textbox_grob() is not vectorized.
geom_label(aes(x = labels,y = 100,label = labels)
;无论我如何编辑 y
参数,标签都太居中了。例如 y = 150
仍然使标签过于居中,但它扩展了 y axis
;我故意让 x 轴文本存在只是为了比较我期望的 geom_label
的位置panel.grid.major.x
之上制作panel.grid.major.y
。作为回报,现在我只需将第二个的颜色设置为alpha("grey70", 0.5)
要解决您的问题:对于极坐标图中的灰色顶线,请使用
geom_hline(yintercept = max(data$values), color = "grey30", size = 0.8)
,因为 axis.line.x.top
不适用于 coord_polar()
。要将矩形背景添加到轴文本,请使用 element_textbox
包中的 ggtext
和 theme(axis.text.x = element_textbox(color = "black", fill = "white", box.color = "grey30"))
,或者使用 geom_label
手动将标签放置在条形之外。要将 panel.grid.major.x
叠加在 panel.grid.major.y
上,请使用 geom_segment
手动在 aes(x = labels, xend = labels, y = 0, yend = max(data$values))
的顶部添加 X 网格线。这确保了圆形条形图的完全自定义。