如何使用 plotly subplots() 删除重复的图例条目
How to remove duplicate legend entries w/ plotly subplots()
如何在使用 plotly 的 subplots() 时删除图例中的重复项?
这是我的 MWE:
library(plotly)
library(ggplot2)
library(tidyr)
mpg %>%
group_by(class) %>%
do(p = plot_ly(., x = ~cyl, y = ~displ, color = ~trans, type = 'bar')) %>%
subplot(nrows = 2, shareX = TRUE, titleX = TRUE) %>%
layout(barmode = 'stack')
plotly
不像 ggplot2
那样有 facet
,所以它会为每个 subplot
添加图例,或者您可以为其中一些关闭它。
这里我们没有包含所有 ~class
条目的图层,也没有在 class
中没有交集的两个地块,它们的组合也涵盖了所有这些。在这种情况下,我们可以将那些特定地块的 showlegend
设置为 TRUE
,将其余地块设置为 FALSE
,并将 legendgroup
设置为 [=24] =] 所以我们得到了一个独特但又完整的图例。
正如我所说,我们这里没有这种特殊情况。所以我能想到的有两种可能:
添加整个数据(复制整个数据帧)并将 All
中的 class 分配给它们。然后将其与原始数据一起绘制,但仅保留 class == All
.
的图例
使用ggplot::facet_wrap
然后ggplotly
制作一个plotly
对象。但是,这会导致 x-axis
出现一些问题(将 ggplot
对象与 plotly
对象进行比较)。
library(plotly)
library(ggplot2)
library(dplyr)
ly_plot <- . %>%
plot_ly(x = ~cyl, y = ~displ, color = ~trans,
type = 'bar', showlegend = ~all(legendC)) %>%
add_annotations(
text = ~unique(class),
x = 0.5,
y = 1,
yref = "paper",
xref = "paper",
xanchor = "middle",
yanchor = "top",
showarrow = FALSE,
font = list(size = 15))
mpg %>%
mutate(class= "_All_") %>%
rbind(.,mpg) %>%
mutate(legendC = (class == "_All_")) %>%
group_by(class) %>%
do(p = ly_plot(.)) %>%
subplot(nrows = 2, shareX = TRUE, titleX = TRUE) %>%
layout(barmode = 'stack')
#> Warning in RColorBrewer::brewer.pal(N, "Set2"): n too large,
#> allowed maximum for palette Set2 is 8
#> Returning the palette you asked for with that many colors
p <- ggplot(data = mpg, aes(x=cyl, y=displ, fill=trans))+
geom_bar(stat="identity") +
facet_wrap(~class)
p
ggplotly(p) #seems for this we should also set "colour = trans"
使用 tidyverse
的另一种解决方法。在原来的MWE基础上增加了以下步骤:
- 将
trans
列转换为因子。
- 使用 tidyr 的
complete
为每个 class
组中的缺失因子水平填充(非 NA)虚拟值。
- 按照 M-M 的建议设置
showlegend
到 TRUE
用于单个组,legendgroup
到 trans
到 link 子图之间的图例条目。
library(plotly)
library(tidyverse)
mpg %>%
mutate_at("trans", as.factor) %>%
group_by(class) %>%
group_map(.f = ~{
## fill missing levels w/ displ = 0, cyl = first available value
complete(.x, trans, fill = list(displ = 0, cyl = head(.x$cyl, 1))) %>%
plot_ly(x = ~cyl, y = ~displ, color = ~trans, colors = "Paired", type = "bar",
showlegend = (.y == "2seater"), legendgroup = ~trans) %>%
layout(yaxis = list(title = as.character(.y)), barmode = "stack")
}) %>%
subplot(nrows = 2, shareX = TRUE, titleY = TRUE)
如何在使用 plotly 的 subplots() 时删除图例中的重复项?
这是我的 MWE:
library(plotly)
library(ggplot2)
library(tidyr)
mpg %>%
group_by(class) %>%
do(p = plot_ly(., x = ~cyl, y = ~displ, color = ~trans, type = 'bar')) %>%
subplot(nrows = 2, shareX = TRUE, titleX = TRUE) %>%
layout(barmode = 'stack')
plotly
不像 ggplot2
那样有 facet
,所以它会为每个 subplot
添加图例,或者您可以为其中一些关闭它。
这里我们没有包含所有 ~class
条目的图层,也没有在 class
中没有交集的两个地块,它们的组合也涵盖了所有这些。在这种情况下,我们可以将那些特定地块的 showlegend
设置为 TRUE
,将其余地块设置为 FALSE
,并将 legendgroup
设置为 [=24] =] 所以我们得到了一个独特但又完整的图例。
正如我所说,我们这里没有这种特殊情况。所以我能想到的有两种可能:
添加整个数据(复制整个数据帧)并将
的图例All
中的 class 分配给它们。然后将其与原始数据一起绘制,但仅保留class == All
.使用
ggplot::facet_wrap
然后ggplotly
制作一个plotly
对象。但是,这会导致x-axis
出现一些问题(将ggplot
对象与plotly
对象进行比较)。
library(plotly)
library(ggplot2)
library(dplyr)
ly_plot <- . %>%
plot_ly(x = ~cyl, y = ~displ, color = ~trans,
type = 'bar', showlegend = ~all(legendC)) %>%
add_annotations(
text = ~unique(class),
x = 0.5,
y = 1,
yref = "paper",
xref = "paper",
xanchor = "middle",
yanchor = "top",
showarrow = FALSE,
font = list(size = 15))
mpg %>%
mutate(class= "_All_") %>%
rbind(.,mpg) %>%
mutate(legendC = (class == "_All_")) %>%
group_by(class) %>%
do(p = ly_plot(.)) %>%
subplot(nrows = 2, shareX = TRUE, titleX = TRUE) %>%
layout(barmode = 'stack')
#> Warning in RColorBrewer::brewer.pal(N, "Set2"): n too large,
#> allowed maximum for palette Set2 is 8
#> Returning the palette you asked for with that many colors
p <- ggplot(data = mpg, aes(x=cyl, y=displ, fill=trans))+
geom_bar(stat="identity") +
facet_wrap(~class)
p
ggplotly(p) #seems for this we should also set "colour = trans"
使用 tidyverse
的另一种解决方法。在原来的MWE基础上增加了以下步骤:
- 将
trans
列转换为因子。 - 使用 tidyr 的
complete
为每个class
组中的缺失因子水平填充(非 NA)虚拟值。 - 按照 M-M 的建议设置
showlegend
到TRUE
用于单个组,legendgroup
到trans
到 link 子图之间的图例条目。
library(plotly)
library(tidyverse)
mpg %>%
mutate_at("trans", as.factor) %>%
group_by(class) %>%
group_map(.f = ~{
## fill missing levels w/ displ = 0, cyl = first available value
complete(.x, trans, fill = list(displ = 0, cyl = head(.x$cyl, 1))) %>%
plot_ly(x = ~cyl, y = ~displ, color = ~trans, colors = "Paired", type = "bar",
showlegend = (.y == "2seater"), legendgroup = ~trans) %>%
layout(yaxis = list(title = as.character(.y)), barmode = "stack")
}) %>%
subplot(nrows = 2, shareX = TRUE, titleY = TRUE)