Объединение сюжетных графиков с сильно изменяющейся шириной - PullRequest
0 голосов
/ 12 мая 2018

Я хочу объединить несколько 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)

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

...