覆盖不同的 ggplot2 对象
Overlay different ggplot2 objects
我之前曾尝试寻求帮助,但并没有真正解决我的问题。
更多信息可以在这里找到:(你可以在这里找到数据集)
不幸的是,我无法为 post 提供可靠的示例,因为我的代码很大程度上基于外部程序。我很肯定,尽管我的问题无论如何都能得到回答。
我创建了 2 个 ggplot2 对象,这些对象需要组合成一个图形,一个叠加在另一个之上。
即class的一个km.plot:
class(km.plot$plot)
1 "gg" "ggplot"
还有两个:
class(surv.plot)
1 "gg" "ggplot"
两者具有相同的属性
km.plot$情节
surv.plot
我的问题是如何将生成的图组合成一个图?也就是说,让 surv.plot 和 km.plot$plot 相互重叠。
按照另一位用户的建议执行以下操作会导致错误:
km.plot$plot + surv.plot$layers[[1]]
Error in FUN(X[[i]], ...) : object 'label' not found
我认为这个错误与以下几行有关
> surv.plot$layers
[[1]]
mapping: y = ~mean, group = ~label, colour = ~label
geom_line: na.rm = FALSE
stat_identity: na.rm = FALSE
position_identity
ggplot(data, aes(x=t)) +
geom_line(aes(y= mean, group= label, colour= label), size=1.5) +
但我也添加了,inherit.aes = FALSE 但没有解决我的问题。
我也查了:
> head(surv.plot)
$`data`
curve t mean lci uci label
1 weibull 0.00000000 1.0000000 1.00000000 1.0000000 Cabo
2 weibull 0.05514645 0.9995771 0.99816278 0.9999721 Cabo
3 weibull 0.11029289 0.9990793 0.99646259 0.9999098 Cabo
4 weibull 0.16543934 0.9985407 0.99479769 0.9998211 Cabo
5 weibull 0.22058579 0.9979715 0.99316001 0.9997176 Cabo
> head(km.plot)
$`plot`
$`data.survplot`
time n.risk n.event n.censor surv std.err upper lower
1 0.4271047 79 0 1 1.0000000 0.00000000 1.0000000 1.0000000
2 1.0841889 78 1 0 0.9871795 0.01290349 1.0000000 0.9625264
3 1.3470226 77 1 0 0.9743590 0.01836796 1.0000000 0.9399054
4 3.9753593 76 1 0 0.9615385 0.02264554 1.0000000 0.9197944
5 4.0082136 75 1 0 0.9487179 0.02632491 0.9989527 0.9010094
我很困惑。我几乎可以肯定这可以完成,因为这两个对象在结构方面基本相同,所以我看不出为什么不能这样做。但我已经花了很长时间,没有希望。我真的希望有人能指导我!
感谢您花时间阅读本文post
发生这种情况是因为 surv.plot
层包含名为 label
的变量的映射,该变量未包含在 km.plot
的数据中。您应该能够通过在创建 surv.plot
时将 surv.plot
数据作为参数添加到 geom
而不是 ggplot()
来解决这个问题。这样绘制图层所需的数据将 "travel with" 它。
我们可以用更简单的数据来说明这一点。让我们首先从数据创建一个图
只有几列:
library(tidyverse)
df1 <- mtcars %>%
select(mpg, wt)
# This represents `km.plot`
(p <- ggplot(df1, aes(wt, mpg)) + geom_point())
现在我们可以尝试添加一个图层,该图层依赖于 df1
中未包含的列
上一个剧情:
df2 <- mtcars %>%
select(mpg, wt, cyl)
q1 <- ggplot(df2, aes(wt, mpg)) +
geom_smooth(aes(color = factor(cyl)), method = "lm")
p + q1$layers[[1]]
#> Error in factor(cyl): object 'cyl' not found
q2 <- ggplot() +
geom_smooth(data = df2, aes(wt, mpg, color = factor(cyl)), method = "lm")
p + q2$layers[[1]]
由 reprex package (v0.2.0.9000) 创建于 2018-07-23。
我之前曾尝试寻求帮助,但并没有真正解决我的问题。 更多信息可以在这里找到:(你可以在这里找到数据集)
不幸的是,我无法为 post 提供可靠的示例,因为我的代码很大程度上基于外部程序。我很肯定,尽管我的问题无论如何都能得到回答。
我创建了 2 个 ggplot2 对象,这些对象需要组合成一个图形,一个叠加在另一个之上。
即class的一个km.plot:
class(km.plot$plot)
1 "gg" "ggplot"
还有两个:
class(surv.plot)
1 "gg" "ggplot"
两者具有相同的属性
km.plot$情节
surv.plot
我的问题是如何将生成的图组合成一个图?也就是说,让 surv.plot 和 km.plot$plot 相互重叠。
按照另一位用户的建议执行以下操作会导致错误:
km.plot$plot + surv.plot$layers[[1]]
Error in FUN(X[[i]], ...) : object 'label' not found
我认为这个错误与以下几行有关
> surv.plot$layers
[[1]]
mapping: y = ~mean, group = ~label, colour = ~label
geom_line: na.rm = FALSE
stat_identity: na.rm = FALSE
position_identity
ggplot(data, aes(x=t)) +
geom_line(aes(y= mean, group= label, colour= label), size=1.5) +
但我也添加了,inherit.aes = FALSE 但没有解决我的问题。
我也查了:
> head(surv.plot)
$`data`
curve t mean lci uci label
1 weibull 0.00000000 1.0000000 1.00000000 1.0000000 Cabo
2 weibull 0.05514645 0.9995771 0.99816278 0.9999721 Cabo
3 weibull 0.11029289 0.9990793 0.99646259 0.9999098 Cabo
4 weibull 0.16543934 0.9985407 0.99479769 0.9998211 Cabo
5 weibull 0.22058579 0.9979715 0.99316001 0.9997176 Cabo
> head(km.plot)
$`plot`
$`data.survplot`
time n.risk n.event n.censor surv std.err upper lower
1 0.4271047 79 0 1 1.0000000 0.00000000 1.0000000 1.0000000
2 1.0841889 78 1 0 0.9871795 0.01290349 1.0000000 0.9625264
3 1.3470226 77 1 0 0.9743590 0.01836796 1.0000000 0.9399054
4 3.9753593 76 1 0 0.9615385 0.02264554 1.0000000 0.9197944
5 4.0082136 75 1 0 0.9487179 0.02632491 0.9989527 0.9010094
我很困惑。我几乎可以肯定这可以完成,因为这两个对象在结构方面基本相同,所以我看不出为什么不能这样做。但我已经花了很长时间,没有希望。我真的希望有人能指导我!
感谢您花时间阅读本文post
发生这种情况是因为 surv.plot
层包含名为 label
的变量的映射,该变量未包含在 km.plot
的数据中。您应该能够通过在创建 surv.plot
时将 surv.plot
数据作为参数添加到 geom
而不是 ggplot()
来解决这个问题。这样绘制图层所需的数据将 "travel with" 它。
我们可以用更简单的数据来说明这一点。让我们首先从数据创建一个图 只有几列:
library(tidyverse)
df1 <- mtcars %>%
select(mpg, wt)
# This represents `km.plot`
(p <- ggplot(df1, aes(wt, mpg)) + geom_point())
现在我们可以尝试添加一个图层,该图层依赖于 df1
中未包含的列
上一个剧情:
df2 <- mtcars %>%
select(mpg, wt, cyl)
q1 <- ggplot(df2, aes(wt, mpg)) +
geom_smooth(aes(color = factor(cyl)), method = "lm")
p + q1$layers[[1]]
#> Error in factor(cyl): object 'cyl' not found
q2 <- ggplot() +
geom_smooth(data = df2, aes(wt, mpg, color = factor(cyl)), method = "lm")
p + q2$layers[[1]]
由 reprex package (v0.2.0.9000) 创建于 2018-07-23。