将 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 轴下对齐的主要内容,如果未能解决你的问题,请参考以下文章

将图像设置为多边形的颜色

Plotly:循环中的 add_trace

R语言ggplot2可视化在箱图中为箱图添加均值的标签及对应数值实战

R语言常用命令集合

小提琴图

用dplyr汇总后如何执行计算?