我正在尝试实现一种包装x轴标签的解决方案,以使它们不会重叠。我知道这个问题已经问过好几次了,并且有一些好的答案。但是,我见过的任何解决方案都无法回答如何随着图的大小而重新包装标签。
SO的三个不同答案使我相信这是可以实现的。
该解决方案写了一个定制的geom
用于安装酒吧的标签size
,以适应酒吧的宽度内,动态地调整你的情节。
该解决方案依赖于一个扩展包ggplot2
叫ggtext
。该解决方案允许您根据创建来调整图的大小,从而对图标题进行动态自动换行element_textbox()
。
此解决方案依赖于另一个扩展名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.ggtext
有reflow
提倡文字换行的说法
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轴下方怎么样?我们关闭裁剪并设置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软件包(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] 删除。
我来说两句