在R plotly subplot图中,如何只显示一个图例?

Mal*_*lta 8 r plotly

我有一个带有两个图形的基本子图,默认情况下都有一个图例,但我只想看到其中一个.

我试过这个:

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)
Run Code Online (Sandbox Code Playgroud)

但它不起作用:似乎只有一个showlegend属性被处理,所以如果我从p1开始我有两个传说,如果我从p2开始我有两个.

有任何想法吗 ?

rve*_*ezy 11

我会给你两个答案,一个是直接答案,一个是为了更好的练习和后代(这也有助于更好地理解问题):

  1. 直接回答:
    尝试showlegend = FALSEplot_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)
    
    Run Code Online (Sandbox Code Playgroud)
  2. 在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)
    
    Run Code Online (Sandbox Code Playgroud)

这种做法可以让您更好地了解痕迹的工作原理.您可以看到数据首先被分组Species,传递给plot_ly()函数 - 初始化图 - 然后指定跟踪类型(标记)来实际绘制图.
当您想要添加或删除跟踪及其各自的选项,添加分组变量或拆分/汇总表时,编写这样的代码会更容易.


小智 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)
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,这很棒!我确切地说,您的数据排序方式很重要:如果您按p1的种类和p2的rev(种类)对数据进行排序,图形是相同的,但是当您取消选择某些内容时,它不会抑制相同的数据模态左右.如果你使用相同的水平,相同的问题进行因子分解,那真的是重要的顺序.它是正常的还是应该报告的错误? (3认同)

小智 8

也许你可以尝试一个简单的方法。(plotly 4.9.2)

subplot(style(p1, showlegend = F), p2)
Run Code Online (Sandbox Code Playgroud)

它只会显示p2的图例。希望这有效。