ggplot2:圆形条形图中轴文本后面的矩形背景

问题描述 投票:0回答:1

目标

复制此圆形条形图:

Reference

数据

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()
  )

基于我的代码的初始结果:

Initial plot

需要帮助:

  1. x 轴的顶线需要是
    grey30
    axis.line.x.top
    似乎没有效果。即使我删除
    coord_polar()
    只是为了测试,它也没有显示任何灰线。
  2. 我希望 x 轴文本具有矩形背景。我已经尝试过两次:
  • 使用
    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
    的位置

using geom_label

  1. 如何在
    panel.grid.major.x
    之上制作
    panel.grid.major.y
    。作为回报,现在我只需将第二个的颜色设置为
    alpha("grey70", 0.5)
r ggplot2 plot
1个回答
0
投票

要解决您的问题:对于极坐标图中的灰色顶线,请使用

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 网格线。这确保了圆形条形图的完全自定义。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.