Как получить разные geom_vline в разных аспектах в R?

Я пытаюсь создать 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 влайн в каждом аспекте: розовый у женщины и синий у мужчины.

Предложение дать здесь тоже не работает. Показана ошибка:

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

2 ответа

Решение

Вот как можно положить в разные 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 с одним столбцом, который будет использоваться для перехвата, и вторым столбцом с 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, xintercept=Int)

Без твоих данных я не могу это проверить.

Основываясь на ответе @Sébastien Rochette выше; Вместо того, чтобы создавать новый фрейм данных dataInt с функцией summarize(Int = mean(Age)), которая не сработала для меня, поскольку у меня было несколько уровней в каждом графике фасета, используйте вместо этого 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 для всех значений, потому что каждое среднее будет повторяться на каждом уровне каждого фактора в кадре данных.

Другие вопросы по тегам