ggplot2:如何动态包装/调整/缩放x轴标签,以使其不会重叠

艾曼

我正在尝试实现一种包装x轴标签的解决方案,以使它们不会重叠。我知道这个问题已经问过好几次了,并且有一些好的答案但是,我见过的任何解决方案都无法回答如何随着图的大小而重新包装标签

SO的三个不同答案使我相信这是可以实现的。

  1. 该解决方案写了一个定制的geom用于安装酒吧的标签size,以适应酒吧的宽度内,动态地调整你的情节。

  2. 该解决方案依赖于一个扩展ggplot2ggtext该解决方案允许您根据创建来调整图的大小,从而对图标题进行动态自动换行element_textbox()

  3. 此解决方案依赖于另一个扩展名ggfittext它显示了在size调整图大小时,条形图内标签的大小如何动态变化以适合条形图的尺寸。本质上,它解决了与上述解决方案(1)相同的问题,但功能强大得多。实际上,这是令我充满希望的功能,它依赖于geom_fit_text()将文本容纳在矩形(而不仅仅是geom_bar()s)的通用解决方案

一些演示数据

1.仅显示x轴标签重叠时的典型输出

  library(tidyverse)
  
  my_mtcars <-
    mtcars[15:20,] %>% 
    rownames_to_column("cars")
  
  my_mtcars %>%
    ggplot(aes(x = cars, y = mpg, fill = cars)) + 
    geom_bar(stat = "identity")

reprex软件包(v0.3.0)创建于2021-01-29


2.使用时,ggfittext我们可以看到条形内的标签如何缩小以适合条形

  library(tidyverse)
  library(ggfittext)
#> Warning: package 'ggfittext' was built under R version 4.0.3
  
  my_mtcars <-
    mtcars[15:20,] %>% 
    rownames_to_column("cars")
  
  my_mtcars %>%
    ggplot(aes(x = cars, y = mpg, fill = cars)) + 
    geom_bar(stat = "identity") +
    geom_bar_text(aes(label = cars), 
      color = "blue", 
      vjust = 1, 
      size = 7 * ggplot2::.pt, 
      min.size = 0,
      padding.x = grid::unit(0, "pt"),
      padding.y = grid::unit(0, "pt"))
#> Warning: Ignoring unknown aesthetics: label

reprex软件包(v0.3.0)创建于2021-01-29


3.ggtextreflow提倡文字换行说法

  library(tidyverse)
  library(ggfittext)
#> Warning: package 'ggfittext' was built under R version 4.0.3
  
  my_mtcars <-
    mtcars[15:20,] %>% 
    rownames_to_column("cars")
  
  my_mtcars %>%
    ggplot(aes(x = cars, y = mpg, fill = cars)) + 
    geom_bar(stat = "identity") +
    geom_bar_text(aes(label = cars), 
      color = "blue", 
      vjust = 1, 
      size = 7 * ggplot2::.pt, 
      min.size = 0,
      padding.x = grid::unit(0, "pt"),
      padding.y = grid::unit(0, "pt"),
      reflow = TRUE ## <--------------- added this
      )
#> Warning: Ignoring unknown aesthetics: label

reprex软件包(v0.3.0)创建于2021-01-29


我的问题

我不知道该怎么做,但是通过某种方式让ggfittext我们辛苦工作,我们能否动态地包装/调整大小/缩放x轴标签以我天真的方式看,条形图中的文本已经被正确渲染了,我们可以以某种方式“复制”该渲染到轴标签上吗?

特朗布兰德

我们将ggfittext文字放在y轴下方怎么样?我们关闭裁剪并设置ooblimits以适合我们的数据。应该调整axis.text.x大小以更好地与x轴标题对齐。

library(tidyverse)
#> Warning: package 'tidyr' was built under R version 4.0.3
#> Warning: package 'readr' was built under R version 4.0.3
#> Warning: package 'dplyr' was built under R version 4.0.3
library(ggfittext)
#> Warning: package 'ggfittext' was built under R version 4.0.3

my_mtcars <-
  mtcars[15:20,] %>% 
  rownames_to_column("cars")

my_mtcars %>%
  ggplot(aes(x = cars, y = mpg, fill = cars)) + 
  geom_bar(stat = "identity") +
  geom_fit_text(aes(label = cars, y = -4),
                reflow = TRUE, height = 50,
                show.legend = FALSE) +
  scale_y_continuous(oob = scales::oob_keep,
                     limits = c(0, NA)) +
  coord_cartesian(clip = "off") +
  theme(axis.text.x = element_text(colour = "transparent", size = 18))

reprex软件包(v0.3.0)创建于2021-01-29

EDIT: Getting the labels out of the grob

library(tidyverse)
library(ggfittext)

my_mtcars <-
  mtcars[15:20,] %>% 
  rownames_to_column("cars")

p <- my_mtcars %>%
  ggplot(aes(x = cars, y = mpg, fill = cars)) + 
  geom_bar(stat = "identity") +
  geom_fit_text(aes(label = cars, y = -1),
                reflow = TRUE, height = 50,
                show.legend = FALSE) +
  scale_y_continuous(oob = scales::oob_keep,
                     limits = c(0, NA)) +
  coord_cartesian(clip = "off") +
  theme(axis.text.x = element_text(colour = "transparent", size = 18))

grob <- grid::makeContent(layer_grob(p, 2)[[1]])$children

sizes <- vapply(grob, function(x){x$gp$fontsize}, numeric(1))
labels <- unname(vapply(grob, function(x){x$label}, character(1)))
print(labels)
#> [1] "Cadillac\nFleetwood"  "Lincoln\nContinental" "Chrysler\nImperial"  
#> [4] "Fiat 128"             "Honda Civic"          "Toyota\nCorolla"

Created on 2021-01-29 by the reprex package (v0.3.0)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

我该如何切割“ geom_curve”绘制的曲线,以使其不与“ ggplot2”中“ geom_text”绘制的标签重叠?

删除ggplot2的x轴标签?

R ggplot2:如何使x轴线不与y轴重叠?

如何更改ggplot2中x和y轴的刻度标签,轴消失

如何在 r 的 ggplot2 中缩放 x 轴的时间(小时)?

ggplot2:调整图例到x轴的距离?

如何在ggplot2中使用ylab()创建动态轴标签?

R 和 ggplot2 - 如何动态隐藏轴变量标签

如何动态地将按钮放置在画布中,以使其不会相互重叠?

如何调整ggplot2中绘制轴的程度?

ggplot2输出图像围绕x轴标签居中

在ggplot2中添加x和y轴标签

ggplot2中x轴的顺序标签跟随数值

在ggplot2中添加辅助x轴标签

为日期 x 轴 ggplot2 指定显示的标签

如何使用position_nudge将x轴标签与ggplot2中条的中心对齐

如何每秒显示R ggplot2 x轴标签值?

如何从ggplot2中的两个分类变量创建x轴标签?

如何在ggplot2中显示多个箱形图的x轴标签的分类组

如何将图例向上移动到ggplot2中的x轴标签

如何在ggplot2中的方面之间强制使用常见的x轴标签/限制?

R-ggplot2-X轴标签将不会显示

ggplot2:如何向上移动x轴,使其可以在水平条形图上任意选择的条形下?

如何自动缩放图形以使其适合 Y 轴?

使用“免费” ggplot2缩放比例设置分类轴标签

自定义缩放轴后,ggplot2缺少标签

如何使用ggplot2缩放辅助轴,第二轴具有负值

如何调整 x 轴的大小并使其与 y 轴不同 Matplotlib

ggplot2:绘制x轴值重叠的2个图