You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:基于R语言ggplot包绘制多因子驱动的动态图形

Hey there! Let's tackle this dynamic plotting problem with ggplot2 in R. You want to create visuals that update as średnia1 and odchylenie1 change—we've got two solid approaches for you: interactive plots with Shiny (great for real-time user adjustment) and animated plots with gganimate (perfect for showing trends across all parameter combinations). Let's dive in!

First, a quick fix for your initial code: I noticed a typo in the names(params) line—you had odchyelnie2 instead of odchylenie2 to match your parameter name. We'll use the corrected version in the examples below.


1. Interactive Dynamic Plots with Shiny

If you want to let users tweak średnia1 and odchylenie1 in real time and see the plot update instantly, Shiny is your go-to tool. Here's a complete, ready-to-run example:

# Load required packages
library(shiny)
library(ggplot2)
library(dplyr)

# Define the UI (user interface)
ui <- fluidPage(
  titlePanel("Dynamic ggplot2 Plot"),
  sidebarLayout(
    sidebarPanel(
      # Slider for adjusting średnia1
      sliderInput("srednia1", "Wybierz średnią 1:",
                  min = -7, max = 7, value = 0, step = 1),
      # Slider for adjusting odchylenie1
      sliderInput("odchylenie1", "Wybierz odchylenie 1:",
                  min = 1, max = 10, value = 2, step = 1),
      # Display fixed parameters for reference
      tags$hr(),
      tags$p("Parametry stałe:"),
      tags$p("średnia2 = 2, odchylenie2 = 2"),
      tags$p("prob = 0.7, sample_l = 10, N = 100")
    ),
    mainPanel(
      plotOutput("dynamicPlot")
    )
  )
)

# Define the server logic
server <- function(input, output) {
  # Reactive data generation (updates when sliders change)
  reactive_data <- reactive({
    # Fixed parameters from your setup
    alpha <- 0.05
    N <- 100
    srednia2 <- 2
    odchylenie2 <- 2
    
    # Generate sample data with selected parameters
    set.seed(123) # For reproducibility
    data.frame(
      group = rep(c("Grupa 1", "Grupa 2"), each = N),
      value = c(
        rnorm(N, mean = input$srednia1, sd = input$odchylenie1),
        rnorm(N, mean = srednia2, sd = odchylenie2)
      )
    )
  })
  
  # Render the dynamic plot
  output$dynamicPlot <- renderPlot({
    ggplot(reactive_data(), aes(x = value, fill = group)) +
      geom_density(alpha = 0.5) + # Swap this for geom_histogram/boxplot if needed
      labs(
        title = paste("Rozkład gęstości: średnia1 =", input$srednia1, ", odchylenie1 =", input$odchylenie1),
        x = "Wartość", y = "Gęstość", fill = "Grupa"
      ) +
      theme_minimal()
  })
}

# Run the Shiny app
shinyApp(ui = ui, server = server)

How this works:

  • The sidebar has sliders for your two variable parameters. Every time you adjust them, the reactive data frame regenerates with the new values.
  • The plot updates instantly to reflect the new data. You can swap geom_density() for any ggplot2 geom (like geom_histogram() or geom_boxplot()) based on your visualization needs.

2. Animated Plots with gganimate

If you want to create a smooth animation that cycles through all combinations of średnia1 and odchylenie1, gganimate is perfect. This is great for showing how the distribution changes across the entire parameter range:

# Load required packages
library(ggplot2)
library(gganimate)
library(dplyr)

# Your initial parameter setup (with corrected column names)
alpha <- 0.05
N <- 100
sample_l <- 10
srednia1 <- seq(-7, 7, by = 1)
odchylenie1 <- seq(1, 10, by = 1)
srednia2 <- 2
odchylenie2 <- 2
prob <- 0.7

# Expand grid to get all parameter combinations
params <- expand.grid(
  dlugość = sample_l,
  średnia1 = srednia1,
  odchylenie1 = odchylenie1,
  średnia2 = srednia2,
  odchylenie2 = odchylenie2,
  prob = prob
)
# Fixed typo in column names
names(params) <- c("dlugość", "średnia1", "odchylenie1", "średnia2", "odchylenie2", "prob")

# Generate full dataset for all parameter combinations
set.seed(123)
full_data <- params %>%
  group_by(średnia1, odchylenie1) %>%
  reframe(
    group = rep(c("Grupa 1", "Grupa 2"), each = N),
    value = c(
      rnorm(N, mean = średnia1, sd = odchylenie1),
      rnorm(N, mean = srednia2, sd = odchylenie2)
    )
  )

# Create the base plot
base_plot <- ggplot(full_data, aes(x = value, fill = group)) +
  geom_density(alpha = 0.5) +
  labs(x = "Wartość", y = "Gęstość", fill = "Grupa") +
  theme_minimal() +
  # Transition through all parameter combinations
  transition_states(
    states = interaction(średnia1, odchylenie1),
    transition_length = 1, # Speed of transition between states
    state_length = 2       # Time spent on each state
  ) +
  # Dynamic title showing current parameters
  ggtitle(
    "Rozkład gęstości: średnia1 = {closest_state[1]}, odchylenie1 = {closest_state[2]}",
    subtitle = "Przejście między parametrami"
  ) +
  # Smooth animation easing
  ease_aes("linear")

# Render the animation
animate(base_plot, nframes = nrow(params), fps = 5)

How this works:

  • We generate a dataset for every combination of średnia1 and odchylenie1.
  • The animation transitions through each combination, with a title that updates to show the current parameter values.
  • Adjust nframes (total number of frames) and fps (frames per second) to control the animation speed and smoothness.

内容的提问来源于stack exchange,提问作者Kasia Kasperek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:42:27