2017-02-06 15 views
1

我知道thread,但該解決方案對我來說看起來有點長和複雜:是否有快速簡便的解決方案?要在y軸下添加以下矢量?添加n,平均值和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

這就是我想要的東西:在和 「線上」 與Y標籤-軸。對於n,平均值及標準差

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]))))) 

我想了一招將使用數字值而不是因子,您可以添加接近您的限制的刻度標籤。這可以比標記和刻度線是白色的和...

漂亮哈克,但我想是有潛力...

編輯

好,多一點點在一般情況下的因素:

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」直接在y軸下保持X值

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

相關問題