【问题标题】:ggplot - Multiple legends arrangementggplot - 多个图例排列
【发布时间】:2019-02-03 05:57:53
【问题描述】:

我想在 ggplot 中安排多行多列的多个图例。但是目前,从文档中我只能决定方向或操作 1 个图例中的行/列。我忽略了什么吗?感谢您提供解决方案的任何参考点。 这是示例代码以及我所做的以及预期的结果。

data <- seq(1000, 4000, by=1000)
colorScales <- c("#c43b3b", "#80c43b", "#3bc4c4", "#7f3bc4")
names(colorScales) <- data
ggplot() +
    geom_point(aes(x=data, y=data, color=as.character(data), fill=data, size=data),
               shape=21) +
    scale_color_manual(name="Legend 1",
                      values=colorScales) +
    scale_fill_gradientn(name="Legend 2",
                          labels=comma, limits=c(0, max(data)),
                          colours=rev(c("#000000", "#FFFFFF", "#BA0000")),
                         values=c(0, 0.5, 1)) +
    scale_size_continuous(name="Legend 3") +
    theme(legend.direction = "vertical", legend.box = "vertical")

输出垂直图例:

ggplot() +
    geom_point(aes(x=data, y=data, color=as.character(data), fill=data, size=data),
               shape=21) +
    scale_color_manual(name="Legend 1",
                       values=colorScales) +
    scale_fill_gradientn(name="Legend 2",
                         labels=comma, limits=c(0, max(data)),
                         colours=rev(c("#000000", "#FFFFFF", "#BA0000")), 
                         values=c(0, 0.5, 1)) +
    scale_size_continuous(name="Legend 3") +
    theme(legend.direction = "vertical", legend.box = "horizontal")

输出水平图例

ggplot() +
    geom_point(aes(x=data, y=data, color=as.character(data), fill=data, size=data),
               shape=21) +
    scale_color_manual(name="Legend 1",
                       values=colorScales) +
    scale_fill_gradientn(name="Legend 2",
                         labels=comma, limits=c(0, max(data)),
                         colours=rev(c("#000000", "#FFFFFF", "#BA0000")), 
                         values=c(0, 0.5, 1)) +
    guides(colour = guide_legend(nrow = 2, byrow = T, override.aes=list(size=4))) +
    guides(size = guide_legend(nrow = 2, byrow = T)) +
    scale_size_continuous(name="Legend 3") +
    theme(legend.direction = "vertical", legend.box = "vertical")

垂直布局的输出图例,每个图例中有 2 列:

我想要的是这个:

【问题讨论】:

  • 顺便说一句,您是否考虑过使用plotly - 我发现它在安排项目方面有更多选择。
  • 一种解决方法可以是绘制 3 个单独的图,提取它们的图例,然后使用 cowplot::plot_grid 以某种方式将它们组合在一起 cran.r-project.org/web/packages/cowplot/vignettes/…
  • 你不能用开箱即用的ggplot2 做你想做的事,也就是说,我很确定你没有忽略任何事情。如果您不介意弄乱例如,您可以手动创建其他安排。 cowplot::get_legendcowplot::plot_grid.
  • gtable::gtable_filter 还允许您提取图例,然后可以使用gridExtra::annotation_customSee details here 将其放置在绘图上的任何位置

标签: r ggplot2 legend cowplot


【解决方案1】:

我们的想法是单独创建每个图(colorfillsize),然后提取它们的图例并以所需的方式将它们与主图组合在一起。

详细了解cowplotherepatchworkhere

library(ggplot2)
library(cowplot)   # get_legend() & plot_grid() functions
library(patchwork) # blank plot: plot_spacer()

data <- seq(1000, 4000, by = 1000)
colorScales <- c("#c43b3b", "#80c43b", "#3bc4c4", "#7f3bc4")
names(colorScales) <- data

# Original plot without legend
p0 <- ggplot() +
  geom_point(aes(x = data, y = data, 
                 color = as.character(data), fill = data, size = data),
             shape = 21
  ) +
  scale_color_manual(
    name = "Legend 1",
    values = colorScales
  ) +
  scale_fill_gradientn(
    name = "Legend 2",
    limits = c(0, max(data)),
    colours = rev(c("#000000", "#FFFFFF", "#BA0000")),
    values = c(0, 0.5, 1)
  ) +
  scale_size_continuous(name = "Legend 3") +
  theme(legend.direction = "vertical", legend.box = "horizontal") +
  theme(legend.position = "none")

# color only
p1 <- ggplot() +
  geom_point(aes(x = data, y = data, color = as.character(data)),
             shape = 21
  ) +
  scale_color_manual(
    name = "Legend 1",
    values = colorScales
  ) +
  theme(legend.direction = "vertical", legend.box = "vertical")

# fill only
p2 <- ggplot() +
  geom_point(aes(x = data, y = data, fill = data),
             shape = 21
  ) +
  scale_fill_gradientn(
    name = "Legend 2",
    limits = c(0, max(data)),
    colours = rev(c("#000000", "#FFFFFF", "#BA0000")),
    values = c(0, 0.5, 1)
  ) +
  theme(legend.direction = "vertical", legend.box = "vertical")

# size only
p3 <- ggplot() +
  geom_point(aes(x = data, y = data, size = data),
             shape = 21
  ) +
  scale_size_continuous(name = "Legend 3") +
  theme(legend.direction = "vertical", legend.box = "vertical")

获取所有图例

leg1 <- get_legend(p1)
leg2 <- get_legend(p2)
leg3 <- get_legend(p3)

# create a blank plot for legend alignment 
blank_p <- plot_spacer() + theme_void()

合并图例

# combine legend 1 & 2
leg12 <- plot_grid(leg1, leg2,
                   blank_p,
                   nrow = 3
)

# combine legend 3 & blank plot
leg30 <- plot_grid(leg3, blank_p,
                   blank_p, 
                   nrow = 3
)

# combine all legends
leg123 <- plot_grid(leg12, leg30,
                    ncol = 2
)

把所有东西放在一起

final_p <- plot_grid(p0,
                     leg123,
                     nrow = 1,
                     align = "h",
                     axis = "t",
                     rel_widths = c(1, 0.3)
)

print(final_p)

reprex package (v0.2.0.9000) 于 2018 年 8 月 28 日创建。

【讨论】:

猜你喜欢
  • 2021-10-12
  • 2018-04-09
  • 2018-08-14
  • 1970-01-01
  • 1970-01-01
  • 2021-12-02
  • 2018-04-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多