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

时间:2016-10-09 20:20:38

标签: 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)

但它不起作用:好像只处理了一个showlegend属性,所以如果我从p1开始,我有两个传说,如果我从p2开始,我有两个。

有什么想法吗?

4 个答案:

答案 0 :(得分:11)

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

  1. 直接回答:
    尝试在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) 中保存其行为。 您的代码现在如下:

    %>%
  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) ,如下所示:

    Species
  3. 此练习可让您更好地了解痕迹的工作原理。您可以看到数据首先按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之外,您必须确保

  1. 您的数据框按分组变量排序(幸运的是,虹膜数据已按Species排序),
  2. 您使用的变量不包含缺失值(NA)。
  3. 因此,这应该有效:

    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)
    

    以下示例不起作用:

    1. 按错误的变量排序:

      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)
      
    2. 缺少值的变量:

      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的图例。希望这行得通。