R ggplot2 - 底部的图例被剪切,如何动态找到图例的最佳列数?

2024-02-18

我想在底部制作一个带有图例的情节,但图例总是被剪切......因为看起来ggplot2无法自动确定底部图例中的最佳列数,我尝试自己做......但没有成功。

假设我有以下内容mydf数据框:

mydf <- data.frame(group=paste0('gr',1:10), var=paste('some long text -', LETTERS), value=runif(260, 0, 100))
head(mydf)
#  group                var     value
#1   gr1 some long text - A  7.941256
#2   gr2 some long text - B 50.740651
#3   gr3 some long text - C 89.068872
#4   gr4 some long text - D 77.572413
#5   gr5 some long text - E  9.792349
#6   gr6 some long text - F 35.194944

我希望输出图的宽度为 12(英寸)。

当我制作情节时ggplot2,图例的宽度大于图并被剪切:

width_scale <- 12
grDevices::pdf(file='test.pdf', height=10, width=width_scale)
print(#or ggsave()
  ggplot2::ggplot(mydf, ggplot2::aes(group, value, fill=var)) +
    ggplot2::geom_bar(stat="identity") +
    ggplot2::scale_y_continuous("%") +
    ggplot2::theme_light() +
    ggplot2::theme(legend.text=ggplot2::element_text(size=1.5*width_scale),
                   legend.title=ggplot2::element_text(size=1.5*width_scale,face="bold"),
                   legend.position="bottom",
                   legend.key.size = grid::unit(width_scale/50, "inch"),
                   legend.key.width = grid::unit(width_scale/50, "inch"))
)
grDevices::dev.off()

它产生这个情节:

由于我的图例由于某种原因被删除,我尝试自己确定图例列的最佳数量。我必须即时计算它,因为所有这些都进入一个函数(但对于本例,答案应该是 4)。

由于绘图的宽度以英寸为单位,因此我尝试巧妙地计算图例中某个级别的平均尺寸(以英寸为单位)。那么列数将是绘图宽度除以单个级别的大小,向下舍入(减去图例标题将占用的列)。

#find optimal number of legend columns
ceiling_dec <- function(x, level=1) round(x + 5*10^(-level-1), level)
floor_dec <- function(x, level=1) round(x - 5*10^(-level-1), level)
letter_size <- 1.5*width_scale/72.27 #72.27 point in 1 inch
mean_level_size <- mean(nchar(levels(mydf$var))) * letter_size #this is the size in inches of a group level in the legend
mean_level_size <- mean_level_size + (width_scale/50) + (width_scale/50) #plus the size of the level key and some extra space
num_cols <- floor_dec(width_scale/mean_level_size, 0)
cols_to_remove <- ceiling_dec((3*letter_size) / mean_level_size, 0) #number of columns that the legend title (var) would occupy
num_cols <- num_cols - cols_to_remove
if (num_cols<=0){num_cols <- length(levels(mydf$var))}
if (num_cols>length(levels(mydf$var))){num_cols <- length(levels(mydf$var))}
num_rows <- ceiling(length(levels(mydf$var)) / num_cols)
if ((num_rows==1) & (num_cols<length(levels(mydf$var)))){num_cols <- length(levels(mydf$var))}
#

有了这些信息,我将使用ggplot2再次制作绘图,将列数传递给guide_legend.

grDevices::pdf(file='test.pdf', height=10, width=width_scale)
print(#or ggsave()
  ggplot2::ggplot(mydf, ggplot2::aes(group, value, fill=var)) +
    ggplot2::geom_bar(stat="identity") +
    ggplot2::scale_y_continuous("%") +
    ggplot2::theme_light() +
    ggplot2::theme(legend.text=ggplot2::element_text(size=1.5*width_scale),
                   legend.title=ggplot2::element_text(size=1.5*width_scale,face="bold"),
                   legend.position="bottom",
                   legend.key.size = grid::unit(width_scale/50, "inch"),
                   legend.key.width = grid::unit(width_scale/50, "inch")) +
    ggplot2::guides(fill=ggplot2::guide_legend(ncol=num_cols))
)
grDevices::dev.off()

我以为我几乎拥有了它,但结果从来没有成功...请参阅此 MWE 中的代码产生以下情节...

传说为何被剪成这样?为什么ggplot2不会自动选择最佳列数?

如果我尝试自己确定最佳列数,该怎么做?我在上面做错了什么?

我知道在这种情况下要传递的最佳列数guide_legend (the num_col那里的块的结果)应该是 4,但我只知道它post hoc...我需要动态计算这个最佳数字,因为所有这些都在函数内部...

Thanks!


这有效:

  • 减小字体大小(width_scale 而不是 width_scale * 1.5)
  • 在图例周围添加一个框
ggplot2::ggplot(mydf, ggplot2::aes(group, value, fill=var)) +
    ggplot2::geom_bar(stat="identity") +
    ggplot2::scale_y_continuous("%") +
    ggplot2::theme_light() +
    ggplot2::theme(legend.text=ggplot2::element_text(size=width_scale),
                   legend.box.margin = margin(6, 6, 6, 6),
                   legend.title=ggplot2::element_text(size=1.5*width_scale,face="bold"),
                   legend.position="bottom",
                   legend.key.size = grid::unit(width_scale/50, "inch"),
                   legend.key.width = grid::unit(width_scale/50, "inch"))

您可以根据图例中的元素数量调整 width_scale :

mydf <- data.frame(group=paste0('gr',1:10), var=paste('some long text -', 1:50), value=runif(500, 0, 100))
width_scale <- 12 * 26 / length(unique(mydf$var))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

R ggplot2 - 底部的图例被剪切,如何动态找到图例的最佳列数? 的相关文章

  • 聚合日期时间以总结在特定条件下花费的时间

    我很困惑我应该如何继续 我下面有一些虚拟数据 Date lt as POSIXct c 2018 03 20 11 52 25 2018 03 22 12 01 44 2018 03 20 12 05 25 2018 03 20 12 10
  • 将日期时间字符串转换为 Date 类

    我有一个带有日期时间字符列的数据框 当我使用as Date 除了少数实例之外 我的大多数字符串都被正确解析 下面的示例有望向您展示发生了什么 my attempt to parse the string to Date uses the s
  • 使用自定义渐变填充直方图箱

    我想在 R 和 ggplot2 中创建一个直方图 其中根据连续的 x 值填充箱 大多数教程仅通过离散值或密度 计数进行着色 下列的这个例子 https stackoverflow com questions 40284227 how to
  • 将所有分号替换为空格 pt2

    我尝试对 2000 多行关键字的列表运行文本分析 但它们的列出方式如下 战略 管理风格 组织 所以当我使用 tm 删除标点符号时 它就变成了 组织的战略管理风格 我认为这在某种程度上破坏了我常用术语的分析 我尝试过使用 vector lt
  • 为每个因素级别添加日期时间序列

    我有一个带有因子列的数据框 s lt data frame id 901 910 s id lt as factor s id 我有一个日期时间序列 library lubridate start lt now as difftime 2
  • 改进R中从google获取股票新闻数据的功能

    我已经编写了一个函数来从 Google 获取和解析给定股票代码的新闻数据 但我确信有一些方法可以改进它 对于初学者来说 我的函数返回一个 GMT 时区的对象 而不是用户当前的时区 如果传递的数字大于 299 它就会失败 可能是因为 goog
  • 根据 R 数据框中的名称对列进行平均

    我想知道是否有一种有效的方法来获取每组的平均值类似命名的列谁的名字结尾为 1S and 2S ex ex1S ex2S at time 1并取每组的平均值类似命名的列谁的名字结尾为 1C or 2C ex ex1C ex2C at time
  • 如何总结此R问题中的销售数量、售出酒类数量和花费金额

    我使用以下代码在 R 上上传我的数据 if file exists ames liquor rds url lt https github com ds202 at ISU materials blob master 03 tidyvers
  • 在 R 中使用逻辑 grep 抓取文本

    下午好 谢谢你帮我解答这个问题 我有兴趣抓取一组超过 5000 个 URL 的列表 我使用 lapply 和 readLines 使用下面的示例代码提取这些网页的文本 multipleURL lt c http dailymed nlm n
  • 通过 Shiny 中的串扰将 Plotly 与 DT 结合使用

    我正在编写一个应用程序来将 csv 文件读取为闪亮的并将散点图与 DT 表链接起来 我几乎遵循了 Plotly 网站上 DT 数据表上的示例 https plot ly r datatable https plot ly r datatab
  • 按组计算连续行中的值之间的差异

    这是我的一个df 数据框 group value 1 10 1 20 1 25 2 5 2 10 2 15 我需要按组计算连续行中的值之间的差异 所以 我需要一个结果 group value diff 1 10 NA because the
  • 通过 R 中的数据子集执行计算

    我想对数据框的 PERMNO 列中的每个公司编号进行计算 其摘要可以在此处查看 gt summary companydataRETS PERMNO RET Min 10000 Min 0 971698 1st Qu 32716 1st Qu
  • rvest 和 NHL 统计数据的 CSS 选择器问题

    我想从 hockey reference com 中抓取数据 特别是从以下链接中抓取数据 https www hockey reference com leagues NHL 1991 html https www hockey refer
  • R 多元一步预测和准确性

    我想使用 R 来比较两个预测模型的 RMSE 均方根误差 第一个模型使用 1966 年至 2000 年的估计值来预测 2001 年 然后使用 1966 年至 2001 年的估计值来预测 2002 年 依此类推直至 2015 年 第二个模型使
  • R 中的龙卷风图

    我正在尝试在 R 中绘制龙卷风图 又名敏感性图 目标是可视化某些变量增加 10 和减少 10 的效果 到目前为止我已经得到这个结果 这是我正在使用的代码 Tornado plot data lt matrix c 0 02 0 02 0 0
  • 使用 pkg:sjPlot 函数创建一个生成部分斜体单元格的数据框

    我正在尝试创建一个简单的数据表 其中 Coral taxon 列中的属名称为斜体 而 spp 列中的属名称为斜体 属名后面的部分不大写 我尝试使用 expression 函数对 Coral taxon 的每一行进行编码 但没有成功 sum
  • 当有很多列时,使用 readr::read_csv() 导入数据时覆盖列类型

    我正在尝试使用 R 中的 readr read csv 读取 csv 文件 我导入的 csv 文件大约有 150 列 我只包含示例的前几列 我希望将第二列从默认类型 我执行 read csv 时为日期 覆盖为字符或其他日期格式 GIS Jo
  • 按特定样本前缀对列名称向量进行子集化

    假设我有一个如下所示的数据框 ca01 lt c 1 10 ca02 lt c 2 11 ca03 lt c 3 12 stuff 1 lt rep test 10 other lt rep 9 10 data lt data frame
  • 计算互相关函数?

    In R 我在用ccf or acf计算成对互相关函数 以便我可以找出哪个移位给我带来最大值 从它的外观来看 R给我一个标准化的值序列 Python 的 scipy 中是否有类似的东西 或者我应该使用fft模块 目前 我正在这样做 xcor
  • 如何绘制大时间序列(数千次给药次数/药物剂量)?

    我正在尝试绘制医院中如何开出单一药物的图解 在这个虚拟数据库中 我在 2017 年 1 月 1 日之后遇到了 1000 名患者 绘图的目的是了解该药物的给药模式 在接近入院 出院或患者住院期间是否更频繁 高剂量给药 Get random d

随机推荐

  • 使用 AFNetworking 下载大文件

    我正在尝试实现大文件的下载并向用户显示当前进度 但阻止 AFURLConnectionOperation setDownloadProgressBlock 返回不正确bytesRead and totalBytesRead值 它们小于应有的
  • Hyperledger Fabric 的性能测试

    在尝试使用 Hyperledger Fabric 实现 IBM 团队在其文章中报告的性能期间Hyperledger Fabric 用于许可区块链的分布式操作系统 https arxiv org abs 1801 10228 我遇到了一些问题
  • 寻找跨平台开发的最佳 PCL 配置文件

    我正在努力扩展我的应用程序支持的平台数量 它曾经支持 NET4 Windows Store Windows Phone 但我希望也涵盖适用于 Android 和 iOS 的 Mono 我已将所有业务逻辑 模型和视图模型放入可移植类库 PCL
  • Blazor GetAsync 请求返回 401 状态代码

    我是 blazor 新手 尝试使用 NET Core EF Core 3 和 Visual studio 2019 创建一个应用程序 我已经设置了一个数据库模型和一个 API 用于获取所有地址 api Address 并在浏览器中浏览到此地
  • C# WinForm BackgroundWorker 不更新进度栏

    我在让后台工作人员更新进度条时遇到了一些麻烦 我使用在线教程作为示例 但我的代码无法正常工作 我在这个网站上进行了一些挖掘 但找不到任何解决方案 我对后台工作者 进度的事情很陌生 所以我不完全理解它 只是为了设置 我有一个主窗体 窗体 1
  • 传递到字典中的模型项的类型为“MyType”,但该字典需要类型为“MyType”的模型项

    是的 我浏览了类似标题的问题 它们似乎都不符合我所处的情况 这只是程序员向视图发送了错误的对象类型 这是我收到的确切错误消息 传递到字典中的模型项的类型为 IS Extensions Models ContactSelectList 但此字
  • Haskell 中的并发数据库连接池

    我是一名学习 Haskell 的 Java 程序员 我正在开发一个小型 Web 应用程序 该应用程序使用 Happstack 并通过 HDBC 与数据库进行通信 我写过select and exec函数 我这样使用它们 module Mai
  • 使用 onOptionsItemSelected 从 PreferenceActivity 和 PreferenceFragments 向上移动

    我使用时遇到问题onOptionsItemSelected使用 Android Studio 的默认 设置活动 extends AppCompatPreferenceActivity 活动的重要部分是 public class Settin
  • 正则表达式提取嵌套模式[重复]

    这个问题在这里已经有答案了 可能的重复 在 Python 中将嵌套结构与正则表达式匹配 https stackoverflow com questions 1099178 matching nested structures with re
  • Firebase 中单个主题订阅的用户最大限制是多少? [复制]

    这个问题在这里已经有答案了 我正在使用 Firebase 主题发送通知 在这样做时 我遇到了 Firebase 通知控制台 其中显示 topic name lt 1000 estimated user关于选择通过主题发送通知 我读过这个PO
  • 在 ScrollViewer 滚动条可见性 (WPF) 上触发

    是否可以创建一个基于触发器触发的触发器ScrollViewer滚动条的可见性 我有一个ScrollViewer以其VerticalScrollBarVisibility set to Auto我想改变一些ScrollViewer仅当滚动条实
  • ansible 循环 include_tasks 直到成功

    我想知道如何循环多个任务直到满足条件 main yml set fact num 1 req num 10 name Start to unregister entities include tasks output yml loop ra
  • 检测 BLE 设备是否可在 Android 上连接

    我正在开发一个配置信标的项目 通电一段时间后 信标将变得不可配置 直到重新通电为止 为了显示可配置信标的列表 我正在查看某些特征 蓝牙设备名称 广告数据包中的某些制造商数据 我还需要知道它是否 可连接 即 e 如果设备的 BLE 广告数据包
  • 继承main方法

    我想定义一个基类 它定义一个实例化该类的主方法 并运行一个方法 但也存在一些问题 这是基类 public abstract class Strategy abstract void execute SoccerRobot robot pub
  • Zend Framework:如何在不使用表单的情况下将数据发布到某些外部页面(例如外部支付门)?

    我希望将用户重定向到外部信用卡门 当然 我必须将一些用户信息发布到该门 但我不知道具体该怎么做 我知道我可以通过生成带有隐藏或只读字段的 html 表单并让用户单击 提交 按钮来做到这一点 但这个解决方案并不完美 因为所有表单数据都可以使用
  • 搜索字段中的搜索图标

    如何在搜索字段中放置搜索图标 该图标位于搜索字段的前面 而搜索按钮位于搜索栏后面 像这样的东西 input background url http kodyrabatowe wp pl img ico search gr png top l
  • 使用 Mono 运行 .NET 4 应用程序

    我正在尝试在 Ubuntu 机器上运行 NET exe 我安装了软件包mono complete 到目前为止还没有运气 该应用程序是在 NET 4 客户端配置文件 下使用 Visual C Express 2010 编译的 我尝试使用以下命
  • 如何将 Windows 上的 Git 升级到最新版本

    我刚刚从之前的版本升级到适用于 Windows 的 Git 1 8 0 11 7 9 mysysgit 0 我下载了来自 Git 站点的新版本 http cloud github com downloads msysgit git Git
  • 滚动时的 JavaScript 调整大小事件 - 移动设备

    我正在尝试制作一个移动网站 我在窗口上绑定了 调整大小 事件 当移动设备转动时 纵向横向 它应该重新排列元素 在 iPhone 和 Samsung Galaxy SII 上 当我向下滚动页面时会触发该事件 这不太好 我怎样才能解决这个问题
  • R ggplot2 - 底部的图例被剪切,如何动态找到图例的最佳列数?

    我想在底部制作一个带有图例的情节 但图例总是被剪切 因为看起来ggplot2无法自动确定底部图例中的最佳列数 我尝试自己做 但没有成功 假设我有以下内容mydf数据框 mydf lt data frame group paste0 gr 1