ggplot:颜色根据用户定义的颜色按组分

use*_*282 11 r colors scatter-plot ggplot2 color-codes

我试图定义ggplot中绘制的点组颜色.我改编了这篇文章的代码:

根据定义的颜色代码颜色ggplot点

但是只要我有一个由同一个分组变量定义的行(而不是每行的单独颜色),代码就会失败,我无法弄清楚原因.以下是可重现的示例:

#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 
Run Code Online (Sandbox Code Playgroud)

然后数据如下所示:

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
Run Code Online (Sandbox Code Playgroud)

目标是生成一个图,其中区域'C'中的点是红色而'E'中的点是蓝色,但使用示例中的代码引用的所有内容都以红色绘制:

p <- ggplot(data=df, aes(col, D, colour = zone))+ 
  geom_point() 
p + scale_colour_manual(breaks = df$zone, values = df$color.codes)
Run Code Online (Sandbox Code Playgroud)

任何人都可以看到致命的缺陷,为什么这个代码不会以这种方式跨群组工作?
非常感谢提前

Bri*_*ggs 8

你介于两种不同的解决方案之间.

一种方法是不将颜色放入df数据框并指定zone比例调用中的颜色和所需颜色之间的映射:

ggplot(data=df, aes(col, D, colour = zone))+ 
  geom_point() +
  scale_colour_manual(values=setNames(color.codes, zone))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

请注意,这不使用color.codescolor.names来自df,也不df2直接使用(尽管它确实使用了用于制作的列df2;如果你有类似的东西df2而不是单独的列,你可以setNames(df2$color.codes, df2$zone)改为使用).

另一种方法将颜色直接映射到颜色代码和用途scale_color_identity,但是必须经过一些额外的标记才能使图例正确.

ggplot(data=df, aes(col, D, colour = color.codes)) +
  geom_point() +
  scale_colour_identity("zone", breaks=color.codes, labels=zone, guide="legend")
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

在我看来,第一个是更好的解决方案.


Sve*_*ein 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)))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述