我意识到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)
以上代码处理的内容如下:
这就是我想要的:标签下和&#34;在线&#34;与y轴。对于n,mean和sd
答案 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)