我有一个带有两个图形的基本子图,默认情况下都有一个图例,但我只希望看到其中一个。
我试过了:
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开始,我有两个。
有什么想法吗?
答案 0 :(得分:11)
我会给你两个答案,一个是直接答案,一个是为了更好的练习和后代(这也有助于更好地理解问题):
直接回答:
尝试在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)
中保存其行为。
您的代码现在如下:
%>%
在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()
分组,传递给my.php
函数 - 初始化图 - 然后指定跟踪类型(标记)以实际绘制图。>
当您想要添加或删除跟踪及其各自的选项,添加分组变量或拆分/汇总表时,编写这样的代码会更容易。
答案 1 :(得分:8)
上述答案导致一个小问题。图例仅与第一个图形互动。您需要将legendgroup添加到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)
答案 2 :(得分:1)
到目前为止,答案似乎有些不确定。
首先,数据帧分组没有任何影响,据我所知。这是一个排序不分组的问题(如Maltas comment above所示)。因此,数据框必须按照用作分组变量的变量进行排序。但是还有另一个陷阱阻碍了代码的运行。除了必需的legendgroup
之外,您必须确保
Species
排序),因此,这应该有效:
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)
答案 3 :(得分:1)
也许您可以尝试一种简单的方法。 subplot(style(p1, showlegend = F), p2)
{{1}}
它将仅显示p2的图例。希望这行得通。