Нарисуйте срединные линии на соответствующей высоте на точечном точечном графике в ggplot2 - PullRequest
1 голос
/ 03 апреля 2019

Я измерил данное поведение у животных (самцов и самок) с различными репродуктивными состояниями (от девственницы до родителя).

Я рисую точечную диаграмму с точечными точками, и я хотел бы добавить срединную полосудля каждой подгруппы.Ранее я задавал похожий вопрос, и мне сказали использовать stat_summary с geom="point" для добавления медианного столбца (см. Пример кода ниже).

Моя проблема в том, что столбец кажется ошибочно размещенным вокруг реальногомедианное значение, вместо точного определения медианного значения (см. график ниже)

# Mock dataframe:
Sex<-rep(c("M","F"), times=12)
ID<-rep(seq(from=1, to=6), times=4)
Behavior<-rnorm(24, mean=10, sd=3)
State<-rep(c("virgin", "virgin", "mated", "mated", "expecting", "expecting", "parent", "parent"), times=3)
d<-data.frame(ID,Sex,Behavior,State)
d$State2=ifelse(d$Sex=="F", as.numeric(d$State) + 0.15, as.numeric(d$State) - 0.15) # horizontally dodging males to the left, females to the right

# The plot
b<-ggplot(d, aes(x=factor(State), y=Behavior, colour=factor(Sex)))+
  geom_dotplot(aes(x=State2, group=interaction(State, Sex), fill=Sex),binaxis="y", stackdir="center", stackratio=1.5, binwidth = 0.3, binpositions="all", dotsize=1)+
  stat_summary(aes(x=State2),fun.y = "median", geom="point", shape=45, size=20, show.legend = F, alpha=0.6) +
  labs(x="",y="Behavior")+
  geom_line(aes(x=State2, group=interaction(ID, Sex), color=Sex), alpha=0.5, size=0.2)+
  theme_classic()+ 
  theme(axis.line.x = element_line(color="black", size = 1),
        axis.line.y = element_line(color="black", size = 1))+
  theme(legend.position="none")+
  theme(axis.text.x =element_text(size=10),axis.text.y=element_text(size=10), axis.title=element_text(size=11,face="bold"))+
  scale_fill_manual(name="Sex", values=c("brown2", "blue3"), breaks=c("F", "M"))+
  scale_colour_manual(name="Sex",values=c("brown2","blue3"),breaks=c("F", "M"),labels=c("Female", "Male"))+
  scale_x_discrete(limits=c("virgin", "mated", "expecting", "parent"), labels=c("virgin"="Virgin", "mated"="Mated", "expecting"="Expecting", "parent"="Parent"))+
  theme(text=element_text(family="serif"))
b

example plot with added lines and medians

Редактировать: IМы рассмотрели другие возможности, например, использование geom=crossbar в операторе stat_summary, например: stat_summary(aes(x=State2),fun.y = "median", fun.ymax="median", fun.ymin="median", geom="crossbar", show.legend = F) +

Но проблема та же, столбцы расположены не точно ...: example with crossbar

Как я могу легко добавить точные срединные столбцы? Спасибо

1 Ответ

0 голосов
/ 05 апреля 2019

Попробуйте использовать geom_point вместо geom_dotplot

p<-ggplot(d, aes(x=factor(State), y=Behavior, colour=factor(Sex)))+

  geom_point(aes(x=State2, group=interaction(State, Sex), fill=Sex), size = 5)+

  stat_summary(aes(x=State2),fun.y = "median", geom="point", shape=45, size=20, show.legend = F, alpha=0.6) +
  labs(x="",y="Behavior")+
  geom_line(aes(x=State2, group=interaction(ID, Sex), color=Sex), alpha=0.5, size=0.2)+
  theme_classic()+ 
  theme(axis.line.x = element_line(color="black", size = 1),
        axis.line.y = element_line(color="black", size = 1))+
  theme(legend.position="none")+
  theme(axis.text.x =element_text(size=10),axis.text.y=element_text(size=10), axis.title=element_text(size=11,face="bold"))+
  scale_fill_manual(name="Sex", values=c("brown2", "blue3"), breaks=c("F", "M"))+
  scale_colour_manual(name="Sex",values=c("brown2","blue3"),breaks=c("F", "M"),labels=c("Female", "Male"))+
  scale_x_discrete(limits=c("virgin", "mated", "expecting", "parent"), labels=c("virgin"="Virgin", "mated"="Mated", "expecting"="Expecting", "parent"="Parent"))+
  theme(text=element_text(family="serif"))

Кстати, я не думаю, что ваши данные и метки x совпадают, поскольку столбец State в вашем фрейме данных d равен factor переменная упорядочена по алфавиту.Вам нужно будет изменить порядок уровней levels = c("virgin", "mated", "expecting", "parent")

Так что это будет что-то вроде:

d<-data.frame(ID,Sex,Behavior,State)

# Reorder State levels
d$State <- factor(d$State, levels = c("virgin", "mated", "expecting", "parent"))

d$State2=ifelse(d$Sex=="F", as.numeric(d$State) + 0.15, as.numeric(d$State) - 0.15) # horizontally dodging males to the left, females to the right
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...