Интерактивные точечные графики в R, наложение / всплывающая сводка / всплывающая подсказка в качестве пользовательской функции графика

Я искал интерактивные графики в R. Я знаю, что есть несколько пакетов для создания интерактивных графиков, особенно диаграмм рассеяния, но я ищу определенную функциональность.

Например этот сюжет. Можно навести курсор мыши на кнопки, чтобы получить небольшую числовую сводку данных за точкой, то есть всплывающую подсказку.

Когда у вас есть набор данных с большим количеством переменных, часто бывает удобно исследовать / визуализировать результаты из PCA или выполнять многомерное масштабирование (MDS). Но если кто-то изобразит данные в интерактивном режиме, как в приведенном выше примере, сводка, когда человек наводит курсор на точку, не дает такой большой информации, то есть просто длинный список чисел. Было бы лучше иметь возможность создавать собственный график для отображения, а не просто отображать числовые значения.

Итак, мой вопрос:

Можно ли (в некоторых пакетах, доступных в R) создать визуальную сводку, когда человек наводит курсор на точку на точечной диаграмме. Это может быть барплот или просто какая-то заданная пользователем функция печати, которая принимает в качестве аргумента одну строку из data.frame.

Если это возможно, то это очень поможет в быстром понимании результатов MDS.

РЕДАКТИРОВАТЬ:

Вот некоторый код, чтобы сделать MDS для набора данных радужной оболочки:

library(ggplot2)
library(plotly)
d <- dist(iris[,-5]) # euclidean distances between the rows
fit <- cmdscale(d,eig=TRUE, k=2) # k is the number of dim

# Put coordinates and original data in one data.frame
x <- fit$points[,1]
y <- fit$points[,2]
pDat <- data.frame(x=x,y=y)
pDat <- cbind(pDat,iris)
p <- ggplot(pDat) + geom_point(aes(x,y))
ggplotly(p)

Во-первых, теперь подсказка содержит только координаты x,y. Я хотел бы, чтобы всплывающая подсказка содержала значения для исходных 4 переменных. Затем вместо исходных 4 переменных за точкой данных я бы хотел отобразить всплывающую подсказку в виде линейной диаграммы. MDS сохраняет расстояние между точками данных, поэтому можно было бы постепенно зависать с помощью мыши и видеть график, почти непрерывно изменяющийся, поскольку расстояния сохраняются. В моем случае использования у меня есть 30 переменных за каждой точкой, поэтому сводная таблица дает больше визуальной информации, чем 30 числовых значений.

2 ответа

Решение

Если вы используете последнюю версию rbokeh для разработки, вы можете добиться того, чего хотите, с помощью следующего:

devtools::install_github("bokeh/rbokeh@v0.6.3")

library(rbokeh)

iris$sw <- paste0(iris$Sepal.Width * 20, "px")
iris$pw <- paste0(iris$Petal.Width * 20, "px")
iris$sl <- paste0(iris$Sepal.Length * 20, "px")
iris$pl <- paste0(iris$Petal.Width * 20, "px")

style_str <- "white-space: nowrap; border: 1px solid white; background: steelblue; height: 15px;"

figure() %>%
  ly_points(x = Sepal.Width, y = Sepal.Length, color = Species,
  data = iris, hover = glue::glue("
<div>
  <div style='{style_str} width: @sw'>Sepal width</div>
  <div style='{style_str} width: @pw'>Petal Width</div>
  <div style='{style_str} width: @sl'>Sepal width</div>
  <div style='{style_str} width: @pl'>Petal Length</div>
</div>
"))

rbokeh всплывающие подсказки

Здесь происходит то, что rbokeh позволяет вам указать произвольный html в качестве всплывающей подсказки, поэтому здесь мы создаем div с заданной шириной в соответствии со значениями данных (ссылается на @swи т. д.) для создания гистограммы.

Приведенный выше пример хорошо работает для простой гистограммы, но если вы хотите иметь возможность отображать произвольные изображения во всплывающей подсказке, одним из подходов будет предварительная генерация растрового изображения для каждой точки данных и вставка его в виде всплывающей подсказки HTML (изображение тег с изображением в кодировке base64 в качестве источника).

Если вы используете RStudio, пакет plotly должен быть достаточно дружественным для использования. Например:

library(ggplot2)
library(plotly) 
p <- ggplot(iris, aes(Sepal.Length, Petal.Length, colour=Species)) + geom_point()
 ggplotly(p)

Информация, отображаемая при наведении на одну точку, выглядит следующим образом:

Другие вопросы по тегам