代码之家  ›  专栏  ›  技术社区  ›  isaid-hi

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

  •  1
  • isaid-hi  · 技术社区  · 7 月前

    目标

    复制此圆形条形图:

    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 The 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)
    2 回复  |  直到 7 月前
        1
  •  1
  •   jared_mamrot    7 月前

    以下是一种潜在的方法:

    library(tidyverse)
    
    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 ~ "#f2452e",
          values < 85 ~ "#76c5d0",
          values >= 85 ~ "#4b7d84",
        )
      )
    
    ggplot(data, aes(x = labels, y = values)) +
      geom_bar(aes(fill = bar_color),
               stat = "identity", size = 1,
               color = "gray20", width = 1,
               alpha = 0.8) +
      coord_polar(start = -(pi / 8)) +
      scale_fill_identity() +
      theme(
        panel.grid.major.y = element_line(
          linewidth = .8,
          color = c("transparent", alpha("grey80", 0.5))
        ),
        axis.title = element_blank(),
        panel.background = element_blank(),
        axis.ticks.y = element_blank(),
        axis.text = element_blank(),
      ) +
      geom_hline(yintercept = 96.5,
                 color = "grey90", size = 3) +
      scale_y_continuous(breaks = seq(0, 95, 5)) +
      geom_segment(aes(x = 1.5:8.5, y = 0, yend = 95),
                   inherit.aes = FALSE, color = alpha("grey20", 0.5)) +
      geom_hline(yintercept = 94,
                 color = "grey20", size = 1) +
      geom_label(aes(label = labels, y = 96), fill = "white", size = 6)
    #> Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
    #> ℹ Please use `linewidth` instead.
    #> This warning is displayed once every 8 hours.
    #> Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
    #> generated.
    

    创建于2024年12月13日 reprex v2.1.0

        2
  •  0
  •   Lokesh thakur    7 月前

    要解决您的问题:对于极坐标图中的灰色顶线,请使用 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 在顶部手动添加X网格线 aes(x = labels, xend = labels, y = 0, yend = max(data$values)) 。这确保了您的圆形条形图的完全定制。