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

2023-11-30

我正在尝试实现一种包装 x 轴标签的解决方案,以便它们不会重叠。我知道这个问题已经被问过好几次了,并且有一些好的答案。但是,我见过的解决方案都没有回答如何随着情节的发展重新包装标签resized.

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

  1. 这个解决方案写了一份定制的geom用于安装bar的标签size当您调整绘图大小时,动态地适应条形的宽度。

  2. 这个解决方案依赖于一个扩大包用于ggplot2 called ggtext。该解决方案允许对情节进行动态换行title,当您调整绘图大小时,基于创建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")

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


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

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


3. ggfittextreflow促进文本换行的论点

  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

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


我的问题

我不知道该怎么做,但是我们可以通过某种方式让 x 轴标签动态包装/调整大小/重新缩放吗ggfittext为我们做艰苦的工作吗?在我看来,条形内的文本已经以正确的方式呈现,我们可以以某种方式将此渲染“复制”到轴标签吗?


我们只需将ggfittexty 轴下方的文本?我们关闭剪辑并设置oob and 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))

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

编辑:从 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)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ggplot2:如何动态包装/调整大小/重新缩放 x 轴标签,使其不会重叠 的相关文章

  • 使用 R 中的 reshape 函数处理多个匹配行

    所以我有以下数据框df X Y Z ID value 1 0 20 135 a 20 2 0 20 135 a 30 3 0 20 135 b 40 4 20 104 20 c 10 5 20 104 20 b 15 我想要的最终输出 X
  • 如何更改 ESS 中的智能分配键(“_”到“<-”)绑定

    在 emacs ESS 中 如何正确更改 ess smart S assign 的键绑定 我尝试的是添加 custom set variables ess smart S assign key to my emacs 但这让奇怪的事情发生了
  • aggregate() 将多个输出列放入矩阵中

    我要计算某个变量的多个分位数 gt res1 lt aggregate airquality Wind list airquality Month function x quantile x c 0 9 0 95 0 975 gt head
  • 使用 google 查询邮政编码距离

    我有两个邮政编码列表 R 语言 其中一个是孩子的地址及其学业成绩 另一个是学校的地址 我希望能够为每个孩子找到最近的学校 所以大概需要通过转换为长和纬度值来计算邮政编码之间的距离 然后我希望能够在谷歌地图上绘制每所学校的所有孩子 并看看住在
  • 如何使用Shiny中的下载按钮?

    我想下载一个csv使用 Shiny 中的下载按钮下载文件 该文件将使用辅助 r 脚本中的参数创建 SERVER output downloadData lt downloadHandler filename function paste d
  • 使用 data.table 而不是 data.frame 进行子集化

    我正在处理一个包含 300 万行和 10 列的数据框 并且正在对其进行一些子集化 我下面有一些玩具代码 当我子集化时 需要很长时间 如果我使用 data table 和 data table 上的子集会更快吗 这是一些玩具代码 s lt c
  • 如何在小插图中的同一 R 包中放置指向另一个小插图的链接

    我有一个关于 Bioconductor 的包 我正在向它添加第二个小插图 我想将第二个小插图链接到第一个小插图 因为一个小插图位于包的一般工作流程上 第二个小插图用于针对更高级的用户的精细参数调整 有没有一种干净的方法来做到这一点 我发现的
  • 从 R 文本中提取网站链接

    我有多个文本 每个文本都可能包含对一个或多个网络链接的引用 例如 text1 s 1212a as www abcd com asasa11 我如何提取 www abcd com 来自 R 中的这段文字 换句话说 我希望提取以www并结束于
  • 查找表中第三个四分位数以上的频率

    我有一个大数据框架 对 57 个变量的超过 239k 观察值 其中包含一些疾病描述以及针对不同年龄段的人针对这些疾病使用的药物 我想在每种疾病描述的使用频率前四分之一中找到这些药物 为了制作一个可重现的示例 我创建了一个包含 1000 个观
  • 使用“kde”函数进行 R 中的 5-D 核密度估计

    我想通过使用 R 的 ks 库中的 kde 函数来执行 5 维数据 x y z 时间 大小 的核密度估计 在它的手册中 它说它可以执行核密度估计1 至 6 维数据 手册第 24 页 http cran r project org web p
  • 聚合时间

    我的数据包含 1 分钟测量值 我希望将其聚合为 5 分钟和 10 分钟 如何在 10 分钟内将 日 列的数据分组为 5 样本数据2 structure list Day c Monday Monday Monday Monday Monda
  • 在 R 中根据时间序列数据制作 3D 曲面

    我有一个大型数据集 我想从中制作 3D 表面 我希望 x 轴为日期 y 轴为时间 24 小时 z 轴 高度 为我的值 我是 R 初学者 所以越简单越好 http www quantmod com examples chartSeries3d
  • R:从本地 tar.gz 安装 R 软件包时找不到“make”

    R 包ConvCalendar不再位于 Cran 存储库中 请参阅here https cran r project org web packages ConvCalendar index html 然而 因为我在之前的项目中大量使用了这个
  • r - 根据第一个向量重新排序第二个向量

    寻找解决方案来执行以下操作 有两个向量 a lt c 2 1 3 4 7 6 5 9 8 10 b lt c 3 2 1 6 5 4 7 8 9 10 我想创建第三个向量 它给出向量的顺序b需要重新排序 使其顺序与a 在这种情况下我想得到
  • dplyr:取消选择由给出的列

    如何取消选择中给出的列 自写函数的参数 我还需要在另一点选择列 因此只需使用 in 没有解决我的问题 任何解决方案表示赞赏 select 帮助者 操纵者quosures或表达方式 very simple example data test
  • 使用 jQuery 从标签获取值

    我想从标签中获取月份和年份的值 我如何使用 jquery 获取这些
  • 将公式传递给 R 中的函数?

    对此的任何帮助将不胜感激 我正在使用 Lumley 调查包 并试图简化我的代码 但遇到了一些小障碍 在我的代码中调用包中的 svymean 函数如下 其中第一个参数是指示我想要哪些变量的公式 第二个参数是该数据集 svymean hq eh
  • 提取模型摘要并将其存储为新列

    我是新来的purrr范例并正在努力解决它 根据一些来源 我已经设法嵌套一个数据框 在嵌套数据上运行线性模型 从每个 lm 中提取一些系数 并为每个 lm 生成摘要 我想做的最后一件事是从摘要中提取 r squared 我原以为这将是我想要实
  • 如何根据值扩展数据框? [复制]

    这个问题在这里已经有答案了 我有以下输入数据框 df lt data frame x c a b c y c 4 5 6 from c 1 2 3 to c 2 4 6 df x y from to 1 a 4 1 2 2 b 5 2 4
  • 在另一列的字符串中搜索一列中的文本

    这里是 R 新手 一直在搜索此论坛 尝试找到一种在同一行数据的字符串中搜索文本的方法 我以前使用过 grepl 但无法让它向下查找列并对每一行应用检查 我觉得这是一个简单的解决方案 但我花了几个小时 但似乎无法得到它 基本上我有类似下面第

随机推荐

  • 在单个产品页面上显示类别和品牌名称

    在 Woocommerce 中 我正在使用YITH WooCommerce 品牌插件处理产品品牌 我目前正在努力解决 WooCommerce 中我的简短描述下想要的固定文本 我想动态显示产品名称在那段文字中 有效 也是产品类别名称 CATE
  • SVN中的结果代码是什么意思?

    SVN中的结果代码是什么意思 我需要一个快速参考 有关更多详细信息 请参阅 SVNBook 工作副本文件和目录的状态 常见状态 U 工作文件已更新 G 存储库上的更改会自动合并到工作副本中 M 工作副本已修改 C 该文件与repo中的版本冲
  • CMake - 使用错误数量的参数调用 add_executable

    我正在尝试组织一个 C 项目 该项目开始有很多文件 我想创建两个使用 Cmake 共享一些源文件的可执行文件 我在这里发现了一个有趣的过程 如何将源文件添加到另一个文件夹中 以下是我的版本 file GLOB Common sources
  • Google 地图 API 无法绘制不同大陆

    我已经使用谷歌地图 API 在谷歌地图上绘制了一个路径点 我参考了以下页面 https developers google com maps documentation javascript directions 在路线部分中使用航点 并对
  • 如何更改指向已删除的 android-ndk-r9 安装的内置 C/C++ 路径?

    我最近将 NDK 从 android ndk r9 升级到 android ndk r10 确切地说是 r10d Eclipse 是 4 4 Luna Luna 服务版本 1 4 4 1 构建 ID 20140925 1800 Eclips
  • XDocument 获取 XML 文件的一部分

    我有一个很大的 xml 文件 想要获取指定数量的
  • 数组初始化的差异

    在查看源文件时 我看到了两种数组初始化的方法 我想知道之间有什么区别 int value new int 0 and int value next new int 其实没有什么区别 它是Syntactic sugar在java数组声明中 第
  • PHP正则表达式最后一次出现的单词

    我的字符串是 var www domain com public html foo bar folder another 我想从此字符串中删除根文件夹 以仅获取公共文件夹 因为某些服务器内部有多个网站 我的实际正则表达式是 www publ
  • 将文本与 a 标签的底部对齐

    如何将文本置于 li 内的 a 标签的底部 这是我的代码 div ul li a href ter a li li a href redg a li li a href ryer More a li li a href More a li
  • VSCode 中多命令的快捷方式

    我有一个现有的快捷方式可以最大化终端窗口 key ctrl command workbench action toggleMaximizedPanel 我想在快捷方式中添加一个附加命令 以便在终端窗口最大化时将焦点转移到终端窗口 在最小化时
  • 测试两个函数变量是否指向同一个函数?

    如何测试两个函数变量是否指向同一个函数 test lm test2 lm test lm error comparison 1 is possible only for atomic and list types test test2 er
  • MVC 剃刀@foreach

    我听说在视图中使用 foreach 是禁忌 意思是 视图中不应该有任何逻辑 foreach 的逻辑应该位于何处的最佳实践是什么 foreach foreach 的逻辑应该位于何处的最佳实践是什么 无处可去 只能摆脱它 您可以使用编辑器或显示
  • BlackBerry - 如何在 Android 中传递 Intent.putExtra() 等数据

    我是黑莓手机的新手 我如何实现 在黑莓手机中 与 Android 相同的功能 intent putExtra key value 将可以接收到的值放在下一个推屏在黑莓手机中 就像在 Android 中一样ActivityOne Intent
  • 有没有办法访问iphone/ipad(真机,无模拟器)中的文档文件夹?

    有没有办法访问真实设备 iphone ipad 文档文件夹 我意识到一个应用程序在该文件夹中存储了一些数据 我想检查一切是否都以正确的方式进行 即使文件位于沙盒中文档之外的其他位置 您也可以在没有 iTunes 的情况下执行此操作 转到 X
  • “出于安全原因,proc_open() 已被禁用”- PHP 错误

    出于安全原因 proc open 已被禁用 我目前使用免费托管 Hostinger 制作一个仅供我和其他人使用的个人网站 我知道我应该删除proc open来自php ini但由于我的共享托管计划 我无法访问它 周围的代码proc open
  • 为什么 Inno Setup 忽略 DefaultDirName

    运行 Inno Setup 5 5 6 我更正了我的错误默认目录名值 但无论我做什么 程序都会继续尝试安装在旧的错误位置 即使我将其设置为与示例之一匹配的值 DefaultDirName pf My Program 程序继续选择旧的 不正确
  • 当我编译这段代码时发生错误C6308,说realloc可以返回NULL,并且可能导致内存泄漏

    void inf int Sub const char num const unsigned int index if this gt length lt index this gt digits char realloc this gt
  • 结构体变量初始化

    我尝试按如下方式初始化结构变量 struct Abc char str 10 int main struct Abc s1 s1 str Hello error 我可以理解这种行为 因为它与 char str 10 str Hello in
  • 使用Java API将数据上传到HDFS

    我已经搜索了一段时间 但似乎没有一个解决方案适合我 非常简单 我想使用 Java API 将数据从本地文件系统上传到 HDFS Java 程序将在已配置为通过 shell 与远程 Hadoop 集群通信的主机上运行 即hdfs dfs ls
  • ggplot2:如何动态包装/调整大小/重新缩放 x 轴标签,使其不会重叠

    我正在尝试实现一种包装 x 轴标签的解决方案 以便它们不会重叠 我知道这个问题已经被问过好几次了 并且有一些好的答案 但是 我见过的解决方案都没有回答如何随着情节的发展重新包装标签resized SO 的三个不同答案让我相信这是可以实现的