r - How to overlay multiple layers of data in same plot in ggplot? -
data: data
code:
## load data ifpricc = read.csv(file = "ifpri_ccagg2050.csv", heade=true) #----------------------------------------------------------------------- # plotting kernel density distribution final yield impact data #----------------------------------------------------------------------- ifpricc.df = as.data.frame(ifpricc) ifpricc_mlt.df = melt(ifpricc.df, id.vars=c("crop","codereg","reg","sres","gcm","scen")) kernel = ggplot(data=subset(ifpricc_mlt.df, reg %in% c("canada","united states","oceania","oecd europe","eastern europe","former ussr") & gcm %in% c("csiro","miroc","nocc")), aes(x = value, y = ..density..)) kernel = kernel + geom_density(aes(fill = gcm), alpha=.4, subset = .(crop %in% c("whet")), position="identity", stat="density", size=0.75, bw = "nrd0", adjust = 1.5, kernel = c("gaussian")) kernel = kernel + scale_fill_manual(name="gcm model",breaks=c("csiro","miroc","nocc"), values=c("red","blue","gray80")) kernel = kernel + facet_grid(sres ~ reg, scale="free") + scale_y_continuous(breaks=seq(0,2,.25)) kernel = kernel + labs(title="kernel density distribution - , without climate change", y="density", x="yield") + theme_bw() kernel = kernel + theme(plot.title=element_text(face="bold", size=rel(2), hjust=0.5, vjust=1.5, family="serif"), axis.text.x=element_text(color="black", size=rel(2), hjust=0.5, family="serif"), axis.text.y=element_text(color="black", size=rel(2), hjust=1, family="serif"), axis.title.x=element_text(face="bold", color="black", size=rel(1.6), hjust=0.5, vjust=0.2, family="serif"), axis.title.y=element_text(face="bold", color="black", size=rel(1.6), hjust=0.5, vjust=0.2, family="serif"), strip.text=element_text(face="bold", size=rel(1.5), family="serif"), legend.text=element_text(face="bold", size=rel(1.25), family="serif"), legend.title=element_text(face="bold", size=rel(1.45), family="serif"))
results:
question:
what trying achieve here plot kernel density curves. problem want overlay baseline kernel curves (in lower facet) on colored ones (two upper facets) , represent deviations baseline. appreciated.
cheers :)
alternative question:
so tinkered bit after looking potential solutions on website, , came this: instead of faceting using facet_grid(sres ~ reg)
"sres" x "reg", faceted using facet_wrap(~ reg)
. produces closer intending .
the problem cannot identify distribution "sres", looking for. solve this, thought annotate plot adding vertical lines plot mean of data "sres". kind of @ loss of how move here.
any suggestions?
if understand, think want. need rearrange data: repeat lines in data frame containing nocc
factor, once sres = a1b
, , once sres = b1
. way, nocc density curve appear in a1b facets , in b1 facets.
in addition, melting of data frame has no effect other create column of 1s. also, subsetting outside call ggplot2
.
library(ggplot2) ifpricc = read.csv(file = "ifpri_ccagg2050.csv", heade=true) # subset data frame df = subset(ifpricc, reg %in% c("canada","united states","oceania","oecd europe","eastern europe","former ussr") & gcm %in% c("csiro","miroc","nocc") & crop %in% c("whet")) # manipulate data frame x = df[df$sres == "pm", ] x = rbind(x, x) x$sres = rep(c("a1b", "b1"), each = dim(x)[1]/2) df = df[df$sres != "pm",] df = rbind(df, x) # draw plot ggplot(data=df, aes(x = yield, fill = gcm)) + geom_density(alpha=.4, size=0.75, adjust = 1.5) + scale_fill_manual(name="gcm model",breaks=c("csiro","miroc","nocc"), values=c("red","blue","gray80")) + facet_grid(sres ~ reg, scale="free") + scale_y_continuous(breaks=seq(0,2,.25))
edit: facet_wrap version: idea draw 2 charts: 1 a1b, , second b1; put 2 charts using functions gridextra
package. give legend each chart. better 1 legend. therefore, draw 1 of charts legend can extracted. draw 2 charts without legends, , put 2 charts , legend together.
library(ggplot) library(gridextra) library(gtable) ifpricc = read.csv(file = "ifpri_ccagg2050.csv", heade=true) # subset data frame df = subset(ifpricc, reg %in% c("canada","united states","oceania","oecd europe","eastern europe","former ussr") & gcm %in% c("csiro","miroc","nocc") & crop %in% c("whet")) # draw first chart p1 = ggplot(data=df[df$sres != "b1", ], aes(x = yield, fill = gcm)) + geom_density(alpha=.4, size=0.75, adjust = 1.5) + ggtitle("sres = a1b") + scale_fill_manual(name="gcm model",breaks=c("csiro","miroc","nocc"), values=c("red","blue","gray80")) + facet_wrap( ~ reg, scales = "free_x") + scale_y_continuous(breaks=seq(0,2,.25)) # extract legend legend = gtable_filter(ggplot_gtable(ggplot_build(p1)), "guide-box") # redraw first chart without legend p1 = p1 + guides(fill = false) # draw second chart without legend p2 = ggplot(data=df[df$sres != "a1b", ], aes(x = yield, fill = gcm)) + geom_density(alpha=.4, size=0.75, adjust = 1.5) + ggtitle("sres = b1") + scale_fill_manual(name="gcm model",breaks=c("csiro","miroc","nocc"), values=c("red","blue","gray80"), guide = "none") + facet_wrap( ~ reg, scales = "free_x") + scale_y_continuous(breaks=seq(0,2,.25)) # combine 2 charts , legend (and main title) grid.arrange(arrangegrob(p1, p2, ncol = 1), legend, widths = unit.c(unit(1, "npc") - legend$width, legend$width), nrow = 1, main = textgrob("kernel density distribution - , without climate change", vjust = 1, gp = gpar(fontface = "bold")))
Comments
Post a Comment