r-如何在ggplot2中使用facet_grid获得适合的长标签?

r-如何在ggplot2中使用facet_grid获得适合的长标签?,r,ggplot2,R,Ggplot2,以下是一个可复制的示例: 我首先基于这个示例创建一个函数,然后提供数据和一个图表 label_wrap_gen <- function(width = 100) { function(variable, value) { lapply(strwrap(as.character(value), width=width, simplify=FALSE), paste, collapse="\n") } } Data <- data.frame(L

以下是一个可复制的示例:

我首先基于这个示例创建一个函数,然后提供数据和一个图表

label_wrap_gen <- function(width = 100) {
  function(variable, value) {
    lapply(strwrap(as.character(value), width=width, simplify=FALSE), 
           paste, collapse="\n")
  }
}

Data <- data.frame(Language=c("C++","C++","C++", "Java","Java","Java","Java", "PythonhasaREALLYWAYTOOlonglabel"), 
                Files=c(400, 210, 35,55,330,220,213,76), 
                Difficulty=c("a","b","c","d","e","f","g","h"), 
                stringsAsFactors=FALSE)

g <- ggplot(Data,aes(x=Difficulty,y=Files,fill=Difficulty))  #replaced fill=feetype,
h <- g + geom_bar(stat="identity",position="dodge") +   facet_grid(.~ Language, scales = "free_x", space="free",labeller=label_wrap_gen(width=.1)) 
h
label\u wrap\u gen如果用空格打破“reallylonglabel”,它将按预期的方式运行:

 "Python has a REALLY WAY TOO long label"  # will be handled correctly
好的。根据您的意见:这里有一个新的
标签机
-函数,它将首先在任何空格上拆分(以
宽度
的较低值为准),然后在长度大于5的字符串上拆分

label_wrap_gen2 <- function(width = 100) {
  function(variable, value) {
    inter <- lapply(strwrap(as.character(value), width=width, simplify=FALSE), 
           paste, collapse="\n")
    inter <- gsub("(.{5})", "\\1\n",inter)
  }
}
label\u wrap\u gen2如果用空格打破“reallylonglabel”,它将按预期的方式运行:

 "Python has a REALLY WAY TOO long label"  # will be handled correctly
嗯。请注意:这里有一个新的
labeller
-函数,它将首先在任何空格上拆分(以
width
的较低值为准),然后在长度大于5的字符串上拆分

label_wrap_gen2 <- function(width = 100) {
  function(variable, value) {
    inter <- lapply(strwrap(as.character(value), width=width, simplify=FALSE), 
           paste, collapse="\n")
    inter <- gsub("(.{5})", "\\1\n",inter)
  }
}

label\u wrap\u gen2虽然到目前为止的答案有助于包装文本,但标签仍然很难阅读。我决定在感兴趣的变量的两侧添加两个零值,并手动添加一个带有空格的连字号的名称作为感兴趣的因子,将“PythonHasarReallyWayToolLongLabel”更改为“PythonHasarReally-WayToolLongLabel”,这是我到目前为止比较喜欢的。虽然它在“pythonhaarly-waytoolonglab”的两边留下了太大的空间,但它给了我所需要的空间

使用以下代码:

label_wrap_gen <- function(width = 100) {
  function(variable, value) {
    lapply(strwrap(as.character(value), width=width, simplify=FALSE), 
           paste, collapse="\n")
  }
}

Data <- data.frame(Language=c("C++","C++","C++", "Java","Java","Java","Java", "PythonhasaREALLY- WAYTOOlonglabel","PythonhasaREALLY- WAYTOOlonglabel","PythonhasaREALLY- WAYTOOlonglabel"), #note that I add a hyphen here and two placeholders that will have 0 values
                   Files=c(400, 210, 35,55,330,220,213,0,76,0), #note that I add two 0 values here
                   Difficulty=c("a","b","c","d","e","f","g","h","i","j"), 
                   stringsAsFactors=FALSE)

Data
g <- ggplot(Data,aes(x=Difficulty,y=Files,fill=Difficulty))  #replaced fill=feetype,
h <- g + geom_bar(stat="identity",position="dodge") +   facet_grid(.~ Language, scales = "free_x", space="free",labeller=label_wrap_gen(width=.1)) 

label\u wrap\u gen虽然到目前为止的答案有助于包装文本,但标签仍然很难阅读。我决定在感兴趣的变量的两侧添加两个零值,并手动添加一个带有空格的连字号的名称作为感兴趣的因子,将“PythonHasarReallyWayToolLongLabel”更改为“PythonHasarReally-WayToolLongLabel”,这是我到目前为止比较喜欢的。虽然它在“pythonhaarly-waytoolonglab”的两边留下了太大的空间,但它给了我所需要的空间

使用以下代码:

label_wrap_gen <- function(width = 100) {
  function(variable, value) {
    lapply(strwrap(as.character(value), width=width, simplify=FALSE), 
           paste, collapse="\n")
  }
}

Data <- data.frame(Language=c("C++","C++","C++", "Java","Java","Java","Java", "PythonhasaREALLY- WAYTOOlonglabel","PythonhasaREALLY- WAYTOOlonglabel","PythonhasaREALLY- WAYTOOlonglabel"), #note that I add a hyphen here and two placeholders that will have 0 values
                   Files=c(400, 210, 35,55,330,220,213,0,76,0), #note that I add two 0 values here
                   Difficulty=c("a","b","c","d","e","f","g","h","i","j"), 
                   stringsAsFactors=FALSE)

Data
g <- ggplot(Data,aes(x=Difficulty,y=Files,fill=Difficulty))  #replaced fill=feetype,
h <- g + geom_bar(stat="identity",position="dodge") +   facet_grid(.~ Language, scales = "free_x", space="free",labeller=label_wrap_gen(width=.1)) 

label\u wrap\u gen我知道这不是你想要的,但实际上,你可能想考虑使用缩写和/或图例,并在文档中的其他地方定义这些缩写。是的,也许这就是解决问题的方法。。。非常感谢。我知道这不是你想要的,但实际上,你可能想考虑使用缩写和/或图例,并在文档的其他地方定义这些缩写。是的,也许这就是继续下去的方式。。。非常感谢。我想到了这一点,但我真正的标签是两个较长的单词,即使分成两行,也会从页边空白处脱落。我想我可以用连字符之类的,但我想会有更好的方法。。。谢谢您的建议。@Roger您需要手动连字符;我找不到任何可以自动换行的东西(理论上是可能的;TeX可以自动换行,koRpus有一个函数,可以计算单词在哪里可以换行)。考虑到在必要时进行缩写和手动操作的替代方案,可能不值得付出这样的努力。所有这些解决方案都面临着选择合适的包裹宽度的问题,包裹宽度会随着绘图大小的变化而变化(它们不会自动适应任何可用的大小)。@BrianDiggs已经做出了一些努力来选择合适的大小:@baptiste感谢您的链接;我没有看到。这个问题有很多变体,尽管这是人们第一次尝试拆分单词,好吧。我想到了,但我真正的标签是两个较长的单词,即使拆分成两行,也会超出页边空白。我想我可以用连字符之类的,但我想会有更好的方法。。。谢谢您的建议。@Roger您需要手动连字符;我找不到任何可以自动换行的东西(理论上是可能的;TeX可以自动换行,koRpus有一个函数,可以计算单词在哪里可以换行)。考虑到在必要时进行缩写和手动操作的替代方案,可能不值得付出这样的努力。所有这些解决方案都面临着选择合适的包裹宽度的问题,包裹宽度会随着绘图大小的变化而变化(它们不会自动适应任何可用的大小)。@BrianDiggs已经做出了一些努力来选择合适的大小:@baptiste感谢您的链接;我没有看到。这个问题有很多不同的说法,尽管这是人们第一次尝试拆分单词,好吧。