我正在尝试定义ggplot中绘制的点组颜色。我改编了这篇文章的代码:
Color ggplot points based on defined color codes
但是只要我有一个由同一个分组变量定义的行(而不是每行的单独颜色),代码就会失败,我无法弄清楚原因。以下是一个可重复的例子:
#create some data
zone <- c("E","E","C","C","C","E","E") #grouping variable
col <- c(50,100,150,200,250,300,350) #x variable
D <- c(.4,.45,.20,.22,.30,.31,.35) #y variable
df1 <- data.frame(zone, D, col); df1
#create a colour scheme based on grouping variable 'zone'
zone <-c("E","C")
color.codes<-as.character(c("#3399FF", "#FF0000"))
color.names<-c("blue", "red")
df2=data.frame(zone, color.codes, color.names); df2
# merge color specifications with data
df <-merge(df1,df2, by=("zone"), all.x=TRUE, all.y=TRUE); df
然后数据如下:
zone D col color.codes color.names
C 0.20 150 #FF0000 red
C 0.22 200 #FF0000 red
C 0.30 250 #FF0000 red
E 0.40 50 #3399FF blue
E 0.45 100 #3399FF blue
E 0.31 300 #3399FF blue
E 0.35 350 #3399FF blue
目标是生成一个图,其中区域'C'中的点为红色,而'E'中的点为蓝色,但使用示例中的代码引用的所有内容均以红色绘制:
p <- ggplot(data=df, aes(col, D, colour = zone))+
geom_point()
p + scale_colour_manual(breaks = df$zone, values = df$color.codes)
任何人都可以看到致命的缺陷,为什么这段代码不能以这种方式跨群体工作? 非常感谢提前
答案 0 :(得分:6)
你介于两种不同的解决方案之间。
一种方法是不将颜色放入df
数据框,并在比例调用中指定zone
与所需颜色之间的映射:
ggplot(data=df, aes(col, D, colour = zone))+
geom_point() +
scale_colour_manual(values=setNames(color.codes, zone))
请注意,这不会使用color.codes
中的color.names
或df
,也不会直接使用df2
(尽管它确实使用了用于生成{的列{1}};如果您有类似df2
的内容,而不是单独的列,则可以使用df2
代替。
另一种方法将颜色直接映射到颜色代码并使用setNames(df2$color.codes, df2$zone)
,但是必须经过一些额外的标记才能使图例正确。
scale_color_identity
在我看来,第一个是更好的解决方案。
答案 1 :(得分:5)
如果您使用unique
和as.character
:
ggplot(data = df, aes(col, D, colour = zone))+
geom_point() +
scale_colour_manual(breaks = df$zone,
values = unique(as.character(df$color.codes)))
答案 2 :(得分:0)
df.unique <- unique(df[, c("zone", "color.names")])
p + scale_colour_manual(breaks = df.unique$zone, values = as.character(df.unique$color.names))