问题描述
我正在尝试实现包装 x 轴标签的解决方案,这样它们就不会重叠。我知道这个问题已经被问过好几次了,而且有 some good answers。但是,我所见过的解决方案都没有回答如何在情节调整大小时重新包装标签。
SO 上的三个不同答案让我相信这是可以实现的。
-
This solution 编写了一个定制的
geom
以适应 bar 的标签size
以适应栏的宽度,动态地随着您调整绘图大小。 -
This solution 依赖于名为
ggtext
的ggplot2
的 extension 包。该解决方案允许在根据创建element_textbox()
调整绘图大小时对绘图的 title 进行动态自动换行。 -
This solution 依赖于另一个名为
ggfittext
的扩展。它显示了条形内标签的size
如何在您调整绘图大小时动态变化以适应条形的尺寸。本质上,它解决了与上述解决方案 (1) 相同的问题,但功能更强大。事实上,这是让我充满希望的功能,它依赖于通用解决方案geom_fit_text()
将文本放入矩形内,而不仅仅是geom_bar()
。
一些可以使用的演示数据
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 package (v0.3.0) 于 2021 年 1 月 29 日创建
2.当我们使用 ggfittext
时,我们可以看到条形内的标签如何缩小以适应条形
library(tidyverse)
library(ggfittext)
#> Warning: package 'ggfittext' was built under R version 4.0.3
my_mtcars <-
mtcars[15:20,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 package (v0.3.0) 于 2021 年 1 月 29 日创建
3. ggtext
具有促进文本换行的 reflow
参数
library(tidyverse)
library(ggfittext)
#> Warning: package 'ggfittext' was built under R version 4.0.3
my_mtcars <-
mtcars[15:20,reflow = TRUE ## <--------------- added this
)
#> Warning: Ignoring unkNown aesthetics: label
由 reprex package (v0.3.0) 于 2021 年 1 月 29 日创建
我的问题
我不知道该怎么做,但是我们可以通过某种方式让 ggfittext
为我们完成繁重的工作,从而动态地包装/调整大小/重新缩放 x 轴标签吗?以我认为的天真方式,条形中的文本已经以正确的方式呈现,我们可以以某种方式将此呈现“复制”到轴标签吗?
解决方法
我们将 ggfittext
文本放在 y 轴下方怎么样?我们关闭裁剪并设置 oob
和 limits
以适合我们的数据。应该调整 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 package (v0.3.0) 于 2021 年 1 月 29 日创建
编辑:从grob中取出标签
library(tidyverse)
library(ggfittext)
my_mtcars <-
mtcars[15:20,] %>%
rownames_to_column("cars")
p <- my_mtcars %>%
ggplot(aes(x = cars,y = -1),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"
由 reprex package (v0.3.0) 于 2021 年 1 月 29 日创建
,仅仅改变文本的角度或大小怎么样?
角度:
my_mtcars %>%
ggplot(aes(x = cars,fill = cars)) +
geom_bar(stat = "identity")+
theme(axis.text.x = element_text(angle = 45,vjust = 0.5,hjust=1))
尺寸:
my_mtcars %>%
ggplot(aes(x = cars,fill = cars)) +
geom_bar(stat = "identity")+
theme(axis.text.x = element_text(size = 4))