旋转 ggplot 中的 X 轴标签时被截断

3

当 ggplot 中的 x 轴标签旋转时,有时会出现标签被截断的情况。

enter image description here

我看了这些帖子 How can I manipulate a ggplot in R to allow extra room on lhs for angle=45 long x-axis labels?ggplot2 plot area margins?。两种方法中的建议是使用 plot.margin 参数。但我想知道是否有更优雅和动态的解决方案来解决这个问题。在我的应用程序中,用户将被允许更改轴标签的字体大小,因此设置硬编码值的绘图边距似乎不是一个好方法。还有其他避免这种效果的方法吗?是否可以以某种方式操纵布局?

复制代码:

categories <- c(
  "Entertainment",
  "Research",
  "Development",
  "Support",
  "Classic",
  "Old Time"
)
years <- 2020:2021
types <- c(
  "Easy",
  "Pro",
  "Free",
  "Trial",
  "Subscription"
)
d <- expand.grid(category = categories,
                 type = types,
                 year = years)
counts <- sample(0:100, size = nrow(d))

d$n <- counts

ggplot(
  data = d,
  aes(x = category, y = n, fill = category)
) + geom_bar(stat = "identity") +
  facet_grid(rows = vars(year), cols = vars(type)) +
  theme(
    axis.text.x = element_text(
      angle = 22.5,
      hjust = 1,
      size = 12
    )
  )

1
示例数据和重现代码,可以吗? - r2evans
1个回答

3

我没有看到使用ggplot2工具本地自动完成此操作的任何方法,那么为什么不编写一个小函数,根据最左侧x类别值中的字符数设置边距大小呢?

margin_spacer <- function(x) {
  # where x is the column in your dataset
  left_length <- nchar(levels(factor(x)))[1]
  if (left_length > 8) {
    return((left_length - 8) * 4)
  }
  else
    return(0)
}

该函数可以处理字符列(或因子),并检查第一级别中的字符数(在图表左侧显示)。经过试验,似乎超过8个字符的任何内容都会对绘图代码造成问题,因此每超过8个字符,这会为边距添加4个点。
请注意,我更改了您绘图中x轴文本的角度 - 我认为22.5度有点太浅了,在我的图形设备上,您的文本大小会产生很多重叠。这意味着8和4的值可能不适用于您,但是以下是它在几个不同数据框中的工作方式。
以下是新的绘图代码:
ggplot(data = d, aes(x = category, y = n, fill = category)) +
  geom_bar(stat = "identity") +
  facet_grid(rows = vars(year), cols = vars(type)) +
  theme(
    axis.text.x = element_text(angle = 40, hjust = 1, size = 12),
    plot.margin = margin(l = 0 + margin_spacer(d$category))
  )

我通过更改定义d $ categories的代码创建了以下图表。我使用上面的代码显示输出,其中categories < - c(...)的第一个条目相应地更改为每个条目。你会注意到,它运行得非常好,除非它太长。随着文本变得非常长,文本大小也可能需要调整。如果您认为用户会疯狂地使用标签,可以使用类似的策略来调整文本大小......但这可能有点过度。

"进入"(5个字符)

输入图像描述

"娱乐"(9个字符)

输入图像描述

"演员"(11个字符)

输入图像描述

"娱乐"(13个字符)

输入图像描述

"高质量娱乐"(21个字符)

输入图像描述


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接