通过ggplot2中的labeller=label_wrap包裹长轴标签

问题描述 投票:0回答:5

我想自动将标签包装在 ggplot2 中,即插入长标签的换行符。 Here 写了如何为其编写函数 (1),但遗憾的是我不知道将

labeller=label_wrap
放在我的代码 (2) 中。

(1) 哈德利函数

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

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

r ggplot2 plot axis-labels
5个回答
220
投票

您不需要

label_wrap
功能。请改用
str_wrap
包中的
stringr
函数。

您没有提供

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


70
投票

“scales”包包含一个非常类似于 Claude 和 Leonardo 的函数: 换行格式。

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

16
投票

这是另一种不参考库的方法

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

完成动态分割标签的工作。结果与第一个答案相同。


1
投票

(希望)改进@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))

0
投票

为了更新这一点,

scales
包已为此目的接收了
label_wrap()
函数。现在更容易做到这一点。

library(ggplot2)

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") +
  scale_x_discrete(labels = scales::label_wrap(10))

创建于 2024-09-23,使用 reprex v2.1.0

© www.soinside.com 2019 - 2024. All rights reserved.