我正在制作一个绘图,其中变量描述出现在
facet_wrap()
方面的左侧“条带”文本中。有时,当变量描述足够长而可以换行时,最后一行会非常短。这可能会使情节看起来很奇怪,尤其是当文本右对齐时。
这是一个可重现的示例:
library('ggplot2')
dat <- data.frame(variable=rep(c('Frogs','Kittens wearing tiny hats','Mars',
'Really long name that will wrap to three lines','Tacos',
'Your local public library'),each=2))
dat$stratify <- rep(c('Yes','No'),6)
dat$beta <- 1:12
dat$lower_ci <- dat$beta - (1:12)/10
dat$upper_ci <- dat$beta + (1:12)/10
dat$is_oddvar <- grepl('Frogs|Mars|Tacos',dat$variable) # Every other variable in the plot has a grey stripe
ggplot(dat,aes(x=beta,xmin=lower_ci,xmax=upper_ci,y=stratify,color=stratify)) +
# Gray/white stripes
geom_rect(aes(fill=is_oddvar),color='grey90',xmin = -Inf,xmax = Inf,ymin = -Inf,ymax = Inf) +
scale_fill_manual(breaks=c(T,F),values=c('grey90','white'),guide=NULL) +
facet_wrap('variable',strip.position='left',ncol=1,scales='fixed',labeller=label_wrap_gen(width=24)) +
# Points and confidence intervals
geom_point() + geom_linerange(linewidth=1) +
# Themes/general plot appearance
theme_bw() +
theme(panel.spacing=unit(0,'lines'),panel.border=element_blank(),
axis.ticks.y=element_blank(),axis.text.y=element_blank(),
axis.title.y=element_blank(),axis.title.x=element_blank(),
strip.text.y.left=element_text(angle=0,hjust=1),strip.background=element_blank(),
legend.position='bottom',legend.title=element_blank())
当贴标机的分割线足够长而需要包裹时,有没有办法让贴标机分割线更均匀?例如,将“穿着小帽子的小猫”包装为“穿着 | 小帽子的小猫”而不是“穿着小帽子的小猫”?
我发现
nchar()
可以用来控制labeller
的字符串长度。由于 nchar()
返回输入字符串的字符数,因此我们可以使用 facet_wrap()
变量作为其输入字符串,然后将其返回除以分数以获得长度的数值向量。然后,我们使用这个向量作为 width
中 label_wrap_gen()
的值。
在你的例子中,通过反复试验,我发现
0.51
是一个不错的选择。然后我将您的 facet_wrap(...)
行更改为以下内容:
facet_wrap(vars(variable),strip.position='left',ncol=1,scales='fixed',
labeller=label_wrap_gen(width = nchar(vars(variable))/0.51))
结果如下: