二项分布

library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.5.3
n_list <- c(25, 50, 100)
p_list <- c(0.3, 0.5, 0.8)
df <- data.frame()

for (n in n_list) {
  for (p in p_list) {
    k <- 0:n
    dbinom <- dbinom(k, n, p)
    df <- rbind(df, data.frame(k = k, dbinom = dbinom, n=factor(n),p = factor(p)))
  }
} 

ggplot(df, aes(x = k, y = dbinom, color = p, linetype = n,linewidth = n)) +
  geom_line() + 
  scale_linetype_manual(
    name = "试验次数 n",
    values = c(
      "25" = "solid", 
      "50" = "dashed",  
      "100" = "solid"    
    )
  ) +
  scale_linewidth_manual(
    name = "试验次数 n",
    values = c(
      "25" = 1.0,  
      "50" = 1.0, 
      "100" = 0.5  
    )
  )  +
  labs(title = "二项分布:不同n和p的对比",
       x = "成功次数 k", y = "概率 P(X=k)",
       color = "成功概率 p") +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5))

泊松分布

lambda_list <- c(1:9)
k <- 0:20
df = data.frame()
for (lambda in lambda_list) {
    pois <- dpois(k, lambda = lambda)
    df <- rbind(df, data.frame(k = k, pois = pois, lambda=factor(lambda)))
}



ggplot(df, aes(x = k, y = pois, color = lambda, group = lambda)) +
  geom_line(linewidth = 0.5) +  
  scale_color_viridis_d(
    name = "参数 λ",
    end = 0.9
  ) +
  labs(
    title = "泊松分布:不同λ的对比",
    x = "事件发生次数 k",
    y = "概率 P(X=k)",
    color = "参数 λ"
  ) +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5))

负二项分布

n_list <- c(5, 10, 30)    
p_list <- c(0.3, 0.5, 0.7)
df <- data.frame()

for (n in n_list) {
  for (p in p_list) {
    k <- 0:(n*5)           
    nb <- dnbinom(k, size = n, prob = p)  
    df <- rbind(df, data.frame(k = k, nb = nb, n=factor(n),p = factor(p)))
  }
} 

ggplot(df, aes(x = k, y = nb, color = p, linetype = n,linewidth = n)) +
  geom_line() + 
  scale_linetype_manual(
    name = "目标成功次数 n",
    values = c(
      "5" = "solid", 
      "10" = "dashed",  
      "30" = "solid"    
    )
  ) +
  scale_linewidth_manual(
    name = "目标成功次数 n",
    values = c(
      "5" = 0.3,  
      "10" = 0.5, 
      "30" = 1  
    )
  )  +
  labs(title = "负二项分布:不同 n 和 p 的对比",
       x = "试验失败次数 k", y = "概率 P(X=k)",
       color = "成功概率 p") +
  theme_minimal()+
  theme(plot.title = element_text(hjust = 0.5))

正态分布

mean_list <- c(-2, 0, 2)
sigma_list <- c(0.3, 0.5, 0.8)
df <- data.frame()

for (mean in mean_list) {
  for (sigma in sigma_list) {
    x <- seq(-5, 5, length.out = 1000)
    norm <- dnorm(x, mean=mean, sd= sigma)
    df <- rbind(df, data.frame(x = x, norm = norm, mean=factor(mean),sigma = factor(sigma)))
  }
} 




ggplot(df, aes(x = x, y = norm, color = mean, linetype = sigma,linewidth = sigma)) +
  geom_line() + 
  scale_linetype_manual(
    name = "标准差σ",
    values = c(
      "0.3" = "solid", 
      "0.5" = "dashed",  
      "0.8" = "solid"    
    )
  ) +
  scale_linewidth_manual(
    name = "标准差σ",
    values = c(
      "0.3" = 0.5,  
      "0.5" = 0.5, 
      "0.8" = 0.5  
    )
  )  +
  labs(title = "正态分布:不同μ和σ的对比",
       x = "随机变量x", y = '概率密度f(x)',
       color = "均值mean") +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5))

幂律分布

alpha_list <- c(1.5,2.0, 3.0,4.0)  
xmin <- 1                     
x <- seq(xmin, 10, length.out = 1000)  
col_list <- c("red", "blue", "green",'pink')

par(mfrow = c(1, 2)) 

#线性坐标
plot(0, 0, type = "n", 
     xlim = c(xmin, 10), 
     ylim = c(0, 2),  
     main = "幂律分布(线性坐标)",
     xlab = "x", ylab = "概率密度 f(x)")

for (i in 1:length(alpha_list)) {
  alpha <- alpha_list[i]
  pdf_power <- ((alpha - 1)/xmin) * (xmin/x)^alpha  
  lines(x, pdf_power, col = col_list[i],lwd=1.5)
}


legend("topright", legend = paste0("α=", alpha_list),
       col = col_list,bty = "n")
grid(lty = 2, col = "gray")


#双对数坐标
plot(0, 0, type = "n", 
     xlim = log(range(x)), 
     ylim = c(-5, 1),
     main = "幂律分布(双对数坐标)",
     xlab = "log(x)", ylab = "log(f(x))")

for (i in 1:length(alpha_list)) {
  alpha <- alpha_list[i]
  pdf_power <- ((alpha - 1)/xmin) * (xmin/x)^alpha
  lines(log(x), log(pdf_power), col = col_list[i],lwd=1.5)
}

legend("bottomleft", legend = paste0("α=", alpha_list),
       col = col_list,  bty = "n")
grid(lty = 2, col = "gray")