如何使用facet_grid或facet_wrap保持条的均匀厚度并切换条位置?

2024-02-07

我想用水平条形图显示数据并通过分组变量对其进行分面。因为我想要一个带有分面的水平图,所以我将使用geom_barh来自ggstance包裹。我有一个数据集,其中我的观察结果被分为几种不同的类型和计数。像这样的事情:

library(tidyverse)

data <- tibble(observations = c(1:17), 
           type = c("a", "a", "a", "a", 
                    "b", "b", "b", "b", "b", "b", 
                    "c", "c", "c", "c", "c", "c", "c"),
           n = c(30:46))

这是我的问题。当我使用facet_wrap,我的条形有不同的宽度:

library(ggstance)    

ggplot(data, aes(x = n, y = reorder(observations, n))) +
 geom_barh(stat = "identity") +
 facet_wrap(~ type, ncol = 1, scales = "free_y")

但是当我使用facet_grid,我无法将条带移至顶部,因为没有strip.position争论:

ggplot(data, aes(x = n, y = reorder(observations, n))) +
 geom_barh(stat = "identity") +
 facet_grid(type ~ . , scales = "free_y", space = "free_y")

这只是 ggplot 的怪癖之一还是有办法操纵它?


我不认为 ggplot2 是用于此目的的,但与许多其他情况一样,如果您愿意接受 grob (而不是 ggplot2 对象)作为最终结果,则可以破解解决方案。

这里的基本思想是facet_wrap()允许条带处于任何位置(上/左/右/下),同时fact_grid()允许面板的高度/宽度不同。如果我们将每个选项的 ggplot2 结果转换为 grob 对象,我们可以将选项 2 的面板高度应用到选项 1。具体方法如下:

Step 1。基于两者创建 ggplot2 对象facet_wrap() & facet_grid()。将它们转换为 grob 对象。 (注意:我没有安装 ggstance 包,但是通常的geom_col() + coord_flip()为了说明这里的概念,应该类似......)

p1 <- ggplot(data, aes(y = n, x = reorder(observations, n))) +
  geom_col() +
  facet_wrap(~ type, ncol = 1, scales = "free_y") +
  coord_flip()
g1 <- ggplotGrob(p1)

p2 <- ggplot(data,
       aes(y = n, x = reorder(observations, n))) +
  geom_col() +
  facet_grid(type ~ . , scales = "free_y", space = "free_y") +
  coord_flip()
g2 <- ggplotGrob(p2)

Step 2。获取 g1 和 g2 布局中面板行的位置:

g1.panel.rows <- g1$layout$t[grep("panel", g1$layout$name)] #7 / 12 / 17 in this case
g2.panel.rows <- g2$layout$t[grep("panel", g2$layout$name)] #6 / 8 / 10 in this case

# optional: view the layout & visually check that the above are correct
gtable::gtable_show_layout(g1)
gtable::gtable_show_layout(g2)

# also optional (but recommended): check the current height associated with each panel;
# note that g1 has equal height for each panel, while g2 does not    
> g1$heights[g1.panel.rows]
[1] 1null 1null 1null
> g2$heights[g2.panel.rows]
[1] 4.2null 6.2null 7.2null

Step 3。将 g2 的面板高度应用于 g1 的面板并查看结果。

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

如何使用facet_grid或facet_wrap保持条的均匀厚度并切换条位置? 的相关文章

  • 从日期变量创建月末日期

    我有一个包含日期变量的大型数据框 它反映了该月的第一天 有没有一种简单的方法来创建代表该月最后一天的新数据框日期变量 以下是一些示例数据 date start month seq as Date 2012 01 01 length 4 by
  • 使用字符串中的变量名称访问变量值,R

    Intro 一个数据集有大量的age year变量 age 1990 age 1991 etc 我有一个字符串值数组length age years 表示这些变量 使得age years 1 回报 age 1990 etc Need 我想搜
  • 为什么数据帧上的 is.vector 不返回 TRUE?

    tl dr R 中的向量到底是什么 长版 R 中很多东西都是向量 例如 数字是长度为 1 的数值向量 is vector 1 1 TRUE 列表也是一个向量 is vector list 1 1 TRUE 好的 所以列表是一个向量 显然 数
  • R 可以创建带有可单击条形图的条形图图像以插入网页吗?

    我知道如何创建条形图 以及如何将其粘贴在网页上 例如 使用hwriteImage in the 作家包 http www embl de gpau hwriter 我想要的是每个栏都是一个在鼠标悬停时突出显示的区域 并且每个栏在单击时都有不
  • 列出 R 数据文件的内容而不加载

    我有时用print load myDataFile RData 当我加载数据文件时列出它的内容 有没有办法列出内容而不加载数据文件中包含的对象 我认为如果不加载对象就无法做到这一点 解决方案可能是使用包装器将 R 对象保存到save 该函数
  • 不同编程语言中的浮点数学

    我知道浮点数学充其量可能是丑陋的 但我想知道是否有人可以解释以下怪癖 在大多数编程语言中 我测试了 0 4 到 0 2 的加法会产生轻微的错误 而 0 4 0 1 0 1 则不会产生错误 两者计算不平等的原因是什么 在各自的编程语言中可以采
  • 需要在R中按行绑定列表数据

    我在 R 中按行绑定列表时遇到问题 我的列表数据集是 id 1 data k 1 id k b c 1 1 1 3 data k 2 id k b c 1 2 1 4 id 2 data k 1 id k b c 2 1 1 6 data
  • 如何按时间间隔匹配数据帧?

    这是我从数据记录器导入原始数据时经常出现的问题 温度记录仪设置为每十分钟记录一次温度 单独的气体记录仪设置为记录最后十分钟间隔内使用的气体 我想将这两个记录器的数据合并到一个数据框中进行绘图和分析 但时间并不完全一致 我希望每十分钟的时间段
  • picker输入字体或背景颜色

    我在闪亮的仪表板中使用 pickerInput 这很好 除了一个问题 背景颜色和字体颜色太相似 使得过滤器选择难以阅读 有什么办法可以改变背景或字体颜色吗 如果可能的话 我想继续使用 pickerInput 但如果有一个带有 selectI
  • 如何在 R 中的 for 循环内将值存储在向量中

    我正在开始使用 R 但我对以下问题感到非常沮丧 我试图将 for 循环内完成的某些计算的值存储到我之前定义的向量中 问题是如何进行索引 因为for循环迭代代码的次数取决于用户的输入 所以变量i不一定要从1开始 它可以从80开始 for举个例
  • R Shiny:如何将无功值从闪亮模块返回到主服务器功能?

    我有一个简单的玩具示例 它使用 add removeBtn 模块在 第一个 模块中添加和删除 UI 我需要跟踪单击 添加 删除 的次数 如果我不使用模块 这很容易 但我试图在嵌套模块的上下文中执行此操作 代码如下 但基本上 我似乎无法访问主
  • 在 R 的 for 循环中创建动态命名对象并分配动态值

    我正在尝试创建一套动态命名的新对象 例如 temp2015 使用 for 循环 并存储动态值 具体来说 其他对象的名称 例如 Y2015 和 for 循环中使用的值 例如 2015 在动态命名的新对象中 我不确定为什么下面的代码不起作用 Y
  • R - 重塑 - 熔化错误

    我正在尝试融化数据框 但出现了这个奇怪的错误 有什么想法吗 str zx7 data frame 519 obs of 5 variables calday new Date format 2011 01 03 2011 01 04 201
  • 如何声明包含 M 个元素的列表对象

    我想声明一个包含 M 3 x 3 矩阵的列表 如果我事先知道数字 M 那么我可以通过以下方式声明这样的列表 elm lt matrix NA 3 3 Say M 7 myList lt list elm elm elm elm elm el
  • 增加雷达图中长轴标签的空间

    我想创建一个雷达图ggirahExtra ggRadar 问题是我的标签很长并且被剪掉了 我想我可以通过添加在标签和绘图之间创建更多空间margin margin 0 0 2 0 cm to element text in axis tex
  • R中IF函数的使用

    我正在短跑ifR 中的函数 但收到以下警告消息 In if runif 50 0 1 lt 0 69 the condition has length gt 1 and only the first element will be used
  • 当设置 coord_fixed 时,ggplot/shiny 中的鼠标悬停坐标是错误的

    我正在使用问题中的答案 当您将鼠标悬停在闪亮的 ggplot 上时出现工具提示 https stackoverflow com questions 27965931 tooltip when you mouseover a ggplot o
  • 如何为自定义 S3 类实现提取/取子集 ([ [<-, [[ [[<-)] 函数?

    我有一个自定义的 S3 类foo 它在正常的基础上添加了一些自定义行为data frame foo object lt data frame class foo object lt c foo data frame 对于这个类 还应该有一个
  • 当将遗传算法与 lme4 一起使用时,glmulti 无限期运行

    我在 R 中使用 glmulti 进行模型平均 我的模型中有大约 10 个变量 使得详尽的筛选不切实际 因此我需要使用遗传算法 GA 调用 method g 我需要包含随机效应 因此我使用 glmulti 作为 lme4 的包装器 此处提供
  • case_when 与部分字符串匹配和 contains()

    我正在使用一个数据集 其中有许多名为 status1 status2 等的列 在这些列中 它表示某人是否豁免 完整 注册等 不幸的是 豁免投入并不一致 这是一个示例 library dplyr problem lt tibble perso

随机推荐

  • Android Studio 3.1:找不到 org.jetbrains.trove4j:trove4j:20160824

    昨天 我将 Android Studio 更新到 3 1 但收到此错误 Could not find org jetbrains trove4j trove4j 20160824 Searched in the following loca
  • Blobstore 上传 + Ajax/替代方案

    下面的代码可以完美运行 我唯一关心的是我想将下面的内容转换为 AJAX alternative 这样就不需要刷新整个页面来提交此请求 如果可能的话 还包括加载进度条等
  • 在节点中使用 zone.js 挂钩

    我正在尝试使用编写一个简单的演示角度 zone js https github com angular zone js在节点中 但由于某种原因既没有beforeTask or afterTask正在被召唤 这是我正在运行的代码 requir
  • Indy 10 中的 TIdHTTP

    我以前在 Delphi 6 天时就使用过 Indy 现在我正在使用 Indy 10 我想做的事情非常简单 但我没有看到简单的方法 所以我一定错过了一些东西 我想做的是这样的 这是我正在使用的实际代码 procedure TForm1 btn
  • 如何从 URL 流式传输/下载和播放音频?

    我需要在 iOS 上运行的 Unity3D 中流式传输或下载并播放从 URL 获取的音频 音频来自文本转音频服务 我需要在 Unity 上播放它 我一上午都在谷歌上搜索 没有找到有效的解决方案 Unity3D文档中有一个代码片段 WWW音频
  • 从Java访问gradle资源

    我有一个具有这种结构的基于 gradle 的 java 项目 myproject src main java resources myresource xml build classes main myresource xml resour
  • 雅虎财经 V7 API 现在需要 cookie? (Python)

    url https query2 finance yahoo com v7 finance quote symbols TSLA fields regularMarketPreviousClose region US lang en US
  • 在使用 fit_generator 和 evaluate_generator 训练网络时,如何绘制 AUC 和 ROC?

    我正在使用生成器来训练和预测数据的分类 这是一个例子图像数据生成器 https blog keras io building powerful image classification models using very little da
  • 在同一服务器上加载同一项目的不同版本的配置文件的最佳方法是什么?

    我有一个大型 php 项目 依赖于两个级别的配置文件 在我的项目文件夹中 我有一个 default config ini 它被加载 然后与站点特定的配置文件合并 目前代码正在读取环境变量PROJECT CONFIG指向特定的配置文件 这对于
  • 我应该通过 SessionAware 还是 ActionContext 获取会话?

    在阅读了通过以下方式获取会话映射之间的差异之后ActionContext getContext getSession 并让它注入SessionAware我想知道哪种方法是首选方法 为什么 该API推荐使用SessionAware 我在网上读
  • 为什么 GetMessageW 会在我的 WPF 应用程序中占用大量 CPU 使用率?

    我在这里遇到了一个严重的难题 我正在调查应用程序中 WPF 组件的性能问题 我们的 net 应用程序非常大 并且几乎完全采用 Windows 窗体 作为新计划的一部分 我们使用丰富的 WPF 用户界面重写了我们的核心组件之一 有很多 Win
  • 为什么 git merge 有时会创建提交,有时不会?

    当我做git merge从另一个分支到当前工作区 git 有时会进行新的提交 Merge remote tracking branch xxx into xxx 有时 它不会 Fast forward src files 那么什么决定了是否
  • Mongoose findOne 在嵌套记录上无法按预期工作

    我在 MongoDB 中有一个集合 其简化版本如下所示 Dealers Id 123 Name Someone Email email protected cdn cgi l email protection Vehicles Id 123
  • 找不到 momd 文件:核心数据问题

    噢天啊 我搞砸了一些事情 我是一名 Core Data 菜鸟 正在开发我的第一个 iOS 应用程序 经过多次堆栈溢出后 我正在使用以下代码 NSString path NSBundle mainBundle pathForResource
  • Go 如何处理 Google App Engine 上的并发请求

    我对 Go 如何处理 Google App Engine 上的并发请求有点困惑 所以我希望有人能提供一些澄清 以下是我收集到的事实 Go 在 App Engine 上是单线程的 这是因为可以通过使用多个线程创建竞争条件来执行任意指针算术 h
  • 离子降低滚动速度

    我在尝试从此代码减慢滚动速度时遇到问题 ionicScrollDelegate getByHandle credit scrollBottom true 我怎样才能减慢滚动速度 因为现在它对我来说滚动得太快了 我需要放慢滚动速度 就像星球大
  • Python - 安装有扩展的远程 Webdriver

    我想使用以下命令在不同浏览器版本上测试一个扩展浏览器堆栈 http browserstack com 这是一个返回具有指定功能的驱动程序的函数 我有一个 crx file对于 Chrome 和 xpi file对于我本地计算机上的 Fire
  • 在屏幕上查找复合位置

    我正在 Java 中为 SWT 和 AWT 实现一个屏幕键盘 一件重要的事情是将键盘移动到可以显示所选文本字段的位置 并且不要位于屏幕键盘后面 对于 AWT 我可以检测当前选定组件的位置 Component owner KeyboardFo
  • 对有效的类型规则感到困惑

    我似乎再次错过了有关有效类型的一些难题 代码中的注释本质上是我的问题 但这是我能想到在适当的上下文中提出这个问题的唯一方法 include
  • 如何使用facet_grid或facet_wrap保持条的均匀厚度并切换条位置?

    我想用水平条形图显示数据并通过分组变量对其进行分面 因为我想要一个带有分面的水平图 所以我将使用geom barh来自ggstance包裹 我有一个数据集 其中我的观察结果被分为几种不同的类型和计数 像这样的事情 library tidyv