我有一个包含四个组的方格图,我想为每个组添加一个名称,它由两行组成的组成,和包含下标。因此,我尝试使用bquote()
#sample data
groups = matrix(1:40,ncol=4)
#create group names
names = as.expression(sapply(1:4, function(x){
letter = LETTERS[x]
name = bquote(atop(.(letter),num[.(x)] == .(x)))
return(name)
}))
boxplot(groups, names = names)这给了我以下的结果:

我几乎对结果感到满意。然而,atop()有一些奇怪的间距,因此顶部的行(带有字母A)位于外部边界的顶部。我找不到解决这个问题的办法。
我还尝试了以下几点:
#Alternative Approach (not working)
names = parse(text=paste(LETTERS[1:4],"\n","num[", 1:4, "]", sep=""))在本例中,添加"\n“(新行)只会将names变量从长度4分解为长度8。
我完全不知道如何解决这个看似简单的问题。帮助是非常感谢的!
发布于 2022-11-24 20:23:44
另一种选择是将此图转换为ggplot2
library(tidyverse)
groups = matrix(1:40,ncol=4)
#create group names
names = as.expression(sapply(1:4, function(x){
letter = LETTERS[x]
name = bquote(atop(.(letter),num[.(x)] == .(x)))
return(name)
}))
as.data.frame.matrix(groups) |>
`colnames<-`(LETTERS[1:4]) |>
pivot_longer(everything()) |>
ggplot(aes(name, value))+
geom_boxplot(fill = "grey")+
scale_x_discrete(labels = names)+
labs(x = "", y = "")+
theme_bw()+
theme(panel.grid = element_blank())

发布于 2022-11-25 13:29:15
勾标与X轴的距离由下面示例中的mgp图形参数- 2.5的中间数控制。有关详细信息,请参阅?par。根据你的口味调整2.5。请注意,可以通过将names构造为字符向量,然后解析它来简洁地计算它。
fmt <- 'atop("%s", num[%dL] == %dL)'
names <- parse(text = sprintf(fmt, head(LETTERS, 4), 1:4, 1:4))但是,下面的代码与问题中的代码相同,但添加的两行par除外。最后一个par行只是重置图形参数,并提供了一些防御能力,以防有更多的绘图,但如果没有更多的绘图,则以放弃这一点为代价可以省略。
groups = matrix(1:40,ncol=4)
#create group names
names = as.expression(sapply(1:4, function(x){
letter = LETTERS[x]
name = bquote(atop(.(letter),num[.(x)] == .(x)))
return(name)
}))
opar <- par(mgp = c(3, 2.5, 0))
boxplot(groups, names = names)
par(opar)

https://stackoverflow.com/questions/74565179
复制相似问题