gpt4 book ai didi

r - ggplot2:叠加两个图并使用两个图例

转载 作者:行者123 更新时间:2023-12-01 13:40:17 25 4
gpt4 key购买 nike

我一直在构建这个相当复杂的绘图函数,它构建了一个包含许多绘图和图层的大图形面板,最近添加到挑战堆栈中的是生成具有二级比例的绘图。为此,我有以下支持功能,它从外部使用有效的 ggplot2 对象调用...

overlap_plots <- function(base_plt, over_plt) {

plot_theme <- function(p) {
plyr::defaults(p$theme, theme_get())
}

base_g = ggplot_gtable(ggplot_build(base_plt))
overlay_g = ggplot_gtable(ggplot_build(over_plt))

plt_panel = c(subset(base_g$layout, name == "panel", se = t:r))
pnl_ind = which(overlay_g$layout$name == "panel")
leg_ind = which(overlay_g$layout$name == "guide-box")
final_grob = gtable_add_grob(base_g,
overlay_g$grobs[[pnl_ind]],
plt_panel$t,
plt_panel$l,
plt_panel$b,
plt_panel$l)

final_grob = gtable_add_grob(final_grob,
overlay_g$grobs[[leg_ind]],
plt_panel$t,
plt_panel$l,
plt_panel$b,
plt_panel$l)
return(final_grob)
}

然而,对 gtable_add_grob() 的第二次调用实际上似乎没有做任何事情......

为了可重复性,这里有两个随机图......

library(ggplot2)
library(grid)
library(gtable)

d = data.frame(Time = as.POSIXct(seq(1446871740, 1446893340, 60), origin = "1970-01-01"), Value = rnorm(361))
base_plt = ggplot() + geom_line(data=d, aes(Time, d[, 2], color="#F564E3")) +
scale_color_manual(values = "#F564E3", labels = "#F564E3") +
theme(
plot.margin=unit(c(0,0,0,0), 'cm'),
legend.position = c(0, 1),
legend.justification = c(0.1, .9))
b = data.frame(Time = as.POSIXct(seq(1446871740, 1446893340, 60), origin = "1970-01-01"), Value = rnorm(361))
over_plt = ggplot() + geom_line(data=d, aes(Time, b[, 2], color="#00C094")) +
scale_color_manual(values = "#00C094", labels = "#00C094") +
theme(
legend.position = c(0, 0),
legend.justification = c(0.1, 0.1),
panel.background = element_rect(fill = NA),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank())

g = overlap_plots(base_plt, over_plt)

grid.draw(g)

最佳答案

这个问题以前可能有人回答过,但我急着找不到。

当您使用 gtable_add_grob() 添加 grob 并且您没有指定名称时,gtable 会指定一个默认名称“layout”。但是,在您的函数中,这意味着一个单元格中有两个具有相同名称的 grob。 gtable不喜欢,只画了第一个。给他们不同的名字:

overlap_plots <- function(base_plt, over_plt) {

plot_theme <- function(p) {
plyr::defaults(p$theme, theme_get())
}

base_g = ggplot_gtable(ggplot_build(base_plt))
overlay_g = ggplot_gtable(ggplot_build(over_plt))

plt_panel = c(subset(base_g$layout, name == "panel", se = t:r))
pnl_ind = which(overlay_g$layout$name == "panel")
leg_ind = which(overlay_g$layout$name == "guide-box")
final_grob = gtable_add_grob(base_g,
overlay_g$grobs[[pnl_ind]],
plt_panel$t,
plt_panel$l,
plt_panel$b,
plt_panel$r, name = "a")

final_grob = gtable_add_grob(final_grob,
overlay_g$grobs[[leg_ind]],
plt_panel$t,
plt_panel$l,
plt_panel$b,
plt_panel$r, name = "b")
return(final_grob)
}

关于r - ggplot2:叠加两个图并使用两个图例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40901169/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com