Вопрос или проблема
Я пытаюсь адаптировать пример отсюда plotly-r.com/client-side-linking
Цель состоит в том, чтобы отфильтровать исходные данные (txhousing) по году и создать сводный точечный график отсутствующих значений по городам. Вот моя попытка, но фильтр не работает. Есть ли у вас какие-либо предложения без использования shiny?
library(plotly)
library(crosstalk)
data(txhousing, package = "ggplot2")
tx <- highlight_key(txhousing, ~city)
# инициализация объекта plotly
base <- plot_ly(tx, color = I("black"))
dot_plot <- base %>% group_by(city) %>%
summarise(miss = sum(is.na(median))) %>%
filter(miss > 0) %>%
add_markers(
x = ~miss,
y = ~forcats::fct_reorder(city, miss),
hoverinfo = "x+y"
) %>%
layout(
xaxis = list(title = "Количество пропущенных месяцев"),
yaxis = list(title = "")
)
bscols(
filter_select("f","выбрать год", tx, ~year),
dot_plot,
widths = c(4,8)
)
Ответ или решение
Для решения вашей задачи по фильтрации данных и построению сводного точечного графика пропущенных значений по городам с использованием библиотек plotly
и crosstalk
в R, вам необходимо убедиться, что ваши данные правильно фильтруются в соответствии с выбранным годом. Ниже приведен скорректированный код, который осуществляет эту задачу:
# Загружаем необходимые библиотеки
library(plotly)
library(crosstalk)
library(dplyr)
library(forcats)
# Загружаем данные txhousing из пакета ggplot2
data(txhousing, package = "ggplot2")
# Используем highlight_key для связывания данных
tx <- highlight_key(txhousing, ~city)
# Создаем интерактивный объект plotly
base <- plot_ly(tx, color = I("black"))
# Поскольку фильтрация должна быть по годам из объекта crosstalk,
# мы можем использовать reactive данный crosstalk для фильтрации
# и создания сводной таблицы с количеством пропущенных значений
dot_plot <- tx %>%
group_by(city, year) %>%
summarise(miss = sum(is.na(median))) %>%
filter(miss > 0) %>%
group_by(city) %>%
summarise(total_miss = sum(miss)) %>%
add_markers(
x = ~total_miss,
y = ~forcats::fct_reorder(city, total_miss),
hoverinfo = "x+y"
) %>%
layout(
xaxis = list(title = "Количество пропущенных месяцев"),
yaxis = list(title = "")
)
# Визуализируем результат
bscols(
filter_select("f", "Выберите год", tx, ~year),
dot_plot,
widths = c(4, 8)
)
В этом примере:
-
Мы добавили использование
group_by(year)
в сводной таблице, чтобы учитывать выбранный год при подсчете пропущенных значений. Это изменение необходимо, чтобы данные фильтровались по годам. -
Обновили создание точечного графика, чтобы он показывал общее количество пропущенных значений по каждому городу, а не только за выбранный год.
-
Убедитесь, что установлен и загружен пакет
forcats
, так как он используется для упорядочивания городов в графике.
Обратите внимание, что код будет работать в интерактивной среде, и когда вы выберете год, соответствующие результаты будут отображены на точечном графике. Вам также необходимо убедиться, что ваша среда может поддерживать crosstalk для правильной работы визуализации.