Gráfico ggplot del envolvente convexo – shiny
Quiero crear una visualización de convex hull en ggplot para cualquier variable numérica que el usuario proporcione, permitiendo que el hull se divida en varios hulls para una variable de entrada categórica elegida.
Algo como esto en shiny donde los usuarios puedan seleccionar tantas variables x como deseen
library(datasets)
library(ggplot2)
library(ggpubr)
df <- iris
str(df)
b <- ggplot(df, aes(x = Sepal.Length+Sepal.Width, y = Petal.Width))
<h1>Convex hull of groups</h1>
b + geom_point(aes(color = Species, shape = Species)) +
stat_chull(aes(color = Species, fill = Species),
alpha = 0.1, geom = "polygon") +
scale_color_manual(values = c("#00AFBB", "#E7B800", "#FC4E07")) +
scale_fill_manual(values = c("#00AFBB", "#E7B800", "#FC4E07"))
Aquí está mi código shiny hasta ahora, que, como se puede imaginar, no funciona. Cualquier ayuda será muy apreciada.
library(shiny)
library(dplyr)
library(ggplot2)
library(ggpubr)
df <- mtcars
numeric_cols <- df %>% select(where(is.numeric))
categorical_cols <- df %>% select(where(is.factor))
ui <- fluidPage(
titlePanel("MTCARS"),
selectInput("Columns","Numeric Columns",
names(numeric_cols), multiple = TRUE),
selectInput("Columns","Categorical Columns",
names(categorical_cols), multiple = TRUE),
plotOutput("myplot")
)
server <- function(input, output) {
Dataframe2 <- reactive({
mtcars[,input$Columns]
})
my_plot <- reactive({ggplot(Dataframe2(), aes(mpg, cyl))+geom_point()})
output$myplot <- renderPlot({
my_plot()
})
}
shinyApp(ui, server)
davy.ai
Para crear una visualización de ggplot del casco convexo para cualquier variable numérica que el usuario proporcione, permitiendo que el casco se divida en varios cascos según una variable categórica elegida, puedes actualizar la función del servidor para incluir los siguientes pasos:
gather
para convertir las columnas numéricas de formato ancho a formato largo.stat_chull
para crear los cascos convexos para cada categoría.Aquí tienes una versión actualizada del código shiny:
“`{r}
library(shiny)
library(dplyr)
library(ggplot2)
library(tidyr)
df <- mtcars
numeric_cols <- df %>% select(where(is.numeric))
categorical_cols <- df %>% select(where(is.factor))
ui <- fluidPage(
titlePanel(“MTCARS”),
selectInput(“num_cols”, “Columnas Numéricas”,
names(numeric_cols), multiple = TRUE),
selectInput(“cat_col”, “Columna Categórica”,
names(categorical_cols)),
plotOutput(“myplot”)
)
server <- function(input, output) { Dataframe <- reactive({ df %>% select(input$num_cols, input$cat_col)
})
long_data <- reactive({ Dataframe() %>%
gather(key = “variable”, value = “value”, -input$cat_col)
})
my_plot <- reactive({
ggplot(long_data(), aes(x = value, y = !!sym(input$cat_col), color = !!sym(input$cat_col))) +
geom_point() +
stat_chull(geom = “polygon”, alpha = 0.2)
})
output$myplot <- renderPlot({
my_plot()
})
}
shinyApp(ui, server)
“`
Aquí,
input$num_cols
es un vector de nombres de columnas numéricas elegidas, einput$cat_col
es el nombre de la columna categórica elegida. La función!!sym()
se utiliza para evaluar la entrada como un símbolo en el código de ggplot. La funcióngather
se utiliza para convertir las columnas numéricas a formato largo, con los nombres de columna almacenados en una nueva variable llamadavariable
y los valores almacenados en una nueva variable llamadavalue
. Se añade la capastat_chull
para crear el casco convexo para cada categoría en la columna categórica. El objeto ggplot resultante se retorna y se muestra en la funciónplotOutput
.