将空图添加到ggplot2中的facet_wrap

2024-01-09

我正在尝试创建 3 个图,其中所有面板应具有相同的大小,所以我认为解决方案可能是facet_wrap。我的问题是,我不希望每个图表中有相同数量的图表

df <- data.frame(group=c(1,1,2,2,2,3,3),
                 name=c('a','b','c','d','e','f','g'),
                 x=c(1,2,3,4,5,6,7),
                 y=c(2,3,4,5,6,7,8))
ggplot(df, aes(x,y)) + geom_point() + facet_wrap(~ name, ncol=3)

结果将图表组合成连续顺序,但我想按我的组列对它们进行分组。

所以我期望的结果是

a b _
c d e 
f g _

但我得到的是

a b c
d e f
g _ _

有没有人建议创建这样的图表,也许通过添加空图表?我找到了另一个线程强制facet_wrap填充底行... https://stackoverflow.com/questions/18337789/force-facet-wrap-to-fill-bottom-row-and-leave-any-gaps-in-the-top-row但我无法让它在我的情况下运行。


facet_wrap只需将一个图放在另一个图之后,并在适当数量的图之后插入“换行符”即可。但也有facet_grid它允许您指定行和列索引。你的行索引是group我现在添加一个列索引,如下所示:

cols<-c(a=1,c=1,f=1,b=2,d=2,g=2,e=3)
df$col <- as.factor(cols[as.character(df$name)])

现在您可以使用以下命令绘制面网格

ggplot(df, aes(x,y)) + geom_point() + facet_grid(group~col)

当然,根据您的问题是什么,您必须考虑设置列索引的适当方法。

这是情节:

Edit:

为了回应您的评论和绘图这个答案 https://stackoverflow.com/a/18338240/4303162,我创建了第二个解决方案。它用gridExtra并直接操作 ggplot grob。我认为它给出了期望的结果,但以我呈现的形式,它是“手动工作”。该解决方案使用facet_wrap代替facet_grid.

首先,我向变量添加“占位符级别”name,这将确保创建空面,然后创建绘图:

df$name2 <- factor(df$name,levels=c('a','b','','c','d','e','f','g',' '))
p <- ggplot(df, aes(x,y)) + geom_point() + facet_wrap(~name2,ncol=3,drop=FALSE)

drop=FALSE是什么导致ggplot绘制空的面。 该图与我的第一个解决方案的不同之处仅在于如何标记方面。现在到棘手的部分:

library(gridExtra)
g <- ggplotGrob(p)
## remove empty panels
g$grobs[names(g$grobs) %in% c("panel3", "panel9", "strip_t3", "strip_t9")] <- NULL
## remove them from the layout
g$layout <- g$layout[!(g$layout$name %in% c("panel-3", "panel-9", 
                                           "strip_t-3", "strip_t-9")),]
## move axis closer to panel
g$layout[g$layout$name == "axis_b-9", c("t", "b")] = c(9,9)

这基本上就是评论所说的。如果您使用另一组图,请查看输出names(g$grobs) and g$layout$name找出必须删除哪些元素。

现在您可以使用以下命令创建绘图

grid.newpage()
grid.draw(g)

Edit 2:

对于较新版本的ggplot2上述解决方案不起作用。不幸的是,我不知道这是从哪个版本开始的,但它肯定不适用于 2.2.1 版本。

必须改变的部分是grob的修改:

g <- ggplotGrob(p)
# get the grobs that must be removed
rm_grobs <- g$layout$name %in% c("panel-1-3", "panel-3-3", "strip-t-3-1", "strip-t-3-3")
# remove grobs
g$grobs[rm_grobs] <- NULL
g$layout <- g$layout[!rm_grobs, ]
## move axis closer to panel
g$layout[g$layout$name == "axis-b-3-3", c("t", "b")] = c(14.5, 14.5)
grid.newpage()
grid.draw(g)

主要变化是g$grobs不再是命名列表,并且 grobs 的名称已更改。请注意,面板标记为"panel-row-col"而对于灰色条来说则是"strip-t-col-row".

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

将空图添加到ggplot2中的facet_wrap 的相关文章

随机推荐

  • 嵌套 CSS 样式?

    这样的事情可能吗 imgbox hover ui resizable se some style 或者概念上的等价物 基本上 只有当某个类的元素悬停在上面时 才会出现某个元素within该类应该改变一些风格 你可以这样做 imgbox ho
  • 我们应该在 Rails Factory 中使用 Faker 吗?

    I love Faker https github com stympy faker 我在我的seeds rb一直用真实的数据填充我的开发环境 我也刚刚开始使用工厂女工 https github com thoughtbot factory
  • 在 Android 中使用 color 和 color.darker?

    好的 我的应用程序中有一个整数变量 它是颜色的值 由颜色选择器根据我的喜好设置 现在 我需要使用该颜色和任何颜色的深色版本 现在我知道在标准 Java 中有一个 Color darker 方法 但在 Android 中似乎没有等效的方法 有
  • Linq 中的 SQL LIKE

    在添加这个问题之前 我确实在 stackoverflow 上搜索过类似的问题 但我找不到 互联网上的大多数问题都使用 LIKE 和字符串 例如 LIKE ABC 但我需要与不同表的现有列进行比较 我需要为 select 语句编写一个 lin
  • spring boot org.springframework.beans.factory.BeanCreationException:无法自动装配字段:

    我从 spring boot 开始 遇到一些配置问题 我无法自动装配某些服务 我收到 BeanCreationException 我的应用程序类 SpringBootApplication EnableAutoConfiguration C
  • 活动没有选项菜单

    我试图模拟点击菜单项存在于Toolbar using 机器人电动 使用以下代码 ShadowActivity shadowActivity Shadows shadowOf activity shadowActivity clickMenu
  • 如何查看导致 LINQ to SQL 中的 SubmitChanges 错误的 sql?

    我有一些 LINQ to SQL 有时会抛出 无法在具有唯一索引的对象 dbo Table 中插入重复的键行 IX Indexname 该语句已终止 有什么方法可以打开日志记录或至少调试数据上下文以查看引发错误时正在执行的 sql 吗 Up
  • 如何从文档中删除所有肖像图片

    我正在对文档图像进行 OCR 处理 我想检测所有图片并从文档图像中删除 我想保留文档图像中的表格 一旦我检测到图片 我就会将其删除 然后进行 OCR 我试图找到轮廓试图检测所有更大的区域 不幸的是它也检测到表格 还如何删除在文档图像中保留其
  • 通过 Python 代码使用 SignalR 服务器

    将 Python 与 SignalR 集成有哪些选项 Python 代码是大型第三方产品的一部分 与语言偏好无关 SignalR 服务器提供对现有 NET 产品的订阅 我们希望通过 Python 重用 NET SignalR 服务器 pyt
  • Java中如何随机选择图片?

    我正在制作一个将使用以下代码的程序 JLabel MyImage new JLabel new ImageIcon image1 png 但是 我想让随机图片出现 比如 image2 image3 image4 我该如何做到这一点 不使用L
  • @RequestMapping 在 Spring Boot 内部如何工作?

    RestController RequestMapping employee public class Employee RequestMapping save public void saveEmployee saving employe
  • blockIdx 与区块执行顺序相关吗?

    之间有什么关系吗blockIdx以及线程块在 GPU 设备上执行的顺序 我的动机是 我有一个内核 其中多个块将从全局内存中的同一位置读取 如果这些块能够同时运行 那就太好了 因为 L2 缓存命中很好 在决定如何将这些块组织成网格时 可以肯定
  • 如何识别无法嵌入文件的 YouTube 视频

    我有一个移动应用程序 可以在网络视图中嵌入一些 YouTube 视频 问题是 使用 YouTube Data API v3 我得到了 可嵌入 要显示的项目 但其中一些说 视频不可用 当我将相同的代码粘贴到 jsfiddle 或域或某种网络服
  • docker jboss7 战争提交。服务器启动失败且无法恢复

    有没有办法将 war 文件部署到在 docker 容器内运行的 Jboss as7 中 因为我的 jboss 服务器在 docker 提交后似乎失败了 Could not rename usr local share jboss stand
  • Keycloak + Kerberos 身份验证:机制级别:无效参数 (400) - 无法找到适当类型的密钥来解密 AP REP - 使用 HMAC 的 RC4

    我有以下内容 JBoss EAP 7 2 2 上的 Spring Web 应用程序 Machine CentOs CentO 上的 Keycloak 3 3 4 活动目录 我们在 OpenJDK 8 上运行 用户使用其 Active Dir
  • CG 3.0会泄露吗?

    我发现 CG 似乎存在内存泄漏 我通过 nvidia com 提交了一份报告 但如果您尝试这样做here http will sherif appspot com html d3d11 DirectWrite html 如果你删除那行 cg
  • 语法错误:编译 ejs 时参数列表后缺少 )

    编译 ejs 时 我收到错误 参数列表后缺少 我尝试了很多次 但找不到问题所在 这是导致错误的 ejs 这段代码有什么问题 h2 class page title Products h2 br a href admin products a
  • WPF Ribbon - 隐藏快速访问工具栏

    如何在 WPF 功能区中隐藏快速访问工具栏 For 您可以使用隐藏它VisualTreeHelper 上Loaded事件处理程序 只需将包含快速访问工具栏的行大小调整为 0 private void RibbonLoaded object
  • 安卓L | libusb_init 返回 LIBUSB_ERROR_OTHER (-99)

    我尝试使用libusb在未 root 的 Nexus 5 上 如建议的那样这种方法 https stackoverflow com a 24243605 902217 通过将 USB 文件描述符从 java 传输到本机端 我的应用程序通过以
  • 将空图添加到ggplot2中的facet_wrap

    我正在尝试创建 3 个图 其中所有面板应具有相同的大小 所以我认为解决方案可能是facet wrap 我的问题是 我不希望每个图表中有相同数量的图表 df lt data frame group c 1 1 2 2 2 3 3 name c