如何在ggplot中叠加多个数据层?

3

数据: 数据

代码:

## Load the data

ifpricc = read.csv(file = "IFPRI_CCAgg2050.csv", heade=TRUE)

#-----------------------------------------------------------------------
# Plotting Kernel density distribution for the 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 - with and 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"))

结果:

结果:图表

问题:

我在这里想要实现的是绘制核密度曲线。我的问题是,我想将基线核曲线(在较低的面板中)叠加在彩色曲线(两个上面的面板)上,并表示与基线的偏差。任何帮助都将不胜感激。

谢谢:)

备选问题:

因此,在查找网站上的潜在解决方案后,我进行了一些调整,得出了这个结果:不使用"sres" x "reg"通过facet_grid(sres ~ reg)分组,而是使用facet_wrap(~ reg)进行分组。它产生了更接近我所期望的结果 Alt_plot .

现在的问题是,我无法通过"sres"来识别分布,这正是我正在寻找的。为了解决这个问题,我想注释图表,通过添加垂直线来绘制数据的" sres "均值。但我有点不知道该怎么做。

有什么建议吗?

1个回答

2
如果我理解正确,我认为这就是您想要的。您需要重新排列数据:在包含noCC因子的数据框中重复行,一次使用sres = A1B,一次使用sres = B1。这样,noCC密度曲线将出现在A1B和B1图面中。
此外,数据框的融合除了创建一个1的列之外没有任何影响。另外,在调用ggplot2之外进行子集操作。
library(ggplot2)
ifpricc = read.csv(file = "IFPRI_CCAgg2050.csv", heade=TRUE)

# Subset the 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 the 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 the 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))

这里输入图片描述

编辑:facet_wrap版本: 这个想法是绘制两张图表:一张是A1B,另一张是B1;然后使用gridExtra包中的函数将两张图表组合在一起。但是这样会给每个图表都提供一个图例。只有一个图例会更好看。因此,绘制其中一张图表,以便可以提取其图例。然后绘制两张没有图例的图表,并将两张图表和图例组合在一起。

library(ggplot)
library(gridExtra)
library(gtable)
ifpricc = read.csv(file = "IFPRI_CCAgg2050.csv", heade=TRUE)

# Subset the 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 its legend
legend = gtable_filter(ggplot_gtable(ggplot_build(p1)), "guide-box")

# Redraw the first chart without its legend
p1 = p1 + guides(fill = FALSE)

# Draw the second chart without its 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 the two charts and the legend (and a 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 - with and without climate change", 
   vjust = 1,  gp = gpar(fontface = "bold")))

enter image description here


我怀疑我需要修改数据的结构 :) 我只是希望我不必这样做。另一方面,比较facet_grid()和facet_wrap()版本,我认为后者看起来更好。因此,你能帮我完成另一个问题吗?我的目标是按sres绘制平均值。 - iouraich

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接