I have previously tried to ask for help but did not actually solve my problem. More info can be found here: (you can find the data-set here) https://stackoverflow.com/questions/51442502/survival-analysis-combining-survfit-and-ggplot-objects
Unfortunately I am unable to produce a solid example to post as my code is heavily based on external programs. I am positive though that my question can be answered regardless.
I reach a point where I create 2 ggplot2 objects that need to be combined to a single figure, one overlayed on top of the other.
Namely, one km.plot which is of class:
class(km.plot$plot)
1 "gg" "ggplot"
and two:
class(surv.plot)
1 "gg" "ggplot"
Both share same attributes
My question is how can I combine the resulting plots in a single plot? That is, to have both surv.plot and km.plot$plot overlayed over each other.
Following another user's suggestion of doing the following results in an error:
km.plot$plot + surv.plot$layers[[1]]
Error in FUN(X[[i]], ...) : object 'label' not found
I assume this error has to do with the following few lines
> 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) +
but I also added, inherit.aes = FALSE but did not fix my issue.
I also checked:
> 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
I am baffled. I am almost certain that this can be done as both objects are basically identical in terms of structure so I see no reason why this cannot be done. But I have spent quite some time on it with no hope. I really hope somebody can direct me!
Thank you for taking the time to read this post
This happens because the surv.plot layer contains mappings for a variable called label which is not included in the data for km.plot. You should be able to get around this by adding your surv.plot data as an argument to the geom rather than ggplot() when you create surv.plot. This way the data needed to draw the layer will "travel with" it.
We can illustrate this with simpler data. Let's first create a plot from data with only a few columns:
library(tidyverse)
df1 <- mtcars %>%
select(mpg, wt)
# This represents `km.plot`
(p <- ggplot(df1, aes(wt, mpg)) + geom_point())
Now we can try to add a layer that relies on columns not included in df1 to
the previous plot:
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]]
Created on 2018-07-23 by the reprex package (v0.2.0.9000).
来源:https://stackoverflow.com/questions/51477338/overlay-different-ggplot2-objects

