Добавляйте горизонтальные линии (или текст) к отдельным блочным диаграммам при использовании facet_wrap в R.

Я хотел бы добавить горизонтальную линию к каждому из моих боксов, созданных с помощью функции facet_wrap. Это мой код, который создает мои ящики:

ggplot(data=new.dat, aes(variable, value)) + geom_boxplot() + 
  facet_wrap(~variable, scales="free", ncol=4) + 
  scale_x_discrete(breaks=NULL) + 
  labs(x="",y="") 

Это кадр данных, который я хотел бы использовать для каждой горизонтальной строки:

dat_hlines <- data.frame(cond=c("S1mgg","S2mgg","S3mgg","TOC",
                                "HI","OI","PI","TmaxC"),
                         hline=c(7.5,20,7.5,400,10,10,400,500))

Это самое близкое, что у меня есть:

ggplot(data=new.dat, aes(variable, value)) + geom_boxplot() + 
  geom_hline(data=dat_hlines,aes(yintercept=hline)) +
  facet_wrap(~variable, scales="free", ncol=4) + 
  scale_x_discrete(breaks=NULL) + 
  labs(x="",y="") 

Появляется несколько строк, т.е. одни и те же дублируются на каждой диаграмме.

Мне бы хотелось по одной строке на график, где каждая строка соответствует наблюдениям в dat_hlines$hline.

p.s. Я бы выложил графику, но моя оценка не позволяет.

ДАННЫЕ

tmp<- data.frame(matrix(vector(), 200, 2, dimnames=list(c(), 
              c("variable", "value"))), stringsAsFactors=F)
tmp[1]<-"S1mgg"
tmp[2]<-rnorm(200, mean=10, sd=3)

tmp2<- data.frame(matrix(vector(), 200, 2, dimnames=list(c(), 
       c("variable", "value"))), stringsAsFactors=F)
tmp2[1]<-"S2mgg"
tmp2[2]<-rnorm(200, mean=10, sd=3)

tmp3<- data.frame(matrix(vector(), 200, 2, dimnames=list(c(), 
       c("variable", "value"))), stringsAsFactors=F)
tmp3[1]<-"S3mgg"
tmp3[2]<-rnorm(200, mean=10, sd=3)

tmp4<- data.frame(matrix(vector(), 200, 2, dimnames=list(c(), 
       c("variable", "value"))), stringsAsFactors=F)
tmp4[1]<-"S3mgg"
tmp4[2]<-rnorm(200, mean=10, sd=3)

tmp5<- data.frame(matrix(vector(), 200, 2, dimnames=list(c(), 
       c("variable", "value"))), stringsAsFactors=F)
tmp5[1]<-"TOC"
tmp5[2]<-rnorm(200, mean=10, sd=3)

tmp6<- data.frame(matrix(vector(), 200, 2, dimnames=list(c(), 
       c("variable", "value"))), stringsAsFactors=F)
tmp6[1]<-"HI"
tmp6[2]<-rnorm(200, mean=10, sd=3)

tmp7<- data.frame(matrix(vector(), 200, 2, dimnames=list(c(), 
       c("variable", "value"))), stringsAsFactors=F)
tmp7[1]<-"OI"
tmp7[2]<-rnorm(200, mean=10, sd=3)

tmp8<- data.frame(matrix(vector(), 200, 2, dimnames=list(c(), 
      c("variable", "value"))), stringsAsFactors=F)
tmp8[1]<-"TmaxC"
tmp8[2]<-rnorm(200, mean=10, sd=3)

new.dat<-rbind(tmp,tmp2,tmp3,tmp4,tmp5,tmp6,tmp7,tmp8)

person user3310449    schedule 23.03.2015    source источник
comment
Можете предоставить данные?   -  person DatamineR    schedule 23.03.2015
comment
Да, могу, как лучше это сделать?   -  person user3310449    schedule 23.03.2015
comment
Где это находится? Если вы хотите получить помощь, вам нужно привести воспроизводимый пример   -  person DatamineR    schedule 23.03.2015
comment
Пожалуйста, извините за грубое кодирование, но...   -  person user3310449    schedule 23.03.2015
comment
... см. выше отредактированный текст. Вы сможете воспроизвести проблему с «new.dat» и «dat_hlines».   -  person user3310449    schedule 23.03.2015
comment
В ваших данных должны быть согласованные имена. Установите names(dat_hlines)[1] <- "variable", тогда он должен работать...   -  person konvas    schedule 23.03.2015
comment
Идеально - ты звезда. Можете ли вы ответить выше, чтобы было ясно, что вопрос закрыт? Спасибо большое. Даррен   -  person user3310449    schedule 23.03.2015


Ответы (1)


Что насчет этого?

new_data <- merge(new.dat, dat_hlines, by.x = "variable", by.y = "cond")
ggplot(data=new_data, aes(variable, value)) + geom_boxplot() + 
    facet_wrap(~variable, scales="free", ncol=4) + 
    scale_x_discrete(breaks=NULL) + 
    labs(x="",y="") + geom_hline(aes(yintercept = hline))

Это дает:

введите здесь описание изображения

person DatamineR    schedule 23.03.2015
comment
Если вы используете этот подход, при необходимости довольно легко добавить метки, используя geom_text. Просто убедитесь, что вы установили check_overlap = TRUE, если вы это сделаете. - person Dave Gruenewald; 28.07.2016