ape
заход на посадку
Чтобы получить подсказки пользователя, необходимо знать координаты x и y внутреннего и конечного узлов на графике. Вы можете получить их, используя пакет ape
. Затем, когда у вас есть координаты очищаемой области, вы можете установить в таблицу координат филоса только очищенные кончики. В приведенном ниже примере мы должны явно указать brushedPoints
, где искать координаты x
и y
(столбцы xvar
и yvar
во фрейме данных). В зависимости от количества видов на дереве, вам может потребоваться расширить область заговора, чтобы избежать наложения, чтобы можно было легко расчесывать виды.
Код:
library(shiny)
library(ape)
Tree <- rtree(n=20)
Tree <- ladderize(Tree)
ui <- basicPage(
plotOutput("plot1", brush = "plot_brush"),
tableOutput("brushed_subtree")
)
server <- function(input, output) {
output$plot1 <- renderPlot({
plot(Tree)
})
getTreeInfo <- reactive({
plot(Tree)
plotinfo <- get("last_plot.phylo", envir = .PlotPhyloEnv)
tips_xy <- data.frame(Tip=Tree$tip.label,
xvar=plotinfo$xx[1:Ntip(Tree)],
yvar=plotinfo$yy[1:Ntip(Tree)])
return(tips_xy)
})
# render selected tips table
output$brushed_subtree <- renderTable({
brushedPoints(getTreeInfo(), input$plot_brush, xvar = "xvar", yvar = "yvar")
})
}
shinyApp(ui, server)
Gif:
ggtree
заход на посадку
Подход на ggtree
проще. Фактически, вы уже были близки, за исключением того, что вместо передачи дерева на brushedPoints
вам нужно предоставить компонент $data
графика ggtree
. Обратите внимание, что в этом случае зачищенная область должна включать в себя конечную ветвь искомого наконечника, поскольку координаты графика задаются фреймом данных ребер, а наконечники представляют собой отдельный геом, нанесенный на график относительно ранее нанесенных (терминальных) ребер .
Код
library(shiny)
library(ggplot2)
library(treeio)
library(ggtree)
library(tidytree)
tree <- treeio::read.newick("1509MLJF6-1.dnd")
treedt <- as.treedata(tree)
# Define UI for application that draws a histogram
ui <- fluidPage(
# Application title
titlePanel("Select Individuals and Display Data"),
# Show a plot and output table
mainPanel(
plotOutput("treeDisplay", brush = "plot_brush"),
verbatimTextOutput("selectedIndivs")
)
)
# Define server logic required to draw a histogram
server <- function(input, output) {
make_tree <- reactive({
ggplot(tree) + geom_tree() + geom_tiplab()
})
output$treeDisplay <- renderPlot({
make_tree()
})
output$selectedIndivs <- renderPrint({
brushedPoints(make_tree()$data, input$plot_brush)
})
}
# Run the application
shinyApp(ui = ui, server = server)
GIF: