Вертикально расчесывать несколько баров - PullRequest
5 голосов
/ 11 апреля 2019

Я пытаюсь использовать вертикальную группировку гистограмм, разделяя их оси X.

Я думал об использовании R plotly subplot для этого, но столкнулся сПроблема Я надеюсь, что у кого-то здесь может быть решение для.

Вот примеры данных, в которых есть 28 групп, где я создаю гистограмму по 4 семействам в каждой группе, а затем пытаюсь объединить их по вертикали, используя plotly::subplot:

set.seed(1)
df <- data.frame(group = paste0("G",unlist(lapply(1:28,function(i) rep(i,4)))),
                 family = paste0("F",rep(1:4,28)),
                 log2n = log2(as.integer(runif(4*28,0,30))+1),
                 stringsAsFactors = F)

Создание списка графиков баров:

library(plotly)
library(dplyr)

groups <- unique(df$group)
y.range <- c(0,max(df$log2n))
plot.list <- lapply(1:length(groups),function(g){
  group.df <- dplyr::filter(df,group == groups[g])
  plot_ly(x=group.df$family,y=group.df$log2n,type='bar',name=group.df$family,color=group.df$family,showlegend=(g==length(groups))) %>%
    layout(yaxis=list(range=y.range))
})

Если я попытаюсь:

plotly::subplot(plot.list,shareX=T,nrows=length(plot.list))

Я получу: enter image description here

Так что это похоже на какое-то переполнение.

Я постепенно сокращаю количество графиков в plot.list, на которых я запускаю subplot, и когда я достиг 19, это казалосьостановить «переполнение»:

plotly::subplot(plot.list[1:19],shareX=T,nrows=19) 

enter image description here

Есть идеи, если есть надежда получить все 28 барных графиков без переполнения?

Спасибомного

1 Ответ

1 голос
/ 11 апреля 2019

Я бы сгенерировал цифру с ggplot, а затем преобразовал бы ее в plotly (или сохранил как файл изображения) с аргументами правильного размера.

library(plotly)
library(tidyverse)

g <- ggplot(df, 
       aes(x = family, y = log2n, fill = family)) +
    geom_bar(stat = 'identity') +
    facet_wrap(~group, ncol = 1) +  
    theme_minimal() + 
    theme(legend.position = "none") 

ggsave(g, file = "temp.png", width = 4, height = 40)
ggplotly(g, width = 400, height = 4000)
...