从ggplotly转换为facet时,如何使用相同大小的绘图子图?

时间:2017-08-15 15:59:48

标签: r ggplot2 plotly

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()

0 个答案:

没有答案