R语言ggplot绘制三个后验分布添加标签时scale_colour_manual失效求助
问题原因
scale_colour_manual 不生效的核心原因是你当前代码中三条线的颜色是作为 geom_line 的固定参数设置,没有传入 aes() 完成变量映射,ggplot 的配色调整函数仅对 aes() 内的映射变量生效。
可行解决方案
方案1:转换为长格式数据(更符合ggplot语法规范,推荐)
该方案将宽表数据转换为长表,天然适配ggplot的分组映射逻辑,后续增减分布、修改标签都更便捷。
library(ggplot2) library(tidyr) x <- seq(-10, 15, 0.01) # 先验权重 w1 <- 0.6; w2 <- 0.2; w3 <- 0.2 # 计算各分量密度 d1 <- dnorm(x, mean=4, sd=2) d2 <- dnorm(x, mean=6, sd=3) d3 <- dnorm(x, mean=5, sd=2) p_x <- w1*d1 + w2*d2 + w3*d3 # 计算后验分布 p1 <- d1*w1/p_x p2 <- d2*w2/p_x p3 <- d3*w3/p_x df <- data.frame(x, 后验分布1 = p1, 后验分布2 = p2, 后验分布3 = p3) # 转换为长格式数据 df_long <- pivot_longer(df, cols = -x, names_to = "分组", values_to = "后验概率") # 绘图 ggplot(df_long, aes(x = x, y = 后验概率, color = 分组)) + geom_line() + ylab("后验分布") + scale_colour_manual( name = "分布类型", values = c("后验分布1" = "red", "后验分布2" = "blue", "后验分布3" = "black") )
方案2:不修改原始数据结构
直接在每个geom_line的aes()内添加颜色映射即可。
library(ggplot2) x <- seq(-10, 15, 0.01) # 先验权重 w1 <- 0.6; w2 <- 0.2; w3 <- 0.2 # 计算各分量密度 d1 <- dnorm(x, mean=4, sd=2) d2 <- dnorm(x, mean=6, sd=3) d3 <- dnorm(x, mean=5, sd=2) p_x <- w1*d1 + w2*d2 + w3*d3 # 计算后验分布 p1 <- d1*w1/p_x p2 <- d2*w2/p_x p3 <- d3*w3/p_x df <- data.frame(x, p1, p2, p3) # 绘图 ggplot(df, aes(x)) + geom_line(aes(y=p1, color='后验分布1')) + geom_line(aes(y=p2, color='后验分布2')) + geom_line(aes(y=p3, color='后验分布3')) + ylab('后验分布') + scale_colour_manual( name = "分布类型", values = c("后验分布1" = "red", "后验分布2" = "blue", "后验分布3" = "black") )
内容的提问来源于stack exchange,提问作者Fox_Summer
相关产品推荐
相关产品推荐

