![](/img/trans.png)
[英]R: {ggplot2}: How / Can I independently adjust the x-axis limits on a facet_grid plot?
[英]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.