如何指定一组线段的颜色?R ggplot2

3

如果我有示例数据并使用ggplot2的geom_segment进行绘图:

library(ggplot2)
df1 <- data.frame(p=c(1,2), f=c("A","B"))
df2 <- data.frame(p=c(3,4), f=c("C","D"))
ggplot() + 
geom_segment(data=df1, mapping=aes(x=p-0.5, xend=p+0.5, y=1, yend=1, color=f)) + 
geom_segment(data=df2, mapping=aes(x=p-0.5, xend=p+0.5, y=1, yend=1, color=f))

结果图将会是: enter image description here

我不明白为什么两个独立的geom_segment()层共享同一个图例?这种行为背后的逻辑是什么?

我该如何手动设置线条“A”和线条“B”的颜色? 我尝试使用以下命令更改它们:

ggplot() + 
geom_segment(data=df1, mapping=aes(x=p-0.5, xend=p+0.5, y=1, yend=1, color=f)) + 
scale_color_manual(values=c("A"="red", "B"="blue")) +  
geom_segment(data=df2, mapping=aes(x=p-0.5, xend=p+0.5, y=1, yend=1, color=f))

但出现了错误提示:

错误:手动刻度中的值不足。需要 4 个,但只提供了 2 个。

非常感谢您。


2
color 是一个单一的美学属性,即使您在多个几何对象中使用 color 作为美学映射,它也只会产生一个图例。scale_color_manual 要求颜色数量等于映射到颜色美学的所有变量的唯一值的数量(在这种情况下为四个)。四个值的默认颜色为 hcl(seq(15,375,length=5)[1:4], 100, 65),或者在映射到颜色的变量具有 n 个不同水平时,通用公式为 hcl(seq(15,375,length=n+1)[1:n], 100, 65) - eipi10
啊哈,谢谢eipi10。现在我明白他们为什么共享同一个图例了。 - Chuan Jiang
ggplot2内部是否使用此函数“hcl(seq(15,375,length=n+1)[1:n], 100, 65)”来提取颜色美学?据我所见,如果我只想更改其中一种颜色,我应该将其替换为其他所需值。 - Chuan Jiang
我不确定ggplot内部的具体实现方式,但这些是其用于离散值的默认颜色。但你可以替换任何期望的颜色,用于映射到颜色美学变量的任何级别。 - eipi10
1个回答

2

您可以使用scale_color_manual手动设置所有段的颜色:

ggplot() + geom_segment(data = df1,mapping = aes(x=p-0.5,xend = p + 0.5, y = 1,yend = 1, color=f)) +
    geom_segment(data = df2,mapping = aes(x=p-0.5,xend = p + 0.5, y = 1,yend = 1,color = f))+
    scale_color_manual(values=c("B"="blue", "A"="green", "D"="red","C"="yellow"))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接