【问题标题】:ggplot: colour points by groups based on user defined coloursggplot:根据用户定义的颜色按组着色点
【发布时间】:2014-02-03 20:16:14
【问题描述】:

我正在尝试定义在 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)

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

【问题讨论】:

    标签: r colors ggplot2 scatter-plot color-codes


    【解决方案1】:

    您介于两种不同的解决方案之间。

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

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

    请注意,这不会使用来自dfcolor.codescolor.names,也不会直接使用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")
    

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

    【讨论】:

      【解决方案2】:

      如果您使用uniqueas.character,它会起作用:

      ggplot(data = df, aes(col, D, colour = zone))+ 
        geom_point() +
        scale_colour_manual(breaks = df$zone, 
                            values = unique(as.character(df$color.codes)))
      

      【讨论】:

        【解决方案3】:

        Sven 领先我几秒,但略有不同:

        df.unique <- unique(df[, c("zone", "color.names")])
        p + scale_colour_manual(breaks = df.unique$zone, values = as.character(df.unique$color.names))
        

        【讨论】:

          猜你喜欢
          • 2012-04-07
          • 1970-01-01
          • 2021-09-05
          • 2021-12-31
          • 2017-02-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多