将 n、mean 和 sd 添加为箱线图下的数字/数字,标签在 y 轴下对齐
Posted
技术标签:
【中文标题】将 n、mean 和 sd 添加为箱线图下的数字/数字,标签在 y 轴下对齐【英文标题】:Add n, mean and sd as numbers/numerics under boxplots with labels aligned under y-axis 【发布时间】:2017-06-23 13:05:37 【问题描述】:我知道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 轴下方和“对齐”的标签。对于 n,mean 和 sd
【问题讨论】:
这可能有帮助吗? ***.com/questions/12409960/… 不,它没有帮助 我发现的代码需要“特定”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 处添加一个额外的中断,并将你的额外标签添加到 @ 987654324@ 变量。要隐藏刻度线,您只需添加一个白色刻度线以及用于 x 轴的列中的级别数。
【讨论】:
在这种情况下看起来非常好!!!现在我需要找出如何自动获得“2.5”。你是怎么想出 2.5 的?试错? 当组是“g1”、“g2”和“g3”等“类别”时我应该使用什么。 明天可以给你一个例子......但是你可以使用 as.numeric 将你的因子转换为从 1 开始的序列,这样你就可以在 0.1 处休息,这应该可以工作...... 会很棒。我把齿轮换成了b和c。什么都没有了: mtcars$gear[mtcars$gear==3] 我添加了一个带有因子的示例...所以这里基本上因子的数字从 1 开始...只需在 0.5 或 0 处添加一个中断并修改标签。如果你有很多标签,这可能会叠印......但不确定如何以一般方式解决这个问题。【参考方案2】:在 drmariod 的宝贵帮助下,我想出了以下通用解决方案:
1:变量“xorigin”保存y轴正下方的x值
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)
【讨论】:
以上是关于将 n、mean 和 sd 添加为箱线图下的数字/数字,标签在 y 轴下对齐的主要内容,如果未能解决你的问题,请参考以下文章