2017-02-06 11 views
1

Мне известно об этом thread, но решение выглядит для меня как-то длинным и сложным: есть ли быстрое и простое решение? Чтобы добавить следующий вектор под осью y?Добавьте n, mean и sd в виде чисел/цифр под ящиками с метками, выровненными по оси y

yLabels <- c("","","n","mn","sd") 

Воспроизводимые данные:

library(ggplot2) 
library(magrittr) 

mtcars <- mtcars 

values <- rbind(tapply(mtcars$mpg,mtcars$gear,length)) %>% rbind(tapply(mtcars$mpg,mtcars$gear,mean)) %>% rbind(tapply(mtcars$mpg,mtcars$gear,sd)) %>% 
    round(3) 

levels <- rbind(levels(mtcars$gear%>%factor),matrix("",ncol=ncol(values))) 

xlabs <- rbind(levels,values) %>% apply(.,2,function(x) {paste(x,collapse="\n")}) 
ggplot(mtcars, aes(x=factor(gear), y=mpg, fill=factor(gear))) + geom_boxplot() + scale_x_discrete(labels=xlabs) 

Это то, что приведенный выше код процессы:

Missing Labels to explain numerics

Это то, что я хочу: Этикетки под и "в строке" с у -ось. Для п, имею в виду и с.о.

enter image description here

+0

ли это, возможно, помочь? http://stackoverflow.com/questions/12409960/ggplot2-annotate-outside-of-plot – drmariod

+0

нет, он не помогает –

+0

Коды, которые я нашел, нуждаются в «конкретных» позициях ylab (в моем случае, возможно, 8 и т. д.), я хочу общее решение просто вставить (n, mn, sd) в эту позицию. независимо от того, что такое масштабирование. Он уже работает с xlabels. это общий подход. –

ответ

1

Не приятное решение, но дает представление о том, может быть, как ее решить в общем виде ...

xlabs <- c('2.5'='\n\nn\nmn\nsd', 
      rbind(levels,values) %>% apply(.,2,function(x) {paste(x,collapse="\n")})) 
ggplot(mtcars, aes(x=gear, y=mpg, fill=factor(gear))) + 
    geom_boxplot() + 
    scale_x_continuous(breaks=c(2.5,3,4,5), labels=xlabs) + 
    theme(axis.ticks.x=element_line(color=c('white', rep('black', length(xlabs[-1]))))) 

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

Довольно Hacky, но я предполагаю, что есть потенциал ...

EDIT

Хорошо, немного больше общий случай факторов:

mtcars$test <- as.factor(mtcars$gear) 
xlabs <- 
    c('2.5'='\n\nn\nmn\nsd', 
    rbind(levels,values) %>% 
     apply(.,2,function(x) {paste(x,collapse="\n")})) 

ggplot(mtcars, aes(x=as.numeric(test), y=mpg, fill=factor(gear))) + 
    geom_boxplot() + 
    scale_x_continuous(breaks=c(0.5, seq(1,length(levels(mtcars$test)))), 
        labels=xlabs) + 
    theme(axis.ticks.x=element_line(color=c('white', 
              rep('black', length(xlabs[-1]))))) 

факторы могут быть представлены as.numeric, а затем в основном это целые числа, начиная с 1. Таким образом, вы можете просто использовать это, чтобы положить их на непрерывной шкале и добавить дополнительный перерыв на 0 или 0.5 и добавьте дополнительную метку в переменную xlabs. Чтобы скрыть галочку, вы можете просто добавить белый тик плюс количество уровней в столбце, используемом для оси x.

+0

В этом случае это выглядит очень хорошо !!! Теперь мне нужно выяснить, как я могу получить «2.5» автоматически. Как вы придумали 2.5? Методом проб и ошибок? –

+0

Что я должен использовать, когда группы являются «категориями», такими как «g1», «g2» и «g3». –

+0

Может дать пример завтра ... Но вы можете использовать as.numeric для преобразования ваших факторов в последовательность, начинающуюся с 1, чтобы вы могли просто на перерыв в 0,1, и это должно сработать ... – drmariod

0

С ценной помощью drmariod я придумал следующее общее решение:

1: переменная «xorigin» имеет х-значение непосредственно под оси у

2: мет = Метрика -переменный, кот = категориально-Variable

library(ggplot2) 
library(magrittr) 

## Change only right sides to your needs ## 
ds  <- diamonds 
catName <- "cut" 
metName <- "price" 
########################################### 

names(ds)[match(catName,names(ds))] <- "catVar" 
names(ds)[match(metName,names(ds))] <- "metVar" 

values <- rbind(tapply(ds$metVar,ds$catVar,length)) %>% rbind(tapply(ds$metVar,ds$catVar,mean)) %>% rbind(tapply(ds$metVar,ds$catVar,sd)) %>% 
      round(3) 
if (!is.factor(ds$catVar)) { 
    ds$catVar <- factor(ds$catVar, levels=colnames(values)) 
} 

levels <- rbind(levels(ds$catVar),matrix("",ncol=ncol(values))) 

xlabs <- 
    c('2.5'='\n\nn\nmn\nsd', 
    rbind(levels,values) %>% 
     apply(.,2,function(x) {paste(x,collapse="\n")})) 

p <- ggplot(ds, aes(x=as.numeric(catVar), y=metVar, fill=factor(catVar))) + 
    geom_boxplot() 
xorigin <- ggplot_build(p)$panel$ranges[[1]][[1]][1] 
rm(p) 


ggplot(ds, aes(x=as.numeric(catVar), y=metVar, fill=factor(catVar))) + 
    geom_boxplot() + 
    scale_x_continuous(breaks=c(xorigin, seq(1,length(levels(ds$catVar)))), 
        labels=xlabs) + 
    theme(axis.ticks.x=element_line(color=c('white', 
              rep('black', length(xlabs[-1]))))) + 
    xlab(catName) + 
    ylab(metName) + 
    labs(fill=catName) 

enter image description here