我希望使用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)
我意识到小于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
}
问题在于,在上面的例子中,这显着扭曲了原始宽度,因此扭曲了我试图用这个图表传达的信息。
知道如何更好地处理这个问题吗?
我认为没有办法简单地将plot.list
的{{1}}个对象转换为plotly
个对象并使用ggplot
&#39; gridExtra
将他们安排在一个网格上?