Я хочу объединить несколько R
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
's plotly
объекты для ggplot
объектов и использование gridExtra
s arrangeGrob
, чтобы расположить их вместе на сетке?