在ggplot2
中,我认为facets(子图)的大小都相同。我认为这对于在子图之间进行比较非常重要。但是,当我使用ggplotly()
将我的绘图转换为绘图对象时,子绘图的大小并不总是相同。特别是,行似乎是不同的高度。我不确定这是ggplotly()
的预期功能,错误,还是我的用户错误。我正在使用ggplot2版本2.2.1.9000并使用4.7.1。
如何在确保子图大小相同的同时将ggplots转换为图形对象?
注意:我最初在使用Shiny和plotly的背景下发布了这个问题。但是,这个问题似乎与Shiny无关,所以我删除了原来的问题并重新发布。
在下面的示例中,当我使用facet_wrap(sex ~ day)
时,第二行略短于顶行和底行。当我使用facet_grid(sex ~ day)
时,行的高度相等。当我使用facet_grid(sex ~ day)
时,两个中间行略短。
library(plotly)
library(reshape2)
# An example plot
myPlot <- ggplot(tips, aes(x = total_bill, y = tip / total_bill)) +
geom_point(shape = 1)
# Facet wrap with sex ~ day
pWrap <- myPlot + facet_wrap(sex ~ day)
qWrap <- ggplotly(pWrap)
q <- qWrap
d <- rbind(q$x$layout$yaxis4$domain, q$x$layout$yaxis3$domain, q$x$layout$yaxis2$domain, q$x$layout$yaxis$domain)
dfWrap <- data.frame(lb = d[,1], ub = d[,2])
dfWrap["range"] <- dfWrap["ub"] - dfWrap["lb"]
dfWrap["facetType"] <- "facet_wrap(sex ~ day)"
# Facet grid with sex ~ day
pGrid1 <- myPlot + facet_grid(sex ~ day)
qGrid1 <- ggplotly(pGrid1)
q <- qGrid1
d <- rbind(q$x$layout$yaxis4$domain, q$x$layout$yaxis3$domain, q$x$layout$yaxis2$domain, q$x$layout$yaxis$domain)
dfGrid1 <- data.frame(lb = d[,1], ub = d[,2])
dfGrid1["range"] <- dfGrid1["ub"] - dfGrid1["lb"]
dfGrid1["facetType"] <- "facet_grid(sex ~ day)"
# Facet grid with day ~ sex
pGrid2 <- myPlot + facet_grid(day ~ sex)
qGrid2 <- ggplotly(pGrid2)
q <- qGrid2
d <- rbind(q$x$layout$yaxis4$domain, q$x$layout$yaxis3$domain, q$x$layout$yaxis2$domain, q$x$layout$yaxis$domain)
dfGrid2 <- data.frame(lb = d[,1], ub = d[,2])
dfGrid2["range"] <- dfGrid2["ub"] - dfGrid2["lb"]
dfGrid2["facetType"] <- "facet_grid(day ~ sex)"
经过多次挖掘后,我发现情节使用get_domains()
函数来定义布局。在这个函数内部有一条线来定义图的高度
ys[[i]] <- c(ystart = 1 - (heights[j]) - if (j == 1) 0 else margins[3],
yend = 1 - (heights[j + 1]) + if (j == nrows) 0 else margins[4])
使得顶部和底部行高于边缘的宽度。看起来边距不仅包括面板之间的间距(panel.spacing
),还包括轴标签,刻度,面板标题等的空间。因此,我们可以找到一个与{{1}合理良好的测试用例}但完全失败了ggplot()
ggplotly()