【问题标题】:r - How can I get a lengthy label to fit using facet_grid in ggplot2?r - 如何在 ggplot2 中使用 facet_grid 获得适合的冗长标签?
【发布时间】:2013-07-12 03:33:07
【问题描述】:

这是一个可重现的例子:

我先根据这个例子https://github.com/hadley/ggplot2/wiki/labeller创建一个函数,然后提供数据和图表

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

它会生成一个带有“PythonhasaREALLYWAYTOOlonglabel”标签的 ggplot 图,该图通常会超出图的边缘。

我尝试过使用以下链接中的各种 geom_bar 宽度,但也无济于事: How to increase the space between the bars in a bar plot in ggplot2?

这里有什么帮助吗? 非常感谢。

【问题讨论】:

  • 我知道这不是您要查找的内容,但实际上,您可能需要考虑使用缩写和/或图例,并在文档的其他地方定义这些缩写。
  • 是的,也许就是这样……非常感谢。

标签: r ggplot2


【解决方案1】:

如果您用空格打破“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)
  }
}

如果你为“宽度”提供不太严格的参数,你可以让它接受 5-10 范围内的字符测量宽度的宽度参数:

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

# Seems to deliver expected results when called with:
  ... + facet_grid(..., labeller=label_wrap_gen3(width=5) )

【讨论】:

  • 我想到了这一点,但我真正的标签是两个较长的单词,即使分成两条单独的行也会超出边缘。我想我可以使用连字符等,但认为会有更好的方法......谢谢你的建议。
  • @Roger 您需要手动连字符;我找不到任何可以用自动连字自动换行的东西(理论上是可能的;TeX 做到了,koRpus 有一个函数可以找出可以在哪里连字的单词)。考虑到缩写和在必要时手动执行的替代方法,可能不值得付出努力。所有这些解决方案还存在选择合适的包装宽度的问题,该宽度会随着绘图大小的变化而变化(它们不会自动适应任何可用的尺寸)。
  • @BrianDiggs 已经努力选择合适的尺寸:stackoverflow.com/a/16735798/471093
  • @baptiste 感谢您的链接;我没见过。
  • 这个问题有很多变体,尽管这是人们第一次尝试拆分 单词,AFAIK。
【解决方案2】:

虽然到目前为止的答案有助于包装文本,但标签仍然难以阅读。我决定在感兴趣的变量的两侧添加几个零值,并手动添加一个带有空格的连字符名称,将“PythonhasaREALLYWAYTOOlonglabel”更改为“PythonhasaREALLY-WAYTOOlonglabel”,它做了什么到目前为止我想要更好。虽然它可能在“PythonhasaREALLY-WAYTOOlonglabel”的两侧留下了太大的空间,但它给了我需要的空间。

使用以下代码:

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

可能有一种方法可以让两边的空间变窄一些,但我还不确定如何做到这一点......

【讨论】:

    猜你喜欢
    • 2018-11-03
    • 1970-01-01
    • 2021-10-24
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 2019-12-13
    • 1970-01-01
    • 2021-12-27
    相关资源
    最近更新 更多