23

我正在尝试在数据集的 2 个不同方面生成 2 个具有不同颜色的不同 geom_vlines。我这样做是为了突出两个不同方面的手段。

这是数据集:

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:女性为粉红色,男性为蓝色。

这里给出的建议也不起作用。错误显示为:

Error in .(Sex == "female") : could not find function "."
4

3 回答 3

35

以下是您可以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") 

在此处输入图像描述

于 2017-05-26T08:38:46.680 回答
20

您可以创建一个 data.frame,其中一列是用于行的截距值,另一列是 Sex。这样在使用 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))

ggplot2:每个方面的均值线

于 2017-05-26T08:48:08.290 回答
1

以@Sébastien Rochette 的上述回答为基础;与其使用函数 summarise(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,因为每个平均值将在数据帧内每个因子的每个级别内重复。

于 2019-10-07T05:14:17.657 回答