R语言 以定义的方式排列图例中的项目

l7mqbcuq  于 2023-06-03  发布在  其他
关注(0)|答案(1)|浏览(98)

下面是ggplot

library(ggplot2)
DF = data.frame(val = c(10,20,30,40,50,60,70,80,90,100), param = rep(letters[1:5],2), x = rep(c('X', 'Y'), 5))
ggplot(data = DF) + geom_bar(aes(y = val, fill = param, x = x), stat = 'identity', position = position_dodge2(preserve = 'single')) + guides(fill = guide_legend(nrom = 2, byrow = TRUE))

虽然我可以生成图,但是,我想以如下所示的特定方式排列图例中的项目。
1.前2项,即a & b应该在第一行
1.其余项目应以阵列方式排列**,其中3列和适用的行数基于项目的数量,前2个项目除外,即a & b,从第二行开始(第一行将仅包含a & b
1.我还想仅
粗体**图例中的项目a & b
有没有办法实现这样的定制化安排?
基于@stefan的友好回答,我修改了代码如下

library(ggplot2)
library(scales)
library(dplyr)

DF = data.frame(val = c(10,20,30,40,50,60,70,80,90,100), param = rep(letters[1:5],2), x = rep(c('X', 'Y'), 5))

DF$param <- factor(DF$param, c("a", "b", "spacer", "c", "d", "e"))

pal_fill <- scales::hue_pal()(5)
names(pal_fill) <- letters[1:5]

pal_fill <- c(pal_fill, spacer = "transparent")

ggplot(data = DF) +
  geom_col(aes(y = val, fill = param, x = x), alpha = 0.6,
    position = position_dodge2(preserve = "single")
  ) +
  scale_fill_manual(
    values = pal_fill,
    drop = FALSE,
    labels = ~ dplyr::case_match(
      .x, "spacer" ~ "", c("a", "b") ~ paste0("**", .x, "**"),
      .default = .x)
  ) +
  guides(fill = guide_legend(
    nrow = 2, byrow = TRUE
  )) +
  theme(
    legend.position=c(.9,.75),
    legend.background = element_rect(fill = alpha('#e5e5e5', 0.60)),
    #legend.text = ggtext::element_markdown(),
    legend.key = element_rect(fill = "transparent")
  )

如您所见,我在图例中看到了white补丁。如果我删除geom_col中的alpha = 0.6,实际上会发生这种情况。这对我来说很奇怪,因为我无法理解geom_col中的alpha和图例项之间的联系。
有没有办法纠正这个问题,比如。删除white补丁程序?
任何指针将是非常有帮助的。

hjzp0vay

hjzp0vay1#

如果我理解正确,那么实现所需结果的一种方法是添加一些假图例条目,我们通过删除标签并将填充颜色设置为例如,使图例键“不可见”。"transparent"
作为第一步,这需要将param转换为因子,并在正确的位置添加伪元素。此外,我们必须为填充比例设置drop=FALSE,以便在图例中实际显示未使用的伪元素。最后,仅加粗部分图例元素是最简单的任务,可以通过ggtext::element_markdown实现。
注意:根据theme设置,填充颜色为"transparent"不足以使伪元素不可见,例如在默认的theme_grey的情况下,键具有灰色背景填充。因此,我添加了legend.key = element_rect(fill = "transparent")来使背景填充也透明。

library(ggplot2)
library(scales)
library(dplyr)

DF$param <- factor(DF$param, c("a", "b", "spacer", "c", "d", "e"))

pal_fill <- scales::hue_pal()(5)
names(pal_fill) <- letters[1:5]

pal_fill <- c(pal_fill, spacer = "transparent")

ggplot(data = DF) +
  geom_col(aes(y = val, fill = param, x = x),
    position = position_dodge2(preserve = "single")
  ) +
  scale_fill_manual(
    values = pal_fill,
    drop = FALSE,
    labels = ~ dplyr::case_match(
      .x, "spacer" ~ "", c("a", "b") ~ paste0("**", .x, "**"),
      .default = .x)
  ) +
  guides(fill = guide_legend(
    nrow = 2, byrow = TRUE
  )) +
  theme(
    legend.text = ggtext::element_markdown(),
    legend.key = element_rect(fill = "transparent")
  )

编辑不得不承认,我不知道到底是什么问题,但修复方法是将“spacer”的alpha设置为零,我使用after_scalegeom_col中的if_else

ggplot(data = DF) +
  geom_col(
    aes(
      y = val, fill = param, x = x,
      alpha = after_scale(if_else(fill != "transparent", .6, 0))
    ),
    position = position_dodge2(preserve = "single")
  ) +
  scale_fill_manual(
    values = pal_fill,
    drop = FALSE,
    labels = ~ dplyr::case_match(
      .x, "spacer" ~ "", c("a", "b") ~ paste0("**", .x, "**"),
      .default = .x
    )
  ) +
  guides(fill = guide_legend(
    nrow = 2, byrow = TRUE
  )) +
  theme(
    legend.position = c(.9, .75),
    legend.background = element_rect(fill = alpha("#e5e5e5", 0.60)),
    #legend.text = ggtext::element_markdown(),
    legend.key = element_rect(fill = "transparent")
  )

相关问题