在 ggplot2中通过 Labeller = label_wraps 包装长轴标签

我想在 ggplot2中自动包装我的标签,即插入长标签的换行符。给你是写如何为它写一个函数(1) ,但遗憾的是,我不知道在我的代码(2)中把 labeller=label_wrap放在哪里。

(1) Hadley 函数

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

(2)代码示例

df = data.frame(x = c("label", "long label", "very, very long label"),
y = c(10, 15, 20))


ggplot(df, aes(x, y)) + geom_bar(stat="identity")

Histogram with long label not wrapped

我想在这里包装一些较长的标签。

87255 次浏览

您不需要 label_wrap函数,而是使用 stringr包中的 str_wrap函数。

您没有提供您的 df数据帧,所以我创建了一个简单的数据帧,其中包含您的标签。然后,对标签应用 str_wrap函数。

library(ggplot2)
library(stringr)


df = data.frame(x = c("label", "long label", "very, very long label"),
y = c(10, 15, 20))
df


df$newx = str_wrap(df$x, width = 10)
df

现在将标签应用于 ggplot 图表: 第一个图表使用原始标签; 第二个图表使用修改后的标签; 对于第三个图表,标签在对 ggplot 的调用中被修改。

ggplot(df, aes(x, y)) +
xlab("") + ylab("Number of Participants") +
geom_bar(stat = "identity")


ggplot(df, aes(newx, y)) +
xlab("") + ylab("Number of Participants") +
geom_bar(stat = "identity")


ggplot(df, aes(x, y)) +
xlab("") + ylab("Number of Participants") +
geom_bar(stat = "identity") +
scale_x_discrete(labels = function(x) str_wrap(x, width = 10))

enter image description here

下面是另一种不参考图书馆 stringr的方法:

ggplot(df, aes(x, y)) +
xlab("") + ylab("Number of Participants") +
geom_bar(stat = "identity") +
scale_x_discrete(labels = function(x) lapply(strwrap(x, width = 10, simplify = FALSE), paste, collapse="\n"))

电话在哪里:

lapply(strwrap(x, width = 10, simplify = FALSE), paste, collapse="\n")

动态地分割标签,其结果与第一个 回答相同。

(希望如此)改进@Claude 的回答:

get_wraper <- function(width) {
function(x) {
lapply(strwrap(x, width = width, simplify = FALSE), paste, collapse="\n")
}
}


ggplot(df, aes(x, y)) + geom_bar(stat = "identity") +
labs(x = "", y = "Number of Participants") +
scale_x_discrete(labels = get_wraper(10))

“音阶”包含一个非常类似克劳德和莱昂纳多的功能: Wrash _ format 包装格式。

library(scales)
ggplot(df, aes(x, y)) + geom_bar(stat = "identity") +
labs(x = "", y = "Number of Participants") +
scale_x_discrete(labels = wrap_format(10))