在箱线图下添加 n、均值和 sd 作为 numbers/numerics,标签在 y 轴下对齐
Add n, mean and sd as numbers/numerics under boxplots with labels aligned under y-axis
我知道 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)
上面的代码是这样处理的:
这就是我想要的:在 y 轴下方和 "in line" 下方的标签。对于 n,均值和 sd
不是最好的解决方案,但可能会让您了解如何以一般方式解决它...
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 轴的列中添加一个白色刻度加上级别数即可。
在 drmariod 的宝贵帮助下,我提出了以下通用解决方案:
1:变量"xorigin"保存x-value直接在y-axis
下
2:遇见=metric-Variable,猫=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)
我知道 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)
上面的代码是这样处理的:
这就是我想要的:在 y 轴下方和 "in line" 下方的标签。对于 n,均值和 sd
不是最好的解决方案,但可能会让您了解如何以一般方式解决它...
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 轴的列中添加一个白色刻度加上级别数即可。
在 drmariod 的宝贵帮助下,我提出了以下通用解决方案:
1:变量"xorigin"保存x-value直接在y-axis
下2:遇见=metric-Variable,猫=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)