Как выбрать переменную для отображения в подсказке при использовании 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 и значением. Я попробовал параметр tooltip =, но он указал, что вы можете использовать только переменную, описываемую в эстетике, и я не использую имя в моем aes.
Любое решение? Я видел, что я не первый с этой проблемой, но я не нашел ответ, работая с ggplotly.
Ответы
Ответ 1
Вам не нужно изменять объект plotly
, как указано в @royr2. Просто добавьте label = name
в качестве третьей эстетики
ggplot(data = d, aes(x = seq, y = value, label = name)) + geom_line() + geom_point()
а всплывающая подсказка будет отображать name
в дополнение к seq
и value
.
Файл справки ggplotly
говорит о параметре tooltip
:
Значение по умолчанию "все" означает отображение всех эстетических отображений (в том числе неофициальный "текст" ).
Таким образом, вы можете использовать эстетику label
, если вы не хотите использовать ее для geom_text
.
Кстати: я также пробовал text
вместо label
ggplot(data = d, aes(x = seq, y = value, text = name)) + geom_line() + geom_point()
но затем ggplot2
жаловался
geom_path: Каждая группа состоит только из одного наблюдения. Вам нужно настроить эстетику группы?
и построил только точки. Мне пришлось добавить фиктивную группу в geom_line
, чтобы устранить проблему:
ggplot(data = d, aes(x = seq, y = value, text = name)) + geom_line(group = 1) + geom_point()
(Но обратите внимание, если вы поместили фиктивную группу в четвертую эстетику внутри aes()
, она появится по умолчанию также в подсказке.)
Тем не менее, я считаю, что неофициальная text
эстетика может стать полезной наряду с label
, если вы хотите иметь разные строки, построенные с помощью geom_text
и отображаемые в подсказке.
Изменить ответ на вопрос в комментариях:
Параметр tooltip
для ggplotly()
может использоваться для управления внешним видом. ggplotly(tooltip = NULL)
полностью отключит всплывающие подсказки. ggplotly(tooltip = c("label"))
выбирает эстетику для включения в всплывающую подсказку.
Ответ 2
Основываясь на ответе @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)
![введите описание изображения здесь]()
Ответ 3
Для этого вам нужно изменить plotly object
. Или используйте plot_ly()
для создания графика...
EDIT:
С выпуском 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
Ответ 4
Неофициальная эстетика text
позволяет ввести все нужные вам переменные (здесь я дважды использую name
, чтобы показать это):
require(ggplot2)
ggplot(data = d,aes(x = seq,
y = value,
group = 1,
text = paste('name: ', name,
'</br>name_again: ', name)
))+
geom_line() +
geom_point()
Мне нужно добавить фиктивный group
эстетический для geom_line
, чтобы он работал правильно, как предположил @UweBlock.
Наконец, я выбираю то, что хочу показать в подсказке (здесь я исключил group
).
require(plotly)
ggplotly(, tooltip = c("x", "y", "text"))