在R中绘制分布曲线及分段函数曲线的替代方案咨询
Hey there! Let's tackle your two R plotting questions with practical, easy-to-follow examples. I'll keep things straightforward so you can adapt the code to your needs.
There are two main approaches here: using R's base plotting system, or the popular ggplot2 package. Let's cover both with concrete examples.
Using Base R
For common distributions (like normal, binomial, etc.), generate a sequence of x-values, calculate their density, then plot the curve. Here's a standard normal distribution example:
# Generate x-values spanning 3 standard deviations from the mean x <- seq(-3, 3, length.out = 1000) # Calculate the probability density function (PDF) for normal distribution y <- dnorm(x, mean = 0, sd = 1) # Plot the curve plot(x, y, type = "l", lwd = 2, col = "blue", xlab = "x", ylab = "Density", main = "Standard Normal Distribution") # Optional: Add a histogram to compare with simulated empirical data set.seed(123) sample_data <- rnorm(1000) hist(sample_data, prob = TRUE, add = TRUE, col = rgb(0,0,1,0.2))
For custom distributions, just replace dnorm() with your own density function.
Using ggplot2
If you want a more polished, customizable plot, ggplot2 is your go-to. Here's the same normal distribution example:
library(ggplot2) ggplot(data.frame(x = x), aes(x = x)) + stat_function(fun = dnorm, args = list(mean = 0, sd = 1), color = "blue", linewidth = 1.2) + labs(x = "x", y = "Density", title = "Standard Normal Distribution") + theme_minimal() # To overlay a histogram with the curve: ggplot(data.frame(sample = sample_data), aes(x = sample)) + geom_histogram(aes(y = after_stat(density)), bins = 30, fill = "blue", alpha = 0.2) + stat_function(fun = dnorm, args = list(mean = 0, sd = 1), color = "darkblue", linewidth = 1) + theme_minimal()
First, let's restate your function clearly:
f(x) = 0, when x < 0
f(x) = x², when 0 ≤ x ≤ ∛3 (~1.442)
f(x) = 1, when x > ∛3
Here are 4 practical, easy-to-implement alternatives to plot this curve:
Alternative 1: Nested ifelse() for Quick Calculation
This is the simplest method for small numbers of segments:
# Define the critical point cube_root_3 <- 3^(1/3) # Generate x-values covering all segments x <- seq(-2, 3, length.out = 1000) # Calculate y-values with nested ifelse y <- ifelse(x < 0, 0, ifelse(x <= cube_root_3, x^2, 1)) # Base R plot plot(x, y, type = "l", lwd = 2, col = "darkgreen", xlab = "x", ylab = "f(x)", main = "Piecewise Function") # Or ggplot2 version ggplot(data.frame(x = x, y = y), aes(x, y)) + geom_line(color = "darkgreen", linewidth = 1.2) + theme_minimal()
Alternative 2: dplyr::case_when() for Readability
If you might add more segments later, case_when() makes the logic much easier to read:
library(dplyr) df <- data.frame(x = x) %>% mutate(y = case_when( x < 0 ~ 0, x <= cube_root_3 ~ x^2, TRUE ~ 1 # Catch-all for remaining values )) ggplot(df, aes(x, y)) + geom_line(color = "purple", linewidth = 1.2) + theme_minimal()
Alternative 3: Split Data + Combine for Precision Control
This method lets you set different precision for each segment, or style them separately:
# Create separate x sequences for each segment x1 <- seq(-2, 0, length.out = 300) # More points for smoothness if needed x2 <- seq(0, cube_root_3, length.out = 400) x3 <- seq(cube_root_3, 3, length.out = 300) # Calculate corresponding y-values y1 <- rep(0, length(x1)) y2 <- x2^2 y3 <- rep(1, length(x3)) # Combine and plot x_combined <- c(x1, x2, x3) y_combined <- c(y1, y2, y3) plot(x_combined, y_combined, type = "l", lwd = 2, col = "orange", xlab = "x", ylab = "f(x)", main = "Piecewise Function")
Alternative 4: Segmented Plotting with Custom Styles
If you want to highlight each segment with different colors or line types, this approach works perfectly:
# Create separate data frames for each segment df1 <- data.frame(x = seq(-2, 0, length.out = 300), y = 0, segment = "x < 0") df2 <- data.frame(x = seq(0, cube_root_3, length.out = 400), y = x^2, segment = "0 ≤ x ≤ ∛3") df3 <- data.frame(x = seq(cube_root_3, 3, length.out = 300), y = 1, segment = "x > ∛3") # Combine all data df_combined <- rbind(df1, df2, df3) # Plot with distinct colors for each segment ggplot(df_combined, aes(x, y, color = segment, linetype = segment)) + geom_line(linewidth = 1.2) + scale_color_manual(values = c("red", "green", "blue")) + theme_minimal() + labs(title = "Piecewise Function with Highlighted Segments")
内容的提问来源于stack exchange,提问作者Muradim

