R 使用因子在ggplot中将标签拆分为两行

R 使用因子在ggplot中将标签拆分为两行,r,string,ggplot2,label,R,String,Ggplot2,Label,我有一个图,它的标签是“1990-2012”形式的因子。它们太长和/或太多并且重叠 我想将每个标签打印在两行上,并在连字符后将其打断,如下所示: 对于将标签分成两部分仍然不够的情况,我还想知道如何只打印其他标签 我的一个限制是标签应该“就地”完成,而不需要对data.frame和/或标签进行预处理,尽管在对ggplot的调用中应用自定义函数也可以 这是神圣不可侵犯的数据帧(无法更改): [在我手动更改数据框,在日期分隔连字符后添加空格,换句话说,在我作弊之后,上面的两行用于生成第二个绘图]

我有一个图,它的标签是“1990-2012”形式的因子。它们太长和/或太多并且重叠

我想将每个标签打印在两行上,并在连字符后将其打断,如下所示:

对于将标签分成两部分仍然不够的情况,我还想知道如何只打印其他标签

我的一个限制是标签应该“就地”完成,而不需要对data.frame和/或标签进行预处理,尽管在对ggplot的调用中应用自定义函数也可以

这是神圣不可侵犯的数据帧(无法更改):

[在我手动更改数据框,在日期分隔连字符后添加空格,换句话说,在我作弊之后,上面的两行用于生成第二个绘图]

以下打印较少标签的方法通常有效,但在此失败:

   library(scales)
   p + scale_x_discrete(breaks = pretty_breaks(n = 6)) 

这就是你要找的吗

p + scale_x_discrete(
  labels=function(x){
    x2 <- sub("(\\d+)\\-(\\d+)",
               "\\1\\-\n\\2",
               x)
    x2
  })
更紧凑一点

编辑: 更简洁的解决方案,感谢@jlhoward:

p + scale_x_discrete(
  labels=function(x) sub("-","-\n",x,fixed=TRUE))

谢谢@nrussell,同时我意识到我可以使用
stringr
包中的
str\u replace
。我错过了这一点,我在
stru sub
上浪费了时间,没有意识到这项工作需要
stru替换。
stringr
解决方案是:
p+scale\u x\u离散(标签=函数(x)str\u包装(str\u替换(x,“-”,“-”,宽度=4))
按照您建议的思路解决方案是我所期望的,但我只是不知道这些反斜杠和
d+
是如何工作的,我确信自己永远无法解决它。看看
sub()
中的术语,很明显我无法单独想出这个词!谢谢,:-)不客气
\\d+
是正则表达式语法中“1个或多个连续数字”的缩写。连字符前面的反斜杠可能是必要的,也可能不是必要的-一些正则表达式符号具有特殊含义,需要转义(在R和其他一些语言中为双转义),以便进行字面解释;我总是忘记到底是哪一个,所以为了安全起见,我使用了大多数符号<代码>\\1
引用第一个捕获组(
(\\d+)
),而
\\2
引用第二个
(\\d+)
。看,谢谢你的解释。如果您复制答案中的解释,并通过使用中间的
x2
删除第一个代码来腾出空间,我认为这将对未来的用户(以及我未来的自己)非常有用。有时日期的形式是
“1990/2012”
,因此了解斜杠和反斜杠的转义很有用;或者更复杂的表单,其中我的
str_replace
方法可能不起作用,而您的方法会起作用+1.这同样有效,并且避免了转义分隔符的需要和使用
str_wrap(…)
p+scale_x_离散(labels=function(x)sub(“-”,“-\n”,x,fixed=TRUE))
   library(scales)
   p + scale_x_discrete(breaks = pretty_breaks(n = 6)) 
p + scale_x_discrete(
  labels=function(x){
    x2 <- sub("(\\d+)\\-(\\d+)",
               "\\1\\-\n\\2",
               x)
    x2
  })
p + scale_x_discrete(
  labels=function(x){
    sub("(\\d+)\\-(\\d+)","\\1\\-\n\\2",x)
  })
p + scale_x_discrete(
  labels=function(x) sub("-","-\n",x,fixed=TRUE))