У меня есть огромная дендрограмма с сотнями имен на ней, которую я хотел бы сделать интерактивной, чтобы пользователи могли рисовать рамку и «увеличивать» имена и часть интересующего дерева. Исходный код для его создания позаимствован отсюда . Изображенный здесь:
I turned it into a shiny app and borrowed some код отсюда , чтобы сделать его масштабируемым. И это КИНДА работает. Он запускается, появляются два графика, и ничего не выдает ошибок. Но это работает не так, как задумано. (Я выложу код ниже). Я имею в виду, что если бы я просто визуализировал свой сюжет вне блестящего, все имена и все остальное были включены. Но когда он рендерится блестящим, я не могу нарисовать рамку над именами, только линии дендрограммы (надеюсь, что это имеет смысл), а «увеличенный» график поворачивается боком (что-то связанное с функцией corre_cartesian? Я использую вместо этого) и выглядит очень странно при "увеличении". Наконец, я не могу видеть оба графика одновременно, и мне приходится использовать полосу прокрутки, чтобы добраться до них, как показано на рисунке: введите описание изображения здесь
Помогите! Код ниже (это из документа уценки r, если это важно, извините, я не смог включить фактические данные, имеет настоящие имена.
Data<-Data%>%select(-`BOARD DATE`)
Data<-t(Data)
Data<-as_tibble(Data)
names(Data) <- Data %>% slice(1) %>% unlist()
Data <- Data %>% slice(-1)
cluster_dtw_h2 <- dtwclust::tsclust(t(Data),
type = "h",
k = 2,
distance = "dtw",
control = hierarchical_control(method = "complete"),
preproc = NULL,
args = tsclust_args(dist = list(window.size = 5L)))
hclus <- stats::cutree(cluster_dtw_h2, k = 2) %>% # hclus <- cluster::pam(dist_ts, k = 2)$clustering has a similar result
as.data.frame(.) %>%
dplyr::rename(.,cluster_group = .) %>%
tibble::rownames_to_column("type_col")
hcdata <- ggdendro::dendro_data(cluster_dtw_h2)
names_order <- hcdata$labels$label
hcdata$labels$label <- ""
p1 <- hcdata %>%
ggdendro::ggdendrogram(., rotate=TRUE, leaf_labels=FALSE)
ui <- fluidPage(
fluidRow(
column(width = 12, class = "well",
h4("Left plot controls right plot"),
fluidRow(
column(width = 12,
plotOutput("plot2", height = 300,
brush = brushOpts(
id = "plot2_brush",
resetOnNew = TRUE
)
)
),
column(width = 12,
plotOutput("plot3", height = 300)
)
)
)
)
)
server <- function(input, output) {
ranges2 <- reactiveValues(x = NULL, y = NULL)
output$plot2 <- renderPlot({
p1
})
output$plot3 <- renderPlot({
p1+
coord_cartesian(xlim = ranges2$x, ylim = ranges2$y, expand = FALSE)
})
# When a double-click happens, check if there's a brush on the plot.
# If so, zoom to the brush bounds; if not, reset the zoom.
observe({
brush <- input$plot2_brush
if (!is.null(brush)) {
ranges2$x <- c(brush$xmin, brush$xmax)
ranges2$y <- c(brush$ymin, brush$ymax)
} else {
ranges2$x <- NULL
ranges2$y <- NULL
}
})
}
shinyApp(ui=ui, server=server)