繁体   English   中英

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

[英]r - How can I get a lengthy label to fit using facet_grid in ggplot2?

这是一个可重现的示例:

我首先基于此示例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宽度,但也无济于事: 如何在ggplot2的条形图中增加条形之间的间隔?

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

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

而且,如果您为“ width”提供了不太严格的参数,则可以接受字符宽度为5-10的width参数:

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

尽管到目前为止的答案对包装文字很有帮助,但标签仍然难以阅读。 我决定在感兴趣的变量的两边添加两个零值,并手动添加一个带连字符的名称,并在其中加上感兴趣的因子,将“ PythonhasaREALLYWAYTOOlonglabel”更改为“ PythonhasaREALLYWAYWAYOlonglabel”,该操作可以到目前为止,我希望更好。 尽管在“ PythonhasaREALLYWAYTOOlonglabel”的两侧可能都留有太大的空间,但它却为我提供了所需的空间。

使用以下代码:

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

可能有一种方法可以使两边的空间都变窄,但是我不确定该怎么做...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM