结合具有高度可变宽度的绘图图

时间:2018-05-12 00:46:39

标签: r ggplot2 plotly subplot gridextra

我希望使用R' s plotly组合多个heatmap plotly subplot,并使用先验定义的宽度每个subplot,这些宽度变化很大,因为它们反映了我数据的实际比例。

这是一个示例数据集:

library(dplyr)
library(plotly)
library(grDevices)

set.seed(1)
df <- data.frame(row = rep(paste0("rid",1:100),10),
                 col = paste0("cid",unlist(lapply(1:10,function(x) rep(x,100)))),
                 val = rnorm(1000,-2,1))

这里我生成了一个图表列表:

plot.list <- lapply(1:10,function(i) plot_ly(z=c(dplyr::filter(df,col == paste0("cid",i))$val),x=dplyr::filter(df,col == paste0("cid",i))$col,y=dplyr::filter(df,col == paste0("cid",i))$row,
                                  colors=colorRamp(c("darkblue","lightgray","darkred")),type="heatmap") %>%
  layout(yaxis=list(title=NULL),xaxis=list(tickvals=i,ticktext=as.character(i))))

以下是绘图宽度:

plot.widths <- c(0.33277,0.0663,0.28308,0.09323,0.12969,0.0603,0.00651,0.01149,0.01503,0.0016)

显然,它们总计为1。

如果我试试这个:

subplot(plot.list,shareX=T,shareY=T,nrows=1,margin=0.001,widths=plot.widths) %>% layout(showlegend=F)

我得到: enter image description here

我意识到小于0.015的绘图宽度会导致这种情况。

现在,我的快速修复方法是放大低于0.015的绘图宽度,并向下按比例缩小0.015以上的绘图宽度,使最小绘图宽度为0.015,它们仍然总和为1

像这样:

below.cutoff.widths <- which(plot.widths < 0.015)
if(length(below.cutoff.widths) > 0){
  scale.up.factor <- 0.015/min(plot.widths[below.cutoff.widths])
  scale.down.factor <- sum(plot.widths[-below.cutoff.widths])/(1-sum(scale.up.factor*(plot.widths[below.cutoff.widths])))
  plot.widths[-below.cutoff.widths] <- plot.widths[-below.cutoff.widths]/scale.down.factor
  plot.widths[below.cutoff.widths] <- plot.widths[below.cutoff.widths]*scale.up.factor
  plot.widths <- plot.widths-.Machine$double.eps
}

哪个有效并且给出: enter image description here

问题在于,在上面的例子中,这显着扭曲了原始宽度,因此扭曲了我试图用这个图表传达的信息。

知道如何更好地处理这个问题吗?

我认为没有办法简单地将plot.list的{​​{1}}个对象转换为plotly个对象并使用ggplot &#39; gridExtra将他们安排在一个网格上?

0 个答案:

没有答案