ggplot - 多个图例排列 [英] ggplot - Multiple legends arrangement
问题描述
我想在多行多列的 ggplot 中排列多个图例.但是目前,从文档中我只能决定方向或操作 1 个图例中的行/列.我忽略了什么吗?感谢您提供解决方案的任何参考点.这是示例代码和我所做的以及预期的结果.
data <- seq(1000, 4000, by=1000)colorScales <- c("#c43b3b", "#80c43b", "#3bc4c4", "#7f3bc4")名称(colorScales)<-数据ggplot() +geom_point(aes(x=data, y=data, color=as.character(data), fill=data, size=data),形状=21) +scale_color_manual(名称=图例1",值=颜色比例)+scale_fill_gradientn(name="Legend 2",标签=逗号,限制=c(0,最大值(数据)),颜色=rev(c("#000000", "#FFFFFF", "#BA0000")),值=c(0, 0.5, 1)) +scale_size_continuous(name="Legend 3") +主题(legend.direction =垂直",legend.box =垂直")
输出垂直图例:
ggplot() +geom_point(aes(x=data, y=data, color=as.character(data), fill=data, size=data),形状=21) +scale_color_manual(名称=图例1",值=颜色比例)+scale_fill_gradientn(name="Legend 2",标签=逗号,限制=c(0,最大值(数据)),颜色=rev(c("#000000", "#FFFFFF", "#BA0000")),值=c(0, 0.5, 1)) +scale_size_continuous(name="Legend 3") +主题(legend.direction =垂直",legend.box =水平")
输出水平图例
ggplot() +geom_point(aes(x=data, y=data, color=as.character(data), fill=data, size=data),形状=21) +scale_color_manual(名称=图例1",值=颜色比例)+scale_fill_gradientn(name="Legend 2",标签=逗号,限制=c(0,最大值(数据)),颜色=rev(c("#000000", "#FFFFFF", "#BA0000")),值=c(0, 0.5, 1)) +指南(颜色 = guide_legend(nrow = 2,byrow = T,override.aes=list(size=4)))+指南(大小 = guide_legend(nrow = 2,byrow = T))+scale_size_continuous(name="Legend 3") +主题(legend.direction =垂直",legend.box =垂直")
垂直布局的输出图例,每个图例中有 2 列:
我想要的是这个:
这个想法是单独创建每个绘图(color
, fill
& size
) 然后提取它们的图例并以所需的方式将它们与主要情节结合在一起.
查看有关 cowplot
包的更多信息 (v0.2.0.9000) 于 2018 年 8 月 28 日创建.
I want to arrange mutiple legend in ggplot with multiple rows and columns. However currently, from the documentation I can only decide there direction or manipulate rows/columns within 1 legend. Am I overlook something? Thanks for any reference point to the solution. Here is the sample code and what I have done and the expect result.
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")
Output vertical legend:
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")
Output horizontal legend
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")
Output legend with vertical layout, 2 columns within each legend:
What I want is this:
The idea is to create each plot individually (color
, fill
& size
) then extract their legends and combine them in a desired way together with the main plot.
See more about the cowplot
package here & the patchwork
package here
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")
Get all legends
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 legends
# 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
)
Put everything together
final_p <- plot_grid(p0,
leg123,
nrow = 1,
align = "h",
axis = "t",
rel_widths = c(1, 0.3)
)
print(final_p)
Created on 2018-08-28 by the reprex package (v0.2.0.9000).
这篇关于ggplot - 多个图例排列的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!