gpt4 book ai didi

r - 如何在ggplot中的同一图中叠加多层数据?

转载 作者:行者123 更新时间:2023-12-02 01:51:07 25 4
gpt4 key购买 nike

数据:Data

代码:

## 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"))

结果:Plot

问题:

我在这里想要实现的是绘制内核密度曲线。我的问题是我想将基线内核曲线(在下部)覆盖在彩色曲线(两个上部)上,这代表与基线的偏差。任何帮助将不胜感激。

干杯:)

替代问题:

所以我在网站上查找了潜在的解决方案后做了一些修改,我想出了这个:而不是使用 facet_grid(sres ~ reg) by "sres"x "reg"进行分面,我使用 facet_wrap(~ reg) 进行分面。它产生的东西更接近我的意图Alt_plot .

现在的问题是我无法通过“sres”识别分布,而这正是我要寻找的。为了解决这个问题,我想通过添加用“sres”绘制数据平均值的垂直线来注释绘图。但我有点不知道如何离开这里。

有什么建议吗?

最佳答案

如果我理解,我想这就是你想要的。您需要重新排列数据:重复数据框中包含 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))

enter image description here

编辑: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

关于r - 如何在ggplot中的同一图中叠加多层数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22612128/

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