在 R 绘图子图中,如何只显示一个图例?

In R plotly subplot graph, how to show only one legend?

提问人:Malta 提问时间:10/10/2016 更新时间:2/15/2020 访问量:22037

问:

我有一个包含两个图形的基本子图,默认情况下它们都有一个图例,但我只想看到其中一个。

我试过这个:

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 开始,我有两个。

有什么想法吗?

r 图地

评论

0赞 lukeA 10/10/2016
你的是什么?我得到了 - 似乎按预期工作(=>一个图例或没有图例)packageVersion("plotly")‘4.5.2’
0赞 Malta 10/10/2016
@lukeA:与您的版本相同,但我不清楚:我期望的是仅获得 p2 情节的图例。据我了解,你得到的结果和我得到的结果一样。
0赞 lukeA 10/10/2016
啊,现在我明白了。你想要一个具有 unqiue 物种值的图例,而现在,它们翻了一番。但是,我不知道如何实现这一目标。

答:

19赞 rvezy 12/13/2016 #1

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

  1. 直截了当的答案:
    尝试在函数内添加,而不是在函数中添加。如果我们看一下文档:
    showlegend = FALSEplot_ly()layout()?subplot

    在绘图序列中稍后找到的布局选项将覆盖在序列中较早找到的选项。

    换句话说,布局选项仅取自上一个绘图。但是使用函数中的选项会影响跟踪本身,将其行为保存在 . 您的代码现在如下所示:showlegendshowlegendplot_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. 在 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)
    

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

19赞 Mette Lægdsmand 9/11/2017 #2

上面的答案导致了一个小问题。图例仅与第一个情节互动。您需要将图例组添加到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)

评论

5赞 Malta 9/14/2017
谢谢,这太棒了!我精确地指出,你的数据排序方式很重要:如果你按 p1 的物种排序,p2 的 rev(species) 对数据进行排序,图形是相同的,但是当你取消选择某些东西时,它不会左右抑制相同的模态。如果你使用相同的水平,同样的问题进行分解,那么顺序才是最重要的。这是正常的还是应该报告的错误?
1赞 giovannotti 1/25/2018 #3

到目前为止,给出的答案中似乎有一些不确定的点。

首先,据我所知,数据框分组没有任何影响。这是一个排序而不是分组的问题(正如上面马耳他的评论所表明的那样)。因此,数据框必须按用作分组变量的变量进行排序。但是还有另一个陷阱,它仍然阻止了代码的工作。因此,除了要求之外,您还必须确保legendgroup

  1. 您的数据框是按分组变量排序的(幸运的是,虹膜数据已经按 ),Species
  2. 您使用的变量不包含缺失值 (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)

以下示例不起作用:

  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)
    

评论

0赞 janosdivenyi 2/13/2018
我想强调的是,“数据框必须按旨在用作分组变量的变量进行排序”。只是花了很多时间理解为什么@Mette的答案不适用于:)mtcarsfactor(cyl)
1赞 Claudiu Papasteri 9/2/2019
这可能是由于版本控制和修复,但你说的两个例子现在应该不起作用了!
8赞 鄭俊杰 2/15/2020 #4

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

subplot(style(p1, showlegend = F), p2)

它只会显示 p2 的图例。希望这行得通。