在框图下添加n,mean和sd作为数字/数字,标签在y轴下对齐

时间:2017-02-06 14:37:05

标签: r ggplot2 label mean standard-deviation

我意识到thread,但解决方案看起来有点冗长而复杂:是否有快速简便的解决方案?要在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

这就是我想要的:标签下和&#34;在线&#34;与y轴。对于n,mean和sd

enter image description here

2 个答案:

答案 0 :(得分: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,但我猜有可能......

修改

好的,在因素的情况下更为一般:

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轴的列中的级别数。

答案 1 :(得分:0)

在drmariod的宝贵帮助下,我提出了以下一般解决方案:

1:变量&#34; xorigin&#34;将x值直接保持在y轴

2:met = metric-Variable,cat = categorial-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