用子图循环遍历R Plotly并隐藏除一个以外的所有图例

我需要遍历i个因子的迭代,并且每个因子需要在子图中绘制为一个图。我想做的是在第一个迭代栏中隐藏图例,然后使用legendgroup将所有图例捆绑在一起。这是我到目前为止所做的:

library(plotly)
library(dplyr)

mtcars %>%
  mutate(vs = as.factor(vs)) %>%
  group_split(cyl) %>%
  lapply(function(i) {

    #show.legend <- ifelse(i == 1,TRUE,FALSE)

    show.legend <- if(i == 1) {TRUE} else {FALSE}

    plot_ly(
      data = i,x = ~gear,y = ~mpg,color = ~vs,type = "bar",legendgroup = ~vs
    ) %>%
      layout(
        barmode = "stack",showlegend = show.legend
      )
  }) %>%
  subplot(
    nrows = NROW(.),shareX = TRUE,shareY = TRUE,titleX = TRUE,titleY = TRUE,margin = 0.05
  )

但这会产生错误并且没有图例:

Warning messages:
1: In if (i == 1) { :
  the condition has length > 1 and only the first element will be used

如果我使用show.legend <- ifelse(i == 1,FALSE)(上面已注释),我会得到多个图例,而不仅仅是一次。

我知道我可以执行以下操作,但是我需要循环执行此操作。

p1 <- plot_ly(blah,showlegend = TRUE)
p2 <- plot_ly(blah,showlegend = FALSE)
P3 <- plot_ly(blah,showlegend = FALSE)

subplot(p1,p2,p3)

我认为我没有正确调用i迭代。作为另一种选择,我尝试了case_when

show.legend <- case_when(
      i == 1 ~ TRUE,i != 1 ~ FALSE
    )

但是,它产生的结果与ifelse相同。

eywe0686 回答:用子图循环遍历R Plotly并隐藏除一个以外的所有图例

您的代码中有两个问题:

  1. i不是1:3,而是您通过lapply进行迭代的当前小技巧(请参见下面的seq_along)。 这就是为什么您得到警告的原因:
  

如果if(i == 1){:条件的长度> 1,并且只有第一个   元素将被使用

  1. showlegend必须成为plot_ly而不是layout的参数,因为子图始终采用其图的 one 中的layout。参见?subplot及其自变量which_layout
  在绘图序列的后面找到的

布局选项将被覆盖   序列中较早的选项


这就是我想你所追求的:

library(plotly)
library(dplyr)

tibble_list <- mtcars %>%
  mutate(vs = as.factor(vs)) %>%
  group_split(cyl)

lapply(seq_along(tibble_list),function(i) {
  show_legend <- if (i == 1) {TRUE} else {FALSE}
  plot_ly(
    data = tibble_list[[i]],x = ~ gear,y = ~ mpg,color = ~ vs,type = "bar",legendgroup = ~ vs,showlegend = show_legend
  ) %>% layout(barmode = "stack")
}) %>% subplot(
  nrows = NROW(.),shareX = TRUE,shareY = TRUE,titleX = TRUE,titleY = TRUE,margin = 0.05,which_layout = 1
)

Result

请找到一个官方示例here

,
library(plotly)
library(dplyr)

    ## store plot as variable p
        p <- mtcars %>%
            mutate(vs = as.factor(vs)) %>%
            group_split(cyl) %>%
            lapply(function(i) {
                plot_ly(
                    data = i,x = ~gear,y = ~mpg,color = ~vs,showlegend = TRUE ## include all legends in stored variable
                ) %>%
                    layout(
                        barmode = "stack"
                    )
            }) %>%
            subplot(
                nrows = NROW(.),margin = 0.05
            )
    ## remove unwanted legends from plot
        for (i in seq(3,length(p[["x"]][["data"]]))) {
            p[["x"]][["data"]][[i]][["showlegend"]] <- FALSE
        }
    ## show plot
        p

enter image description here

本文链接:https://www.f2er.com/3076341.html

大家都在问