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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 02:48:04