r - 在网格中制作一个矩形图例,并标记行和列

标签 r ggplot2 legend r-grid

我有一个 ggplot,我将因子映射到填充和 alpha,如下所示:

set.seed(47)
the_data <- data.frame(value = rpois(6, lambda=20),
                       cat1 = rep(c("A", "B"), each = 3),
                       cat2 = rep(c("X", "Y", "Z"), 2))

ggplot(the_data, aes(y = value, x = cat2, alpha = cat1, fill = cat2)) +
    geom_bar(stat = "identity", position = "dodge") +
    scale_alpha_discrete(range = c(0.5, 1)) +
    theme_bw()

enter image description here

我为其制作它的人并没有发现 alpha 的图例非常清楚。我认为一个很好的替代方案是这样的(我在基本图形中将其组合在一起):

enter image description here

我知道我无法使用高级 ggplot 命令生成这样的图例,但是我可以在 grid 中生成图例并将其放在我的绘图之上吗?

最佳答案

这是一个可能的起点。我创建了两个不同的图,它们具有适当的图例 - 一个“明亮”和一个“苍白”。从绘图对象中提取图例。然后使用网格视口(viewport)(一个用于绘图,一个用于每个图例)将各个部分组合在一起。

library(grid)
library(gtable)

# create plot with legend with alpha = 1
g1 <- ggplot(the_data, aes(y = value, x = cat2, alpha = cat1, fill = cat2)) +
  geom_bar(stat = "identity", position = "dodge") +
  scale_alpha_discrete(range = c(0.5, 1)) +
  theme_bw() +
  guides(fill = guide_legend(title = "A",
                             title.hjust = 0.4),
         alpha = FALSE) +
  theme_bw() +
  theme(legend.text = element_blank())

g1

# grab legend
legend_g1 <- gtable_filter(ggplot_gtable(ggplot_build(g1)), "guide-box") 


# create plot with 'pale' legend
g2 <- ggplot(the_data, aes(y = value, x = cat2, alpha = cat1, fill = cat2)) +
  geom_bar(stat = "identity", position = "dodge") +
  scale_alpha_discrete(range = c(0.5, 1)) +
  guides(fill = guide_legend(override.aes = list(alpha = 0.5),
                             title = "B",
                             title.hjust = 0.3),
         alpha = FALSE) +
  theme_bw()
g2

# grab legend
legend_g2 <- gtable_filter(ggplot_gtable(ggplot_build(g2)), "guide-box") 



# arrange plot and legends

# legends to the right

# define plotting regions (viewports)
vp_plot <- viewport(x = 0.4, y = 0.5,
                    width = 0.8, height = 1)

vp_legend_g1 <- viewport(x = 0.85, y = 0.5,
                           width = 0.4, height = 0.4)

vp_legend_g2 <- viewport(x = 0.90, y = 0.5,
                           width = 0.4, height = 0.4)


# clear current device
grid.newpage()

# add objects to the viewports
# plot without legend
print(g1 + theme(legend.position = "none"), vp = vp_plot)
upViewport(0)

pushViewport(vp_legend_g1)
grid.draw(legend_g1)
upViewport(0)

pushViewport(vp_legend_g2)
grid.draw(legend_g2) 

enter image description here

# legends on top
vp_plot <- viewport(x = 0.5, y = 0.4,
                    width = 1, height = 0.85)

vp_legend_g1 <- viewport(x = 0.5, y = 0.9,
                         width = 0.4, height = 0.4)

vp_legend_g2 <- viewport(x = 0.55, y = 0.9,
                         width = 0.4, height = 0.4)

grid.newpage()

print(g1 + theme(legend.position = "none"), vp = vp_plot)
upViewport(0)

pushViewport(vp_legend_g1)
grid.draw(legend_g1)
upViewport(0)

pushViewport(vp_legend_g2)
grid.draw(legend_g2)  

enter image description here

关于r - 在网格中制作一个矩形图例,并标记行和列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20129299/

相关文章:

r - 如何使用 R 从托管在 AWS ubuntu 服务器上的 Rstudio Connect 访问托管在 Azure Windows VM 上的 SQL Server 数据库?

linux - 在没有 root 权限的情况下在 linux/Unix 中安装 R?

r - 如何将ggplot中的连续x轴更改为离散轴?

javascript - 基于具有固定标签的季节的 D3 圆环图

r - 在 R 中使用向量、现有变量和 mapply 创建多个新变量

r - geom_abline(...) 是否多次绘制数据?

r - 将 geom_vline 扩展到绘图之外

r - ggplot2:更改图例符号

r - 组合ggplot中的图例位置

r - 当 x 轴是一个因素时,用 ggplot 添加一条垂直线