在ggplot R中为条形图添加水平标题/标签

kzipqqlq  于 2023-06-03  发布在  其他
关注(0)|答案(2)|浏览(217)

有没有一种方法可以在ggplot中绘制一个条形图,并使用带有标签的水平线对条形图进行相应的分组。它应该看起来像下图中的样子,但仅适用于一个图形中的多个组和条形图。
对于上下文,我计划在一个图中为每个水平标签分组三个条形。例如,前3个条形代表我的对照,接下来的3个条形代表治疗1,接下来的3个条形代表治疗2,依此类推。
让我知道如果你有一个模板,使这样的图表。谢谢!

5kgi1eie

5kgi1eie1#

实现这种分组的默认方法是通过分面,然而,TBMK(ggplot2提供的默认element_rect)不提供仅绘制顶线的选项。
一种选择是创建一个自定义主题元素来实现这一点。为此,我修改了默认element_rect的代码,将rectGrob替换为linesGrob
此外,为了添加轴标签的顶部线条,我在ggh4x上绘制,以通过面添加轴标签。这样做允许使用自定义主题元素来添加“轴标签”的顶部行(当然,也可以创建另一个自定义主题元素)。
使用mtcars作为示例数据:

element_rect2 <- function(colour = NULL, size = NULL, linetype = NULL,
                          color = NULL, inherit.blank = FALSE) {
  if (!is.null(color)) {
    colour <- color
  }
  structure(list(
    colour = colour, size = size,
    linetype = linetype, inherit.blank = inherit.blank
  ),
  class = c("element_rect2", "element_rect", "element")
  )
}

element_grob.element_rect2 <- function(element, x = unit(c(0, 1), "npc"), y = unit(c(1, 1), "npc"),
                                       colour = NULL, size = NULL, linetype = NULL, ...) {
  gp <- grid::gpar(lwd = size, col = colour, lty = linetype)
  element_gp <- grid::gpar(lwd = element$size, col = element$colour, lty = element$linetype)
  gp <- modifyList(element_gp, gp)
  grid::linesGrob(x, y - unit(gp$lwd, unit = "pt"), gp = gp, ...)
}

library(ggplot2)
library(ggh4x)

ggplot(mtcars, aes(factor(cyl))) +
  geom_bar() +
  scale_y_continuous(expand = expansion(mult = c(0, .05))) +
  labs(x = NULL, y = NULL) +
  facet_wrap2(am ~ cyl,
    strip.position = "bottom", scales = "free_x",
    strip = strip_nested(
      background_x = list(
        element_rect2(size = 2),
        element_rect2(size = 2)
      ),
      by_layer_x = TRUE
    ),
    nrow = 1
  ) +
  theme_minimal() +
  theme(
    panel.grid = element_blank(),
    axis.line.y = element_line(size = .75, lineend = "square"),
    axis.ticks.y = element_line(size = .75),
    axis.text.x = element_blank(),
    strip.placement = "outside"
  )

ykejflvf

ykejflvf2#

您可以使用ggplot2包中的geom_bar()来绘制类似的条形图。

library(ggplot2)
data(iris)
ggplot(iris, aes(x = Species, y = Petal.Length)) + 
  geom_bar(stat = "identity", fill = "black") +
  theme_bw()

相关问题