如何在具有不同画布大小的 ggplot2 绘图网格中保持一致的轴缩放

2024-04-12

编辑:清除描述和代码示例,添加绘图。

我有一个数据集,其中包含几种动物的位置。

我为每只动物创建了位置散点图网格。因为图的 x y 是距离,所以我想使每个图本身的 x y 保持相同的比例(因此距离没有失真)和跨图(这样我可以比较具有相同比例的不同图)。

Facet 是一个自然的选择,它可以与coord_fixed()。然而,当数据中存在异常值(可能是错误)时,情况会变得更加复杂。我修改了 @Mark Peterson 很好的答案,添加了一些异常点。

set.seed(8675309)
df <-
  data.frame(
    x = runif(40, 1, 20)
    , y = runif(40, 100, 140)
    , ind = sample(LETTERS[1:4], 40, TRUE)
  )
# add some outliers to stretch the plot
outliers <- data.frame(x = c(-100, 30, 60,-50),
                       y = c(20, 200, -100, 500),
                       ind = LETTERS[1:4])
df <- rbind(df, outliers)

ggplot(df , aes(x = x, y = y)) +
  geom_point() +
  facet_wrap(~ind) +
  coord_fixed()

This is what we got. facet with outlier

1.使用 coord_fixed() 绘制面图:比例一致,轴对齐

该图满足比例比例要求和比例一致要求,并且所有轴对齐,即所有 xlim ylim 相同。这很有用,因为它可以显示彼此的相对位置。

我还想检查每个图的模式并进行比较。保持面图的相对位置,我想添加另一个具有一致比例但轴未对齐的图。如果单独绘制每个图,它将选择 xlim ylim 来覆盖数据,而无需对齐要求。所以我只需要绘制每个图,然后将它们排列起来gridExtra or cowplot.

然后,为了处理异常值,我们的计划是添加一个缩放按钮来放大所有图(图将位于 Shiny 应用程序中)。

我们决定将每个图都以其质心为中心。虽然这种方式会浪费更多的空间,但所有绘图都正确居中,缩放它们将显示所有绘图的大部分,并且它们在比例上仍然具有可比性。

我有一个函数可以将每个图调整到其中位中心,有点类似于@Mark Peterson 代码。

我知道中位中心在 2D 点中没有明确定义,但它足以满足我的需求。因为我需要单独调整每个图,所以我不能再使用facet。

expand_1D_center <- function(vec){
  center <- median(vec)
  new_diff <- max(center - min(vec), 
                  max(vec) - center)
  return(c(new_min = center - new_diff, 
           new_max = center + new_diff))
}
# given x y vectors, get new x y lim to make centroid center
expand_2D_center <- function(x_vec, y_vec){
  return(list(xlim = expand_1D_center(x_vec),
              ylim = expand_1D_center(y_vec)))
}
# plot each with center adjusted
id_vector <- sort(unique(df$ind))
g_list <- vector("list", length = length(id_vector))
for (i in seq_along(id_vector)) {
  data_i <- df[df$ind == id_vector[i], ]
  new_lim <- expand_2D_center(data_i$x, data_i$y)
  g_list[[i]] <- ggplot(data = data_i, aes(x, y)) +
    geom_point() +
    coord_fixed(xlim = new_lim$xlim, ylim = new_lim$ylim) 
}
grid.arrange(grobs = g_list, ncol = 2, respect=TRUE)

2. 中心调整图,每个图的 xy 比例都正确,但各图之间不一致。

我希望现在更清楚了。当我专注于当前问题而忘记了解释我们的需求所需的整个历史时,我的第一篇文章没有清楚地说明问题。

@Mark Peterson 的回答似乎解决了这个问题,我将进一步阅读代码来验证。

Thanks!

编辑:为了提供一些背景信息,我在此处添加了真实数据的绘图:

所有海鸥都在一个图中的概览图,请注意,有一些异常值拉伸了图

这是分面图,它对于对齐所有内容很有用。

这是每个比例都正确的单独图,未在图之间对齐。

这个图的每个图都以质心为中心。我打算同时放大它们。唯一的问题是各图的比例不一致。

编辑:我在我的数据上尝试了@Mark Peterson代码,它裁剪了一些点,但图是一致的。,可能是因为我的数据具有更大的值,所以原始填充不够大。

马克在每个图的所有图上使用最大 xrange,因此每个图都有相同的范围。我的代码尝试使每个绘图都适合其模式,但要将它们放置在具有一致比例的网格内,需要使用最大的画布缩小绘图,或填充最小的绘图。将每个图的范围设置为相同实际上具有类似的效果,但实现起来要简单得多。


好吧,我想我已经对你所问的问题得到了最好的猜测,尽管我同意@MrFlick 的观点,即明确共享数据将对此有很大帮助。

如果您在同一基本网格上拥有所有动物的简单数据,我猜您不会问(至少不会像您这样)。也就是说,给定这些数据:

set.seed(8675309)
df <-
  data.frame(
    x = runif(40, 1, 20)
    , y = runif(40, 100, 140)
    , ind = sample(LETTERS[1:4], 40, TRUE)
  )

这个简单明了facet_grid works:

ggplot(df , aes(x = x, y = y)) +
  geom_point() +
  facet_wrap(~ind) +
  coord_fixed()

给出这个:

但是,你这么说facet_wrap解决方案行不通。所以,我猜你有数据,其中每个动物都在不同的网格中,就像这样(注意,使用dplyr此处以及下面的更多内容):

modDF <-
  df %>%
  mutate(x = x + as.numeric(ind)*10
         , y = y + as.numeric(ind)*20)

这意味着上面的代码(使用modDF代替df)

ggplot(modDF, aes(x = x, y = y)) +
  geom_point() +
  facet_wrap(~ind) +
  coord_fixed()

给出这个:

它有大量浪费的空间,而且看起来不太好。所以我think您问的是如何处理这样的数据。为此,我认为您需要做的是计算最大范围(在每个轴上),然后生成以每个人的数据为中心的范围。为此,我严重依赖dplyr to group_by单独并计算最小和最大 x/y 位置。然后,我计算一些附加列来计算每个人的数据中点、范围的大小,然后范围应延伸到哪里以设置为所需的最大宽度/高度并以该人的数据为中心。请注意,我还稍微填充了这些,以便我可以设置expand = FALSE当我实施范围时。

getRanges <-
  modDF %>%
  group_by(ind) %>%
  summarise(
    minx = min(x)
    , maxx = max(x)
    , miny = min(y)
    , maxy = max(y)
  ) %>%
  mutate(
    # Find mid points for range setting
    midx = (maxx + minx)/2
    , midy = (maxy + miny)/2
    # Find size of all ranges
    , xrange = maxx - minx
    , yrange = maxy - miny
    # Set X lims the size of the biggest range, centered at the middle
    , xstart = midx - max(xrange)/2 - 0.5
    , xend = midx + max(xrange)/2 + 0.5
    # Set Y lims the size of the biggest range, centered at the middle
    , ystart = midy - max(yrange)/2 - 0.5
    , yend = midy + max(yrange)/2 + 0.5
    )

gives

     ind     minx     maxx     miny     maxy     midx     midy   xrange   yrange   xstart     xend   ystart     yend
  <fctr>    <dbl>    <dbl>    <dbl>    <dbl>    <dbl>    <dbl>    <dbl>    <dbl>    <dbl>    <dbl>    <dbl>    <dbl>
1      A 14.91873 29.53871 120.0743 157.6944 22.22872 138.8844 14.61997 37.62010 14.17717 30.28027 119.5743 158.1944
2      B 22.50432 37.27647 153.5654 179.0589 29.89039 166.3122 14.77215 25.49352 21.83884 37.94195 147.0021 185.6222
3      C 32.15187 47.08845 165.9829 195.0261 39.62016 180.5045 14.93658 29.04320 31.56861 47.67171 161.1945 199.8146
4      D 44.49392 59.59702 192.7243 214.5523 52.04547 203.6383 15.10310 21.82806 43.99392 60.09702 184.3283 222.9484

然后,我循环遍历每个人,生成所需的图并将范围设置为为该人计算的值。 (你可以使用ggtitle代替facet_wrap但我喜欢strip效果来自facet_wrap.)

sepPlots <- lapply(levels(modDF$ind), function(thisInd){
  thisRange <-
    filter(getRanges, ind == thisInd)

  modDF %>%
    filter(ind == thisInd) %>%
    ggplot(aes(x = x, y = y)) +
    geom_point() +
    coord_fixed(
      xlim = c(thisRange$xstart, thisRange$xend)
      , ylim = c(thisRange$ystart, thisRange$yend)
      , expand = FALSE
    ) +
    # ggtitle(thisInd)
    facet_wrap(~ind)
})

然后,我用plot_grid from cowplot将情节排列在一起。注意加载cowplot设定一个主题。所以,我正在重置主题,因为我不是这个主题的忠实粉丝cowplot

library(cowplot)
theme_set(theme_gray())

plot_grid(plotlist = sepPlots)

gives:

从那里,您可以根据需要使用比例和轴标签。

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

如何在具有不同画布大小的 ggplot2 绘图网格中保持一致的轴缩放 的相关文章

  • 将日期时间字符串转换为 Date 类

    我有一个带有日期时间字符列的数据框 当我使用as Date 除了少数实例之外 我的大多数字符串都被正确解析 下面的示例有望向您展示发生了什么 my attempt to parse the string to Date uses the s
  • R:如何找到向量的模式[重复]

    这个问题在这里已经有答案了 下面是我的data frame我想知道每个内存类别 1 到 8 的模式是什么 gt dput d structure list MEMORY1 c 5 5 7 1 5 6 4 5 4 5 5 4 1 5 5 2
  • matplotlib 中的 R 风格数据轴缓冲区

    R 绘图自动设置 x 和 y 限制 以在数据和轴之间留出一些空间 我想知道 matplotlib 是否有办法自动执行相同的操作 如果没有 是否有一个好的公式或 经验法则 来说明 R 如何设置其轴限制 在 matplotlib 中 您可以通过
  • stat_function 从函数生成平线

    我有以下代码 library ggplot2 f lt function x if x gt 2 1 x 0 3 else 0 graph lt ggplot data frame x c 0 10 aes x graph lt graph
  • ggplot 图例标签内的希腊字母、符号和换行符

    我在尝试着 有换行符 自动或强制 对齐文本 左对齐或左右对齐 有希腊字母和百分号 在 gglot 图例标签内 我尝试了几种方法 但我似乎无法将我读到的所有技巧结合起来 我可以通过插入来换行 n进入标签 但这似乎不适用于希腊字母 不适用于图例
  • 使用自定义渐变填充直方图箱

    我想在 R 和 ggplot2 中创建一个直方图 其中根据连续的 x 值填充箱 大多数教程仅通过离散值或密度 计数进行着色 下列的这个例子 https stackoverflow com questions 40284227 how to
  • R闪亮主面板显示样式和字体

    我正在学习闪亮的应用程序 并且有一些关于调整布局的基本问题 特别是样式和字体 希望得到指点或明确的答案 谢谢 考虑一个基本的输入输出应用程序 用户在 sidebarPanel 中输入数据 然后在 mainPanel 中反应性地输出结果 如何
  • R data.table 多个条件连接

    我设计了一种解决方案 用于从两个单独数据表的多个列中查找值 并添加基于新列的值计算 多个条件比较 代码如下 它涉及在计算两个表中的值时使用 data table 和联接 但是 这些表没有联接在我正在比较的列上 因此我怀疑我可能无法获得 da
  • 根据 row_number() 过滤 data.frame

    更新 自从提出这个问题以来 dplyr 已经更新 现在按照 OP 的要求执行 我正在尝试获取第二行到第七行data frame using dplyr 我正在这样做 require dplyr df lt data frame id 1 1
  • R参考类问题

    我正在尝试在 R 中创建一个简单的参考类 这是我的代码 R 初学者 MyClass lt setRefClass MyClass fields list a numeric b numeric methods list initialize
  • 如何从数据框中删除少于 5 个观察值的个体 [重复]

    这个问题在这里已经有答案了 为了澄清这个问题 我将简要描述数据 中的每一行data frame是一个观察值 列代表与该观察值相关的变量 包括 观察到什么个体 观察时间 观察地点等 我想排除 过滤观察值少于 5 个的个体 换句话说 如果 in
  • R data.table fwrite 到 fread 空间分隔符并清空

    我在使用 fread 以 作为分隔符和散布的空白值时遇到问题 例如 这个 dt lt data table 1 5 1 5 1 5 make a simple table dt 3 V2 NA add a blank in the midd
  • R data.table 1.9.2 关于 setkey 的问题

    这似乎是 1 8 10 后引入的一个错误 与包含列表的 DT 的 setkey 相关 运行下面两个代码来查看问题 library data table dtl lt list dtl 1 lt data table scenario 1 p
  • R 多元一步预测和准确性

    我想使用 R 来比较两个预测模型的 RMSE 均方根误差 第一个模型使用 1966 年至 2000 年的估计值来预测 2001 年 然后使用 1966 年至 2001 年的估计值来预测 2002 年 依此类推直至 2015 年 第二个模型使
  • 使用 ggplot 构面时增加闪亮的绘图大小

    有没有办法增加绘图窗口的大小shiny取决于在一个中使用的面的数量ggplot图 也许使用垂直滚动 例如 使用下面的示例 当输入为 A 有三个方面 情节看起来不错 当选项 B 选择绘图数量会增加 但绘图窗口保持相同大小 导致绘图太小 是否有
  • 在 igraph 中为社区分配颜色

    我在 igraph 中使用 fastgreedy community 检测算法在 R 中生成社区 代码返回 12 个社区 但是在绘图时很难识别它们 因为它返回的图的颜色数量有限 我怎样才能用十二种不同的颜色绘制这个图表 l2 lt layo
  • 更快的 %in% 运算符

    The 快速匹配 https cran r project org web packages fastmatch index html包实现了更快的版本match对于重复匹配 例如在循环中 set seed 1 library fastma
  • 读取R中打开的Excel文件

    有没有办法将打开的Excel文件读入R 当Excel中打开一个excel文件时 Excel会对文件加锁 比如R中的read方法无法访问该文件 你能绕过这个锁吗 Thanks 编辑 这发生在带有原始 Excel 的 Windows 下 发生错
  • 从 R 中的方差分析 (glm) 中提取残余偏差

    我在 R 中安装了一个 glm 模型并采用了方差分析表 我需要提取 残余偏差 列 但它会产生错误 以下是代码 创建数据 counts lt c 18 17 15 20 10 20 25 13 12 outcome lt gl 3 1 9 t
  • 通过使用 navbarPanel() 并隐藏导航栏构建多页闪亮应用程序用户端(在 ui.R 中)?

    我想构建一个多页闪亮应用程序 我可以在其中控制用户可以看到哪个页面 迪安 阿塔利确实这个演示应用程序中有类似的东西 https github com daattali advanced shiny tree master multiple

随机推荐

  • 我们可以提高java中垃圾收集线程的优先级吗

    正如我们所知 在 java 中 线程有优先级 而垃圾收集器是优先级最低的线程 所以我想知道对于特定的 java 应用程序 我们是否可以使其垃圾收集器具有更高的优先级 以便可以增加该应用程序的内存管理 有很多命令行开关决定 Sun JVM 中
  • 架构:API 作为网站和移动应用程序的核心

    我对完整的架构理念有不同的问题 我希望有丰富经验的人可以帮助我 因为我几乎陷入了所有可能性之中 我正计划重写一个社区网站 我们的客户希望将来使用本机移动应用程序 所以我需要考虑到这一点 因此 我决定创建一个基于 PHP 框架 Kohana
  • 为什么 Final 字典不能用作 TypedDict 中的文字?

    我正在尝试完成以下任务 请参阅 from typing import TypedDict Final account schema Final name str email str Account TypedDict Account acc
  • $.mobile.activePage 属性到底是如何工作的?

    我正在尝试如下 document bind pageshow function e data console log page spots console log mobile activePage if mobile activePage
  • Flask框架:MVC模式

    Flask框架天然支持MVC模式吗 我应该将应用程序的哪些部分视为模型 什么部分视为视图 什么部分视为控制器 通常 根据我的经验 Flask 应用程序如下所示 main dir app1 init py api py models py s
  • 使用 ServicePointManager 固定 Xamarin SSL/TLS

    我们正在使用 Xamarin 开发一款移动应用程序 最初将在 Android 和 iOS 上运行 并计划将来移植到 Windows Phone 如果使用它的 3 个人尖叫得足够大声的话 正在传输的数据的性质以及该应用程序将允许的操作 SSO
  • ServiceMix 中 Apache-Camel 路由的管理和监控

    作为 Camel 和 ServiceMix 的用户 我经常需要监控这些工具以进行开发 我主要使用 JConsole 从 ServiceMix 和 Camel 访问 MBean 它为 ESB 开发人员提供了一些非常有用的指标 我还使用 kar
  • 两种长宽比的两种布局(4:3 和 16:9) - 自动更改

    下列的Microsoft 规模指南 http msdn microsoft com en us library windows apps hh780612 aspx有一部分说 设计固定布局时 首先为基线分辨率设计布局 1024x768 和
  • Webpack 提供了一个数组作为配置

    在这个 webpack 入门套件中https github com webpack react starter https github com webpack react starter我看到 webpack production con
  • 按标准从 pandas 数据框(或 numpy ndarray?)中选择

    我发现自己正在编写这种模式a lot tmp
  • 成功后动态改变EndDialog中的RTF内容

    多亏了这个question https stackoverflow com a 33679439 1076116 我能够执行自定义操作来临时更新和动态修改 MSI 数据库 简而言之 我正在做 CustomAction public stat
  • 使用参数作为用户定义变量?

    我们在非 GUI 模式下运行测试 并传入各种参数 如服务器 端口 线程等 我们还希望在 GUI 模式下运行测试 并能够在 GUI 中更改这些参数 我想做的是使用 2 个用户定义的变量对象 其中一个包含我们可以编辑的静态数据 另一个包含参数
  • 返回结构体数组还是结构体指针数组?

    如果您需要退回struct从函数中 您通常会返回一个指向struct反而 如果您想返回结构数组 建议 返回结构体数组 指向第一个元素的指针 或者返回一个结构体指针数组 我为以下两个选项画了一个图表 1 2 给出以下结构定义 struct v
  • 小型 ARM 微控制器的 RTOS 内核之间的可量化差异 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 有许多不同的 RTOS 可用于微控制器 我专门寻找支持 ARM Cortex M 处理器的 RTOS 另外 我对闭源解决方案不感兴趣 试图从网站
  • 离线、跨选项卡通信(仅限 JavaScript)

    是否可以找到某些网站的国外实例 Ofc 这些是独立打开的选项卡 不是通过 window open 我需要阻止用户打开 2 个选项卡 并向之前打开的选项卡发送消息以告知无法打开 2 个选项卡 2个独立的选项卡可能会破坏页面离线存储和webSQ
  • GLubyte 与 GLshort 指数

    查看 OpenGL 中顶点数组的文档 我发现用于索引的两种最常见的内存类型是 GLubyte GL UNSIGNED BYTE 和 GLshort GL SHORT 我想知道使用两者作为索引是否有任何实际区别 谢谢 龙鹩莺 GL UNSIG
  • iOS 中键盘出现时将 UIView 向上移动

    我有一个 UIView 它不在 UIScrollView 内 我想在键盘出现时向上移动我的视图 在我尝试使用此解决方案之前 当键盘存在时 如何使 UITextField 向上移动 https stackoverflow com questi
  • 如何在 Swift 中优雅地检查 .first(where:) 闭包中的 case 枚举?

    假设我有这个枚举 enum Item case foo String case bar String 以及它的列表 let items Item foo aa bar bb 我想找到first foo其中的一项 这就是我所做的 items
  • SignTool.exe 偶尔会失败,退出代码为 1

    作为构建系统的一部分 我们使用带有证书的 Signtool exe 在构建二进制文件后对其进行签名 偶尔 很难说什么时候会发作 签名失败 error MSB3073 The command C Program Files Microsoft
  • 如何在具有不同画布大小的 ggplot2 绘图网格中保持一致的轴缩放

    编辑 清除描述和代码示例 添加绘图 我有一个数据集 其中包含几种动物的位置 我为每只动物创建了位置散点图网格 因为图的 x y 是距离 所以我想使每个图本身的 x y 保持相同的比例 因此距离没有失真 和跨图 这样我可以比较具有相同比例的不