gpt4 book ai didi

r - R : use `geom_ribbon` for shading under two different `geom_smooth` lines 中的 ggplot2

转载 作者:行者123 更新时间:2023-12-04 10:47:41 26 4
gpt4 key购买 nike

使用 this dataset ,我创建了这个图:

A graph for seconds vs age of a race, with blue points representing males and pink females

我想在geom_smooth下遮荫行,像这样:

The same graph, but with shading below a <code>geom_smooth</code> line for the entire dataset.

我只希望蓝线下或粉红色线下的点具有这些颜色,并且两条线下的所有点都为深灰色。

我使用此代码来创建图形:

p3 <- ggplot(df, aes(x = SECONDS, y = AGE, color = GENDER)) +
geom_point() + theme_fivethirtyeight_mod() + ggtitle('Seconds vs. Age') +
geom_hline(yintercept = 0, size = 1.2, colour = "#535353") +
geom_vline(xintercept = 0, size = 1.2, colour = "#535353") +
geom_smooth(se = F) +
geom_ribbon(aes(ymin = 0, ymax = predict(loess(AGE ~ SECONDS))), alpha = 1)
theme_fivethirtyeight_mod()的代码这是:
require(ggplot2)
require(ggthemes)
require(ggrepel)
require(grid)
require(gtable)

theme_fivethirtyeight_mod <- function (base_size = 12, base_family = "sans") {
(theme_foundation(base_size = base_size, base_family = base_family) +
theme(line = element_line(colour = "black"),
rect = element_rect(fill = ggthemes_data$fivethirtyeight["ltgray"], linetype = 0, colour = NA),
text = element_text(colour = ggthemes_data$fivethirtyeight["dkgray"]),
axis.text = element_text(size = 11, colour = ggthemes_data$fivethirtyeight["dkgray"], face = "bold"),
axis.ticks = element_blank(),
axis.line = element_blank(),
axis.title = element_text(size = 11, colour = ggthemes_data$fivethirtyeight["dkgray"], face = "bold", vjust = 1.5),
legend.title = element_blank(),
legend.background = element_rect(fill="gray90", size=.5, linetype="dotted"),
legend.position = "bottom",
legend.direction = "horizontal",
legend.box = "vertical",
panel.grid = element_line(colour = NULL),
panel.grid.major = element_line(colour = ggthemes_data$fivethirtyeight["medgray"]),
panel.grid.minor = element_blank(),
plot.title = element_text(hjust = 0.05, size = rel(1.5), face = "bold"),
plot.margin = unit(c(1, 1, 1, 1), "lines"),
panel.background = element_rect(fill = "#F0F0F0"),
plot.background = element_rect(fill = "#F0F0F0"),
panel.border = element_rect(colour = "#F0F0F0"),
strip.background = element_rect()))
}

感谢所有的帮助!

编辑:

@MLavoie 评论了一个问题的链接,该问题让我对如何在 geom_smooth 下进行着色有了基本的了解。使用 predict(loess(AGE ~ SECONDS)) 行. predict()geom_smooth , 和 loessn < 1000时使用的方法.这使我能够在男性和女性线下着色,但不允许我找到两条曲线下的区域。深灰色阴影区域是 geom_smooth 下方的区域对于整个数据集。

我怀疑要找到男性和女性曲线下的面积,我首先需要从 geom_smooth 中获取数据。 s(男性和女性)。然后我会创建一个 data.frame x 值作为行,每组 y 值都有一列。我会找到每个 x 值的最小 y 值,然后我会在该曲线下方着色深灰色。

有趣的是,阴影区域用浅蓝色勾勒出来,就像点一样,图例显示红色或蓝色轮廓框填充深灰色。我在代码中添加了这个而不是原来的 geom_ribbon :
geom_ribbon(data = df[df$GENDER == 'F',], aes(ymin = 0, ymax = predict(loess(AGE ~ SECONDS))), alpha = 1, fill = "red") +
geom_ribbon(data = df[df$GENDER == 'M',], aes(ymin = 0, ymax = predict(loess(AGE ~ SECONDS))), alpha = 1, fill = "blue") +
geom_ribbon(aes(ymin = 0, ymax = predict(loess(AGE ~ SECONDS))), alpha = 1)

这是创建此图所涉及的唯一新代码:

A graph similar to the above, but with shading underneath <code>geom_smooth</code> lines.

从本质上讲,我想删除填充区域的蓝色轮廓,并从图例中的框中删除深灰色填充,如果有人能弄清楚我希望如何为两条线下方的区域着色。再次感谢!

最佳答案

关闭图例的颜色或填充以获得您想要的。

关闭颜色图例:

p3 <- ggplot(df, aes(x = SECONDS, y = AGE, color = GENDER)) +
geom_point() +
theme_fivethirtyeight_mod() +
ggtitle('Seconds vs. Age') +
geom_hline(yintercept = 0, size = 1.2, colour = "#535353") +
geom_vline(xintercept = 0, size = 1.2, colour = "#535353") +
geom_smooth(se = F) +
geom_ribbon(data = df[df$GENDER == 'F',],
aes(ymin = 0, ymax = predict(loess(AGE ~ SECONDS)),
fill = "Female"),colour = F) +
geom_ribbon(data = df[df$GENDER == 'M',],
aes(ymin = 0, ymax = predict(loess(AGE ~ SECONDS)),
fill = "Male"),colour = F) +
geom_ribbon(aes(ymin = 0, ymax = predict(loess(AGE ~ SECONDS))),
colour = F) +
scale_fill_manual(values = c('Female' = 'red','Male' = 'blue')) +
guides(colour = F)

enter image description here

关闭填充图例:
p4 <- ggplot(df, aes(x = SECONDS, y = AGE, color = GENDER)) +
geom_point() +
theme_fivethirtyeight_mod() +
ggtitle('Seconds vs. Age') +
geom_hline(yintercept = 0, size = 1.2, colour = "#535353") +
geom_vline(xintercept = 0, size = 1.2, colour = "#535353") +
geom_smooth(se = F) +
geom_ribbon(data = df[df$GENDER == 'F',],
aes(ymin = 0, ymax = predict(loess(AGE ~ SECONDS))),
fill = 'red',colour = F) +
geom_ribbon(data = df[df$GENDER == 'M',],
aes(ymin = 0, ymax = predict(loess(AGE ~ SECONDS))),
fill = 'blue',colour = F) +
geom_ribbon(aes(ymin = 0, ymax = predict(loess(AGE ~ SECONDS))),
colour = F) +
guides(fill = F)

enter image description here

需要注意的几点:
  • 我不知道你为什么要使用第三个 geom_ribbon .如果您想对其他两条色带下方区域的交点进行着色,则为完整数据对黄土下方的区域进行着色不会为您提供交集 - 您可以通过使图形不透明(通过指定 alpha < 1)
  • alpha =1 默认情况下,因此您不需要明确指定它。
  • 关于r - R : use `geom_ribbon` for shading under two different `geom_smooth` lines 中的 ggplot2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37368778/

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