Подтвердить что ты не робот

Как выбрать переменную для отображения в подсказке при использовании 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.

4b9b3361

Ответ 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"))