web-dev-qa-db-ja.com

Rプロットサブプロットグラフで、1つの凡例のみを表示するにはどうすればよいですか?

2つのグラフを持つ基本的なサブプロットがあり、どちらにもデフォルトで凡例がありますが、そのうちの1つだけを表示したいと思います。

私はこれを試しました:

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)

しかし、それは機能しません。1つのshowlegend属性のみが処理されたように見えるので、p1から始めると2つの凡例があり、p2から始めると2つあります。

何か案は ?

9
Malta

上記の答えは小さな問題になります。凡例は最初のプロットとのみ対話します。凡例を両方のプロットとインタラクティブにするには、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)
8

私はあなたに2つの答えを与えます、まっすぐなものと、より良い練習と後世のための1つ(これは問題をよりよく理解するのにも役立ちます):

  1. 正解:
    plot_ly()関数ではなく、layout()関数内に_showlegend = FALSE_を追加してみてください。 _?subplot_のドキュメントを見ると:

    プロットのシーケンスの後半にあるレイアウトオプションは、シーケンスの前半にあるオプションを上書きします。

    つまり、layout showlegendオプションは、最後のプロットからのみ取得されます。ただし、plot_ly()関数からshowlegendオプションを使用すると、トレース自体に影響を与え、その動作を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以上でのより良い練習。
    次のように、splitの代わりにパイプ演算子_%>%_とgroup_by()関数を使用します。

    _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()関数に渡され、次にトレースタイプ(マーカー)を指定して実際にプロットを作成することがわかります。
トレースとそれぞれのオプションを追加または削除したり、グループ化変数を追加したり、テーブルを分割/要約したりする場合は、このようなコードの記述が簡単です。

11
rvezy

これまでの回答には不確かな点があるようです。

まず第一に、私が見る限り、データフレームのグループ化は何の影響も及ぼしていません。これは、グループ化ではなく並べ替えの問題です( 上記のMaltasコメント が示すように)。したがって、データフレームは、グループ化変数として機能することを目的とした変数でソートする必要があります。しかし、それでもコードが機能しないという別の落とし穴があります。したがって、必要な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)
    
1
giovannotti

たぶんあなたは簡単な方法を試すことができます。 (plotly 4.9.2)

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

P2の凡例が表示されます。これがうまくいくことを願っています。

0
鄭俊杰