如何以意外的长模式命名的data.frame获取`facet_wrap`图?

时间:2017-01-09 21:23:04

标签: r regex ggplot2

我有data.frame列表,其列以相当复杂的字符串命名,需要使用facet_wrap绘制。我打算在facet_grid中操纵这个复杂的字符串和情节。我想通过使用\n来分割字符串,但在结果图中,我所需的标签仍未完全显示。任何人都可以给我一些想法如何绘制data.frame如果标签名为长字符的列?我怎样才能实现我想要的情节?

可重复的data.frame:

myList <- list(
    wmTncofSydhTfbsK90cmxcgMnP30SxEAlnTest1.saved=
        data.frame(GRP=c("up","up","down"), Name=rep("wmTncofSydhTfbsK90cmxcgMnP30SxEAlnTest1", 3),
                   v1=c(2,7,9)),
    wmTncofSydhTfbsK90cmxcgMnP30SxEAlnTest2.saved=
        data.frame(GRP=c("up","down","up","down"), Name=rep("wmTncofSydhTfbsK90cmxcgMnP30SxEAlnTest2", 4),
                   v1=c(13,8,11,3))
)

这是我想象中想要的情节:

enter image description here

我怎样才能得到这个想要的情节?如果使用意外的长字符命名,我如何绘制data.frame?提前致谢

修改: 获取updown组的阈值,我们可以为threshold >9设置阈值up;否则down。抱歉这个缺失点。

但是如何在我尝试操作数据中的长字符串列的情况下继续使用此代码?有谁能指出我如何继续我的方法并产生我想要的情节?

1 个答案:

答案 0 :(得分:2)

以下是一些示例代码,可以通过将列A拆分为最多26个字符的行来解决问题:

library(stringr)
library(ggplot2)
df <- data.frame(A = c(paste(rep(LETTERS, 3), collapse = ""), paste(rep(letters, 3), collapse = "")), B = 3)
ggplot(df, aes(x = B)) + facet_wrap(~A) + geom_bar()
while(any(str_detect(df$A, "(?<=(^|\\n))[\\n]{26}(?=[^\\n])"))) {
  df %<>% mutate(A = str_replace(A, "(?<=(^|\\n))[\\n]{26}(?=[^\\n])", "\\0\n"))
}
ggplot(df, aes(x = B)) + facet_wrap(~A) + geom_bar()

核心正在反复替换正则表达式(?<=(^|\n))[^\n]{26}(?=[^\\n]),它匹配26个字符(由您自行选择)长度子字符串,它不会立即被换行符继续,并且前面是字符串的开头或者换行。

我建议单步执行while循环来了解正则表达式的工作原理。