- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 R 和 Rstudio 中工作,使用通常很棒的 ggarrange() 安排一组相当复杂的图,但这次我遇到了一个持续存在的问题,它似乎很容易重现并且可能是一个错误?
library(ggplot2)
library(egg)
datar <- data.frame(cbind(xxx = c(1,4,6,7,9,7,6,5,4,3,2,4,5,6),
yyy = c(6,8,9,0,6,5,4,3,6,7,5,9,6,2)))
ggarrange(
ggplot(datar, aes(xxx, yyy))+geom_point(),
ggplot(datar, aes(xxx, yyy))+geom_point(),
ggplot(datar, aes(xxx, yyy))+geom_point(),
ggplot(datar, aes(xxx, yyy))+geom_point(),
ggplot(datar, aes(xxx, yyy))+geom_point(),
ggplot(datar, aes(xxx, yyy))+geom_point(),
ncol = 2,
widths = c(1,2)
)
这会产生以下错误:
Error in unit.c(sum(left$widths), width, sum(right$widths)) : it is invalid to combine 'unit' objects with other types
如果您删除两个图(将图变成 2x2 矩阵),则不会发生这种情况。此外,这种模式似乎在扩大;如果我在 3x3 矩阵 (ncol = 3, widths = c(1,2,3)) 中运行 9 个图,它会工作,但如果我再添加 3 个图(如在 3x4 矩阵中),我会再次收到相同的错误消息.
这是一个错误吗?它有修复吗?有解决方法吗?
最佳答案
绝对是一个错误。尝试以下似乎有效的替换,
ggarrange <- function(..., plots = list(...), nrow = NULL, ncol = NULL, widths = NULL,
heights = NULL, byrow = TRUE, top = NULL, bottom = NULL, left = NULL, right = NULL,
padding = unit(0.5, "line"), clip = "on", draw = TRUE, newpage = TRUE, debug = FALSE,
labels = NULL, label.args = list(gp = grid::gpar(font = 4, cex = 1.2))) {
n <- length(plots)
grobs <- lapply(plots, ggplot2::ggplotGrob)
## logic for the layout if nrow/ncol supplied, honour this if not, use length of
## widths/heights, if supplied if nothing supplied, work out sensible defaults
## nothing to be done but check inconsistency
if (!is.null(ncol) && !is.null(widths)) {
stopifnot(length(widths) == ncol)
}
if (!is.null(nrow) && !is.null(heights)) {
stopifnot(length(heights) == nrow)
}
## use widths/heights if supplied
if (is.null(ncol) && !is.null(widths)) {
ncol <- length(widths)
}
if (is.null(nrow) && !is.null(heights)) {
nrow <- length(heights)
}
## work out the missing one
if (is.null(nrow) && !is.null(ncol)) {
nrow <- ceiling(n/ncol)
}
if (is.null(ncol) && !is.null(nrow)) {
ncol <- ceiling(n/nrow)
}
## it may happen that sufficient info was passed, but incompatible with number of grobs
## (fewer cells)
stopifnot(nrow * ncol >= n)
## last case: nothing exists
if (is.null(nrow) && is.null(ncol) && is.null(widths) && is.null(heights)) {
nm <- grDevices::n2mfrow(n)
nrow <- nm[1]
ncol <- nm[2]
}
if (n%/%nrow) {
# trouble, we need to add dummy grobs to fill the layout
grobs <- c(grobs, rep(list(.dummy_gtable), nrow * ncol - n))
# add dummy labels if needed
if ((!is.null(labels)) && (length(labels) != nrow * ncol)) {
labels <- c(labels, rep("", nrow * ncol - length(labels)))
}
}
## case numeric
if (is.numeric(widths) && !inherits(widths, "unit")) {
widths <- lapply(widths, unit, "null")
}
if (is.numeric(heights) && !inherits(heights, "unit")) {
heights <- lapply(heights, unit, "null")
}
## sizes
if (is.null(widths))
widths <- lapply(rep(1, n), unit, "null")
if (is.null(heights))
heights <- lapply(rep(1, n), unit, "null")
# user may naively have passed grid units, but only unit.list units work well with `[`
# so convert to this class
if (grid::is.unit(widths))
widths <- as.unit.list(widths)
if (grid::is.unit(heights))
widths <- as.unit.list(heights)
# indexing is problematic, wrap in list
if (grid::is.unit(widths) && length(widths) == 1) {
widths <- list(widths)
}
if (grid::is.unit(heights) && length(heights) == 1) {
heights <- list(heights)
}
## split the list into rows/cols
nrc <- if (byrow)
nrow else ncol
if (nrc == 1) {
splits <- rep(1, n)
} else {
seqgrobs <- seq_along(grobs)
splits <- cut(seqgrobs, nrc, labels = seq_len(nrc))
## widths and heights refer to the layout repeat for corresponding grobs
repw <- rep_len(seq_along(widths), length.out=n)
reph <- rep_len(seq_along(heights), length.out=n)
widths <- c(matrix(widths[repw], ncol = nrc, byrow = !byrow))
heights <- c(matrix(heights[reph], ncol = nrc, byrow = byrow))
}
fg <- mapply(gtable_frame, g = grobs, width = widths, height = heights, MoreArgs = list(debug = debug),
SIMPLIFY = FALSE)
if (!is.null(labels)) {
stopifnot(length(labels) == length(fg))
# make grobs
labels <- do.call(label_grid, c(list(labels), label.args))
# add each grob to the whole gtable
fg <- mapply(function(g, l) {
gtable::gtable_add_grob(g, l, t = 1, l = 1, b = nrow(g), r = ncol(g), z = Inf,
clip = "off", name = "label")
}, g = fg, l = labels, SIMPLIFY = FALSE)
}
spl <- split(fg, splits)
if (byrow) {
rows <- lapply(spl, function(.r) do.call(gridExtra::gtable_cbind, .r))
gt <- do.call(gridExtra::gtable_rbind, rows)
} else {
# fill colwise
cols <- lapply(spl, function(.c) do.call(gridExtra::gtable_rbind, .c))
gt <- do.call(gridExtra::gtable_cbind, cols)
}
## titles given as strings are converted to text grobs
if (is.character(top)) {
top <- textGrob(top)
}
if (is.grob(top)) {
h <- grobHeight(top) + padding
gt <- gtable_add_rows(gt, heights = h, 0)
gt <- gtable_add_grob(gt, top, t = 1, l = 1, r = ncol(gt), z = Inf, clip = clip)
}
if (is.character(bottom)) {
bottom <- textGrob(bottom)
}
if (is.grob(bottom)) {
h <- grobHeight(bottom) + padding
gt <- gtable_add_rows(gt, heights = h, -1)
gt <- gtable_add_grob(gt, bottom, t = nrow(gt), l = 1, r = ncol(gt), z = Inf, clip = clip)
}
if (is.character(left)) {
left <- textGrob(left, rot = 90)
}
if (is.grob(left)) {
w <- grobWidth(left) + padding
gt <- gtable_add_cols(gt, widths = w, 0)
gt <- gtable_add_grob(gt, left, t = 1, b = nrow(gt), l = 1, r = 1, z = Inf, clip = clip)
}
if (is.character(right)) {
right <- textGrob(right, rot = -90)
}
if (is.grob(right)) {
w <- grobWidth(right) + padding
gt <- gtable_add_cols(gt, widths = w, -1)
gt <- gtable_add_grob(gt, right, t = 1, b = nrow(gt), l = ncol(gt), r = ncol(gt),
z = Inf, clip = clip)
}
if (draw) {
if (newpage)
grid.newpage()
grid.draw(gt)
}
class(gt) <- c("egg", class(gt))
invisible(gt) # return the full gtable
}
关于r - 在 ggarrange() 中设置高图表格的宽度 - 可能的错误? (R,ggplot,鸡蛋),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54559337/
这个问题已经有答案了: Is there any way to accept only numeric values in a JTextField? (20 个回答) It's possible i
我使用戴尔 XPS M1710。笔记本电脑的盖子、侧面扬声器和前置扬声器都有灯(3 组灯可以单独调节)和鼠标垫下方的灯。在 BIOS 中,我可以更改这些灯的颜色,至少是每个组。另外,我可以在鼠标垫下打
我知道我可以使用 在 iOS 5 中打开设置应用 [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"prefs://"
我有一个 Django 应用程序,我正在尝试为其设置文档。目录结构如下: - doc - project | - manage.py 我已经设置了路径以便 Sphinx 可以看到东西,但是当我尝试使用
我正在使用 768mb ram 运行 centos 5.5。我一直在日志中获取 server reached MaxClients setting, consider raising the MaxC
我在具有以下配置的服务器内运行了 Drupal 安装: StartServers 5 MinSpareServers 5 MaxSpareServers 15 MaxClien
是否可以使用 Microsoft.Web.Administration 包为给定的 location 配置 asp 设置? 我想以编程方式将以下部分添加到本地 IIS applicationHost.
我一直在阅读为 kube-proxy 提供参数的文档,但没有解释应该如何使用这些参数。我使用 az aks create 创建我的集群使用 azure-cli 程序,然后我获得凭据并使用 kubect
我想知道与在 PHP 中使用 setcookie() 函数相比,在客户端通过 JavaScript 设置一些 cookie 是否有任何明显的优势?我能想到的唯一原因是减少一些网络流量(第一次)。但不是
我有一个按钮可以将 body class 设置为 .blackout 我正在使用 js-cookie设置cookie,下面的代码与我的按钮相关联。 $('#boToggle').on('click'
我有一堆自定义的 HTML div。我将其中的 3 存储在具有 slide 类的 div 中。然后,我使用该幻灯片类调用 slick 函数并应用如下设置: $('.slide').slick({
我正在创建一个应该在 Windows 8(桌面)上运行的应用 我需要: 允许用户使用我的应用启动“文件历史记录”。我需要找到打开“文件历史记录”的命令行。 我需要能够显示“文件历史记录”的当前设置。
我刚买了一台新的 MacBook Pro,并尝试在系统中设置 RVM。我安装了 RVM 并将默认设置为 ➜ rvm list default Default Ruby (for new shells)
由于有关 Firestore 中时间戳行为即将发生变化的警告,我正在尝试更改我的应用的初始化代码。 The behavior for Date objects stored in Firestore
在 ICS 中,网络 -> 数据使用设置屏幕中现在有“限制后台数据”设置。 有没有办法以编程方式为我的应用程序设置“限制后台数据”? 或 有没有办法为我的应用程序调出具有选项的“数据使用”设置? 最佳
我正在尝试使用 NextJS 应用程序设置 Jest,目前在 jest.config.js : module.exports = { testPathIgnorePatterns: ["/.n
我最近升级到 FlashDevelop 4,这当然已经将我之前的所有设置恢复到原来的状态。 我遇到的问题是我无法在新设置窗口的哪个位置找到关闭它在方括号、大括号等之前插入的自动空格的选项。 即它会自动
有没有办法以编程方式访问 iPhone/iPod touch 设置? 谢谢。比兰奇 最佳答案 大多数用户设置可以通过读取存储在 /User/Library/Preferences/ 中的属性列表来访问
删除某些值时,我需要选择哪些设置来维护有序队列。我创建了带有自动增量和主键的 id 的表。当我第一次插入值时,没问题。就像 1,2,3,4,5... 当删除某些值时,顺序会发生变化,例如 1,5,3.
我正在尝试设置示例 Symfony2 项目,如此处所示 http://symfony.com/doc/current/quick_tour/the_big_picture.html 在访问 confi
我是一名优秀的程序员,十分优秀!