r - 使用子图循环遍历 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, TRUE, 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 相同的结果。
解决方案
您的代码中有两个问题:
i
不是1:3
,而是您正在通过 lapply 迭代的当前 tibble(见seq_along
下文)。这就是您收到警告的原因:
在 if (i == 1) { :条件长度 > 1 并且只使用第一个元素
showlegend
需要成为plot_ly
不这样做的论据,layout
因为 subplot 总是采用它的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
)
请在此处找到一个官方示例。
推荐阅读
- javascript - 嵌入式 gist 脚本和样式
- java - JPA 引用不正确
- python - 如何重命名csv中的“未命名:0”列?
- java - 如何单击视口外的元素?
- aframe - HTC Vive Focus 3 A-Frame 1.2.0 中的控制器错位
- node.js - 使用 formData 在前端追加数据时在 req.body 上获取空对象
- excel - Excel中的Base64编码数据列
- blazor - 如何在代码中获取对西装外套控件的引用
- python-3.x - 在 Jupyter Notebook 中使用 argparse 模块的正确方法
- rest - 如何创建 API 端点以自动生成图像并将其索引到 Google?