如何在 R 的不同方面产生不同的 geom_vline?
How to produce different geom_vline in different facets in R?
我正在尝试在数据集的 2 个不同方面生成 2 个具有不同颜色的 geom_vlines。我这样做是为了突出 2 个不同方面的方法。
这是数据集:
Pclass Sex Age SibSp Parch Fare Cabin Embarked Survived
3 male 22 1 0 7.25 S 0
1 female 38 1 0 71.2833 C85 C 1
3 female 26 0 0 7.925 S 1
1 female 35 1 0 53.1 C123 S 1
3 male 35 0 0 8.05 S 0
1 male 54 0 0 51.8625 E46 S 0
代码如下:
g<-ggplot(data = train3, aes(x = Age, y = Survived, colour = factor(Pclass)))
g<-g+facet_wrap(~Sex)
g<-g+geom_point(size = 4, alpha = 0.2)+ggtitle("Survival by Gender")+theme(plot.title = element_text(hjust = 0.5))
g<-g+geom_vline(data = subset(train3,Sex=="female"), xintercept = mean(train3[which(train3$Sex=="female"),3]), colour = "pink", size = 1)
g<-g+geom_vline(data = subset(train3,Sex=="male"), xintercept = mean(train3[which(train3$Sex=="male"),3]), colour = "blue", size = 1)
g
这是输出
我实际上只想在每个面中生成 1 个 vline:女性为粉红色,男性为蓝色。
给 here 的建议也不行。错误显示为:
Error in .(Sex == "female") : could not find function "."
以下是如何为不同的鸢尾花品种输入不同的 geom_vline
:
ggplot(iris, aes(Sepal.Length, Petal.Length)) + facet_wrap(~Species, scales="free") + geom_point() +
geom_vline(data=filter(iris, Species=="setosa"), aes(xintercept=5), colour="pink") +
geom_vline(data=filter(iris, Species=="versicolor"), aes(xintercept=6), colour="blue") +
geom_hline(data=filter(iris, Species=="virginica"), aes(yintercept=6), colour="green")
您可以创建一个 data.frame,其中一列是用于线条的截距值,第二列是性别。这样在使用facet_wrap的时候就分开了
类似于:
dataInt <- train3 %>%
group_by(Sex) %>%
summarize(Int = mean(Age))
然后你就可以在你的脚本中使用它了:
g<-ggplot(data = train3, aes(x = Age, y = Survived, colour = factor(Pclass))) +
facet_wrap(~Sex) +
geom_vline(data=dataInt, aes(xintercept=Int))
没有你的数据,我无法测试这个。
[编辑:使用代表]
如果我使用与 Adam Quek 相同的数据作为可重现的示例,代码将按如下方式自动执行:
library(tidyverse)
dataLine <- iris %>%
group_by(Species) %>%
summarize(mean_x = mean(Sepal.Length))
ggplot(iris) +
aes(x = Sepal.Length, y = Petal.Length) +
facet_wrap(facets = vars(Species)) +
geom_point() +
geom_vline(data = dataLine, aes(xintercept = mean_x, colour = Species))
以上@Sébastien Rochette 的回答为基础;与其使用函数 summarize(Int = mean(Age)) 创建一个新的数据框 dataInt,不如使用 mutate 代替,因为我在每个构面图中有多个级别,这对我不起作用。
train3 <- train3 %>%
group_by(Sex) %>%
mutate(Int = mean(Age))
然后你可以在
中使用train3数据框
g<-ggplot(data = train3, aes(x = Age, y = Survived, colour = factor(Pclass))) +
facet_wrap(~Sex) +
geom_vline(data=train3, xintercept=Int)
这行得通,但我担心它可能为所有值创建了一个 geom_vline,因为每个均值将在数据框中每个因子的每个级别内重复。
我正在尝试在数据集的 2 个不同方面生成 2 个具有不同颜色的 geom_vlines。我这样做是为了突出 2 个不同方面的方法。
这是数据集:
Pclass Sex Age SibSp Parch Fare Cabin Embarked Survived
3 male 22 1 0 7.25 S 0
1 female 38 1 0 71.2833 C85 C 1
3 female 26 0 0 7.925 S 1
1 female 35 1 0 53.1 C123 S 1
3 male 35 0 0 8.05 S 0
1 male 54 0 0 51.8625 E46 S 0
代码如下:
g<-ggplot(data = train3, aes(x = Age, y = Survived, colour = factor(Pclass)))
g<-g+facet_wrap(~Sex)
g<-g+geom_point(size = 4, alpha = 0.2)+ggtitle("Survival by Gender")+theme(plot.title = element_text(hjust = 0.5))
g<-g+geom_vline(data = subset(train3,Sex=="female"), xintercept = mean(train3[which(train3$Sex=="female"),3]), colour = "pink", size = 1)
g<-g+geom_vline(data = subset(train3,Sex=="male"), xintercept = mean(train3[which(train3$Sex=="male"),3]), colour = "blue", size = 1)
g
这是输出
我实际上只想在每个面中生成 1 个 vline:女性为粉红色,男性为蓝色。
给 here 的建议也不行。错误显示为:
Error in .(Sex == "female") : could not find function "."
以下是如何为不同的鸢尾花品种输入不同的 geom_vline
:
ggplot(iris, aes(Sepal.Length, Petal.Length)) + facet_wrap(~Species, scales="free") + geom_point() +
geom_vline(data=filter(iris, Species=="setosa"), aes(xintercept=5), colour="pink") +
geom_vline(data=filter(iris, Species=="versicolor"), aes(xintercept=6), colour="blue") +
geom_hline(data=filter(iris, Species=="virginica"), aes(yintercept=6), colour="green")
您可以创建一个 data.frame,其中一列是用于线条的截距值,第二列是性别。这样在使用facet_wrap的时候就分开了
类似于:
dataInt <- train3 %>%
group_by(Sex) %>%
summarize(Int = mean(Age))
然后你就可以在你的脚本中使用它了:
g<-ggplot(data = train3, aes(x = Age, y = Survived, colour = factor(Pclass))) +
facet_wrap(~Sex) +
geom_vline(data=dataInt, aes(xintercept=Int))
没有你的数据,我无法测试这个。
[编辑:使用代表] 如果我使用与 Adam Quek 相同的数据作为可重现的示例,代码将按如下方式自动执行:
library(tidyverse)
dataLine <- iris %>%
group_by(Species) %>%
summarize(mean_x = mean(Sepal.Length))
ggplot(iris) +
aes(x = Sepal.Length, y = Petal.Length) +
facet_wrap(facets = vars(Species)) +
geom_point() +
geom_vline(data = dataLine, aes(xintercept = mean_x, colour = Species))
以上@Sébastien Rochette 的回答为基础;与其使用函数 summarize(Int = mean(Age)) 创建一个新的数据框 dataInt,不如使用 mutate 代替,因为我在每个构面图中有多个级别,这对我不起作用。
train3 <- train3 %>%
group_by(Sex) %>%
mutate(Int = mean(Age))
然后你可以在
中使用train3数据框g<-ggplot(data = train3, aes(x = Age, y = Survived, colour = factor(Pclass))) +
facet_wrap(~Sex) +
geom_vline(data=train3, xintercept=Int)
这行得通,但我担心它可能为所有值创建了一个 geom_vline,因为每个均值将在数据框中每个因子的每个级别内重复。