plotly subplot for for loop создает график из последнего цикла - PullRequest
0 голосов
/ 08 ноября 2019

Я учусь создавать график, аналогичный тому, который был создан ggplot, насколько это возможно, используя plotly, используя следующий скрипт:

library(dplyr)
library(ggplot2)
library(plotly);library(RColorBrewer)
library(tidyr)

set.seed(1)

data.df.st00 <- iris %>%
  as_tibble %>%
  mutate(year=sample(2014:2018,size = n(),replace = TRUE)) %>%
  mutate(sex=sample(c('F','M'),size = n(),replace = TRUE)) %>%
  mutate(origin=sample(c('Community','Hospital'),size = n(),replace = TRUE))

data.df.st01 <- data.df.st00 %>%
  group_by(year,sex,origin) %>%
  count(Species) %>%
  ungroup

data.df.st02 <- data.df.st01 %>%
  # mutate(Species= forcats::fct_rev(Species)) %>%
  mutate(variable=paste0(origin,'-',sex)) %>%
  select(-origin,-sex) %>%
  spread(.,key = variable,value = n,fill = as.integer(0))

combn.df <- data.df.st01 %>%
  distinct(origin,sex) %>%
  mutate(variable=paste0(origin,'-',sex))

for (loop in 1:nrow(combn.df)) {
  temp.chart.subplot <- data.df.st02 %>%
    plot_ly(type='bar',
            x=~year,
            y=~get(combn.df$variable[loop]), 
            color=~Species,
            colors=(brewer.pal(length(fill.list),'Set2')),
            legendgroup=~Species,
            showlegend=(loop==1)) %>%
    layout(yaxis = list(title='n'), barmode = 'stack')

  assign(paste0('chart.plotly.',loop),temp.chart.subplot)
}

chart.plotly.final <- subplot(chart.plotly.1,
                              chart.plotly.2,
                              chart.plotly.3,
                              chart.plotly.4,
                              nrows = 2,
                              shareY = TRUE,shareX = TRUE) %>%
  layout(legend = list(x=1.02,y=0.5),
         annotations = list(x=1.165,y=0.625,xref='paper',yref='paper',text='Species',showarrow=FALSE))

chart.plotly.final

Мой объект chart.plotly.final - это субплот, содержащий chart.plotly.1 to 4, но chart.plotly.final дает подзаговор, содержащий 4 копии chart.plotly.4, а это не то, что я ожидаю.

Что я сделал не так? Спасибо!

1 Ответ

0 голосов
/ 08 ноября 2019

Я не знаю, в чем была ошибка в вашем коде, но, похоже, это решает проблему:

library("dplyr")
library("ggplot2")
library("plotly")
library("RColorBrewer")
library("tidyr")

set.seed(1)

data.df.st00 <- iris %>%
  as_tibble %>%
  mutate(year=sample(2014:2018,size = n(),replace = TRUE)) %>%
  mutate(sex=sample(c('F','M'),size = n(),replace = TRUE)) %>%
  mutate(origin=sample(c('Community','Hospital'),size = n(),replace = TRUE))

data.df.st01 <- data.df.st00 %>%
  group_by(year,sex,origin) %>%
  count(Species) %>%
  ungroup

data.df.st02 <- data.df.st01 %>%
  # mutate(Species= forcats::fct_rev(Species)) %>%
  mutate(variable=paste0(origin,'-',sex)) %>%
  select(-origin,-sex) %>%
  spread(.,key = variable,value = n,fill = as.integer(0))

combn.df <- data.df.st01 %>%
  distinct(origin,sex) %>%
  mutate(variable=paste0(origin,'-',sex))

plots <- lapply(seq_len(nrow(combn.df)), function(i) {
  data.df.st02 %>%
    plot_ly(type='bar',
            x=~year,
            y=~get(combn.df$variable[i]), 
            color=~Species,
            legendgroup=~Species,
            showlegend=(i==1)) %>%
    layout(yaxis = list(title='n'), barmode = 'stack')
})

chart.plotly.final <- subplot(plots,
                              nrows = 2,
                              shareY = TRUE,shareX = TRUE) %>%
  layout(legend = list(x=1.02,y=0.5),
         annotations = list(x=1.165,y=0.625,xref='paper',yref='paper',text='Species',showarrow=FALSE))

chart.plotly.final
...