提问人:Malta 提问时间:10/10/2016 更新时间:2/15/2020 访问量:22037
在 R 绘图子图中,如何只显示一个图例?
In R plotly subplot graph, how to show only one legend?
问:
我有一个包含两个图形的基本子图,默认情况下它们都有一个图例,但我只想看到其中一个。
我试过这个:
require(plotly)
p1 <- plot_ly(data=iris,x=~Sepal.Length,y=~Sepal.Width,split=~Species) %>% layout(showlegend = FALSE)
p2 <- plot_ly(data=iris,x=~Sepal.Length,y=~Sepal.Width,split=~Species) %>% layout(showlegend = TRUE)
subplot(p1,p2)
subplot(p2,p1)
但它不起作用:似乎只处理了一个 showlegend 属性,所以如果我从 p1 开始,我有两个图例,如果我从 p2 开始,我有两个。
有什么想法吗?
答:
我会给你两个答案,一个是直截了当的答案,一个是为了更好的实践和后代(这也有助于更好地理解问题):
直截了当的答案:
尝试在函数内添加,而不是在函数中添加。如果我们看一下文档:showlegend = FALSE
plot_ly()
layout()
?subplot
在绘图序列中稍后找到的布局选项将覆盖在序列中较早找到的选项。
换句话说,布局选项仅取自上一个绘图。但是使用函数中的选项会影响跟踪本身,将其行为保存在 . 您的代码现在如下所示:
showlegend
showlegend
plot_ly()
subplot
require(plotly) p1 <- plot_ly(data=iris,x=~Sepal.Length,y=~Sepal.Width,split=~Species,showlegend = F) p2 <- plot_ly(data=iris,x=~Sepal.Length,y=~Sepal.Width,split=~Species, showlegend = T) subplot(p1,p2)
在 plotly 4.0 及更高版本下更好的实践。
使用管道运算符和函数代替 ,如下所示:%>%
group_by()
split
p1 <- iris%>% group_by(Species)%>% plot_ly(x=~Sepal.Length, color= ~Species)%>% add_markers(y= ~Sepal.Width) p2 <- iris%>% group_by(Species)%>% plot_ly(x=~Sepal.Length, color= ~Species)%>% add_markers(y= ~Sepal.Width, showlegend = F) subplot(p1,p2)
这种做法可以让你更好地了解迹线在绘图中的工作原理。您可以看到,数据首先被分组 ,传递给初始化绘图的函数,然后指定跟踪类型(标记)以实际绘制绘图。
当您想要添加或删除跟踪及其各自的选项、添加分组变量或拆分/汇总表时,像这样编写代码会更容易。Species
plot_ly()
上面的答案导致了一个小问题。图例仅与第一个情节互动。您需要将图例组添加到plot_ly函数中,以使图例与两个图交互。
library(plotly)
p1 <-
iris%>%
group_by(Species)%>%
plot_ly(x=~Sepal.Length, color= ~Species, legendgroup=~Species)%>%
add_markers(y= ~Sepal.Width)
p2 <-
iris%>%
group_by(Species)%>%
plot_ly(x=~Sepal.Length, color= ~Species, legendgroup=~Species)%>%
add_markers(y= ~Sepal.Width, showlegend=F)
subplot(p1,p2)
评论
到目前为止,给出的答案中似乎有一些不确定的点。
首先,据我所知,数据框分组没有任何影响。这是一个排序而不是分组的问题(正如上面马耳他的评论所表明的那样)。因此,数据框必须按用作分组变量的变量进行排序。但是还有另一个陷阱,它仍然阻止了代码的工作。因此,除了要求之外,您还必须确保legendgroup
- 您的数据框是按分组变量排序的(幸运的是,虹膜数据已经按 ),
Species
- 您使用的变量不包含缺失值 (NA)。
因此,这应该有效:
library(plotly)
p1 <-
iris %>%
arrange(Species) %>%
plot_ly(x = ~Sepal.Length, color = ~Species, legendgroup = ~Species) %>%
add_markers(y = ~Sepal.Width)
p2 <-
iris %>%
arrange(Species) %>%
plot_ly(x = ~Sepal.Length, color = ~Species, legendgroup = ~Species) %>%
add_markers(y= ~Sepal.Width, showlegend = FALSE)
subplot(p1, p2)
以下示例不起作用:
按错误变量排序:
p1 <- iris %>% arrange(Sepal.Length) %>% plot_ly(x = ~Sepal.Length, color = ~Species, legendgroup = ~Species) %>% add_markers(y = ~Sepal.Width) p2 <- iris%>% arrange(Sepal.Length) %>% plot_ly(x=~Sepal.Length, color= ~Species, legendgroup=~Species)%>% add_markers(y = ~Sepal.Width, showlegend = FALSE) subplot(p1, p2)
具有缺失值的变量:
df <- iris df$Sepal.Length[2] <- NA head(df) #> Sepal.Length Sepal.Width Petal.Length Petal.Width Species #> 1 5.1 3.5 1.4 0.2 setosa #> 2 NA 3.0 1.4 0.2 setosa #> 3 4.7 3.2 1.3 0.2 setosa #> 4 4.6 3.1 1.5 0.2 setosa #> 5 5.0 3.6 1.4 0.2 setosa #> 6 5.4 3.9 1.7 0.4 setosa p1 <- df %>% arrange(Species) %>% plot_ly(x = ~Sepal.Length, color = ~Species, legendgroup = ~Species) %>% add_markers(y = ~Sepal.Width) p2 <- df %>% arrange(Species) %>% plot_ly(x = ~Sepal.Length, color = ~Species, legendgroup = ~Species)%>% add_markers(y = ~Sepal.Width, showlegend = FALSE) subplot(p1, p2)
评论
mtcars
factor(cyl)
也许你可以尝试一个简单的方法。(plotly 4.9.2)
subplot(style(p1, showlegend = F), p2)
它只会显示 p2 的图例。希望这行得通。
评论
packageVersion("plotly")
‘4.5.2’