【问题标题】:Scale for aesthetics used in the plot | ggplot2情节中使用的美学比例| ggplot2
【发布时间】:2025-12-03 06:40:01
【问题描述】:

我是 ggplot2 的绝对初学者。我对 ggplot2 感到沮丧并开始阅读 Wickham 的这本很棒的书。他说“情节中使用的每一种美学都需要一个比例。”。

所以,我做了以下事情:

尝试 1:

 huron <- data.frame(year = 1875:1972, level = as.numeric(LakeHuron))
   ggplot(huron, aes(year)) +
     geom_line(aes(y = level + 5, color = "y+5")) +
     scale_color_manual(values = c("orange")) +
     geom_line(aes(y = level - 5, color = "y-5")) +
     scale_color_manual(values = "blue") 

运行此程序时,我收到一条错误消息" insufficient value of colors provided."

我用谷歌搜索了这个并在 SO 上找到了以下线程:ggplot2 Error: Insufficient values in manual scale。在原始帖子中,他/她为什么添加额外的颜色是有道理的。但是,我不确定为什么在我的示例中会出现这种情况,因为我有两层,每一层都有自己的美感。

试试 2

此代码将起作用:(如我可以看到两种不同颜色的两条线图和一个图例--这是我的目标

ggplot(huron, aes(year)) +
     geom_line(aes(y = level + 5, color = "y+5")) +
     scale_color_manual(values = c("orange", "blue")) + #Added another color here.
     geom_line(aes(y = level - 5, color = "y-5")) 

令人惊讶的是,上面的代码显示了一些奇怪的东西——我有两种美学和一种尺度。

问题 1: 这很令人惊讶,因为我们可以看到有两个 geom 但只有一个比例。正确的?我知道威克姆不会错。那么,我错过了什么?

问题 2: 另外,出于好奇,如果我有多个几何图形,每个几何图形都具有一种美学,如上述情况,并且每个几何图形都有一个比例,ggplot 将如何知道哪个比例与哪个几何?如,ggplot2 如何知道 layer1 是否与 color = red 一起使用 scale 而 layer2 是否与 color = blue 一起使用?

非常感谢您的想法。提前致谢。


【问题讨论】:

  • 你有一种审美。您通过第二次调用 aes 添加两个它并不会改变您仅定义(一个)颜色美学映射。 ggplot2 图中只能有一个色标。
  • @Roland 感谢您的帮助。所以,如果我理解正确的话——无论我拥有多少美学,最多只能有一个色阶。但是,如果我想改变不同美学的颜色怎么办——在这个例子中:ggplot(mpg, aes(displ, hwy)) + geom_point(aes(colour = class)) + geom_smooth(method = "lm", se = FALSE, color = "red") 在这里,我有两种美学的不同颜色。不是吗?
  • 在本例中,您有一个美学映射(class 映射到颜色,只有这会产生图例)。在geom_smooth 中,您不使用aes,只定义“手动”颜色。
  • @Roland 我明白了。谢谢。我想我明白了。我在上面的示例中摆脱了审美,因为它没有解决任何目的:a)我无法将lm 线的颜色变为红色 b)我没有看到图例。这是带有aes() 的代码:ggplot(mpg, aes(displ, hwy)) + geom_point(aes(colour = class)) + geom_smooth(method = "lm", se = FALSE, aes(color = "red")) 你认为你可以指导我如何让lm 的图例和颜色更改为“红色”而不是默认颜色。我一无所知。

标签: r ggplot2


【解决方案1】:

回答cmets中的具体问题:

如果要强制指定颜色,需要使用scale_color_manual。顾名思义,这需要一些手动操作。

library(ggplot2)

#default colors
#http://*.com/a/8197703/1412059
gg_color_hue <- function(n) {
  hues = seq(15, 375, length = n + 1)
  hcl(h = hues, l = 65, c = 100)[1:n]
}

ggplot(mpg, aes(displ, hwy)) + 
  geom_point(aes(colour = class)) + 
  geom_smooth(method = "lm", se = FALSE, aes(color = "model")) +
  scale_color_manual(values = setNames(c(gg_color_hue(length(unique(mpg$class))), "red"),
                                       c(unique(mpg$class), "model")))

但是,我会为线条类型使用额外的美感。

ggplot(mpg, aes(displ, hwy)) + 
  geom_point(aes(colour = class)) + 
  geom_smooth(method = "lm", se = FALSE, aes(linetype = "model"), color = "red")

【讨论】:

  • 太棒了。我想使用 override.aes 来显示图例:ptry&lt;-ggplot(mpg, aes(displ, hwy)) + geom_point(aes(colour = class)) + geom_smooth(method = "lm", se = FALSE, aes(color = "lm") ) + scale_color_manual("Direction",values = c("lm" = "purple", "2seater" = "green", "compact" = "blue", "midsize"="yellow", "minivan" = "magenta", "pickup" ="orange", "subcompact"="cyan", "suv"="red")) 然后,我会覆盖图例:ptry + guides(guide_legend(override.aes = list(linetype = c(rep("blank",2),"solid",rep("solid",5))),shape = c(rep(16, 2), NA, rep(16, 5))))。这不起作用。
  • @Roland--你能帮我理解上面 cmets 部分的代码有什么问题吗?如果代码不清楚,我很抱歉。我可以在上面的问题中添加它。请告诉我。
  • 如果您有新问题,请提出新问题。我不知道您要达到什么目标,因此不知道“不起作用”是什么意思。
  • @Roland--抱歉不清楚。我在 cmets 部分的空间不足。我正在尝试实现与您相同的图表,即线条和因子颜色具有单独的图例。使用代码的第一部分,我能够显示颜色和 lm 线的图例。但是,有一些问题 a) 图例按字母顺序排列,与您的不同。 b) 点有一条线并且不是实心的。 c) lm 线在图例中有一个点。让我在上面添加我的代码——我正在尝试做的事情。和上面的问题一样。
  • 这变成了一个变色龙问题。我将不得不解散。如果您需要进一步的帮助,请提出一个(新的)重点明确的具体问题,并提供清晰完整的问题描述。