以避免最后一行短的方式包裹 ggplot2 条带文本?

问题描述 投票:0回答:1

我正在制作一个绘图,其中变量描述出现在

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())

当贴标机的分割线足够长而需要包裹时,有没有办法让贴标机分割线更均匀?例如,将“穿着小帽子的小猫”包装为“穿着 | 小帽子的小猫”而不是“穿着小帽子的小猫”?

r ggplot2 word-wrap facet-wrap
1个回答
0
投票

我发现

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))

结果如下:

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.