下面是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
补丁程序?
任何指针将是非常有帮助的。
1条答案
按热度按时间hjzp0vay1#
如果我理解正确,那么实现所需结果的一种方法是添加一些假图例条目,我们通过删除标签并将填充颜色设置为例如,使图例键“不可见”。
"transparent"
。作为第一步,这需要将
param
转换为因子,并在正确的位置添加伪元素。此外,我们必须为填充比例设置drop=FALSE
,以便在图例中实际显示未使用的伪元素。最后,仅加粗部分图例元素是最简单的任务,可以通过ggtext::element_markdown
实现。注意:根据
theme
设置,填充颜色为"transparent"
不足以使伪元素不可见,例如在默认的theme_grey
的情况下,键具有灰色背景填充。因此,我添加了legend.key = element_rect(fill = "transparent")
来使背景填充也透明。编辑不得不承认,我不知道到底是什么问题,但修复方法是将“spacer”的
alpha
设置为零,我使用after_scale
和geom_col
中的if_else
: