web-dev-qa-db-ja.com

ggplotlyを使用するときにツールチップに表示する変数を選択するにはどうすればよいですか?

私はシンプルなデータフレームを持っています:

seq <- 1:10
name <- c(paste0("company",1:10))
value <- c(250,125,50,40,40,30,20,20,10,10)
d <- data.frame(seq,name,value)

そして、私はそれをこのようにプロットしたい:

require(ggplot2)
ggplot(data = d,aes(x=seq,y=value))+geom_line() + geom_point()

今、私は陰謀を使用して、ほとんどの場合、ポイントの上にマウスを移動するときに、会社名などの値以外の情報を取得できるようにします。私はこれを試してください:

require(plotly)
ggplotly()

ツールチップが表示されますが、seqとvalueのみが含まれています。オプションtooltip =を試しましたが、審美的に記述された変数のみを使用できることが指定されており、aesでは名前を使用しません。

解決策はありますか?私はこの問題で最初ではありませんでしたが、ggplotlyで動作する答えは見つかりませんでした。

29
Malta

@ royr2によって提案されたplotlyオブジェクトを変更する必要はありません。 3番目の美学として_label = name_を追加するだけです

_ggplot(data = d, aes(x = seq, y = value, label = name)) + geom_line() + geom_point()
_

ツールチップにはnameseqに加えてvalueが表示されます。

ggplotlyヘルプファイルには、tooltipパラメーターに関する説明があります。

デフォルトの「すべて」は、すべての美的マッピング(非公式の「テキスト」美的を含む)を表示することを意味します。

したがって、_geom_text_に使用したくない限り、label美学を使用できます。

ところで:私はtextの代わりにlabelも試しました

_ggplot(data = d, aes(x = seq, y = value, text = name)) + geom_line() + geom_point()
_

しかし_ggplot2_は不満を言いました

geom_path:各グループは1つの観測のみで構成されます。グループの美観を調整する必要がありますか?

そして、ポイントのみをプロットしました。問題を削除するには、ダミーグループを_geom_line_に追加する必要がありました。

_ggplot(data = d, aes(x = seq, y = value, text = name)) + geom_line(group = 1) + geom_point()
_

(ただし、aes()内にダミーグループを4番目の美学として配置すると、ツールチップにもデフォルトで表示されます。)

ただし、_geom_text_でプロットされた異なる文字列をツールチップに表示したい場合は、非公式のtext美学がlabelと並んで有用になることがあります。

コメントで質問に答えるために編集:ggplotly()tooltipパラメーターを使用して、外観を制御できます。 ggplotly(tooltip = NULL)はツールチップをまったく表示しません。 ggplotly(tooltip = c("label"))は、ツールチップに含める美学を選択します。

45
Uwe

@UweBlockの答えに基づいて、ツールチップに複数のラベルを表示するためにダミーの美学を作成することもできます。これがどこで文書化されているかはわかりませんが、経験的に発見しました。ダミー変数は指定した順序で表示されますが、デフォルト変数(例:xおよびy)が優先されます。これを回避するには、以下に示すように、これらの変数を別の美学で指定できます。

library(plotly)
p = ggplot(iris, aes(label=Species, label2=Petal.Length, label3=Petal.Width)) + 
  geom_point(aes(Sepal.Length,Sepal.Width))
ggplotly(p)

enter image description here

30
teadotjay

非公式のtext美学により、必要なすべての変数を紹介できます(ここでは、nameを2回使用して表示しています)。

require(ggplot2)
ggplot(data = d,aes(x = seq, 
                    y = value,
                    group = 1,
                    text = paste('name: ', name,
                                 '</br>name_again: ', name)
                    ))+
  geom_line() + 
  geom_point()

@UweBlockが示唆するようにgeom_lineが適切に機能するように、ダミーのgroup美学を追加する必要があります。

最後に、ツールチップに表示するものを選択します(ここではgroupを除外しました)。

require(plotly)
ggplotly(, tooltip = c("x", "y", "text"))
13
DAVL

これを行うには、_plotly object_を変更する必要があります。または、代わりにplot_ly()を使用してグラフを作成します...

編集:_plotly 4.0_のリリースにより、構文が少し変更されます。

_seq <- 1:10
name <- c(paste0("company",1:10))
value <- c(250,125,50,40,40,30,20,20,10,10)
d <- data.frame(seq,name,value)

require(plotly)
gg <- ggplot(data = d,aes(x=seq,y=value))+geom_line() + geom_point()

gg <- plotly_build(gg)

#OLD:
gg$data[[1]]$text <- paste("Seq:", d$seq, "<br>",
                           "Value:", d$value, "<br>",
                           "Company:", d$name)

#UPDATED: 
#Plotly_build creates two separate traces:
#One with mode = markers and the other with mode = lines
#Hence modify text for the second trace

gg$x$data[[2]]$text <- paste("Seq:", d$seq, "<br>",
                           "Value:", d$value, "<br>",
                           "Company:", d$name)

gg
_
11
royr2