首页 文章

如何为ggplot2中具有稳定映射的分类变量赋值?

提问于
浏览
148

我在上个月一直在加快速度 .

这是我的问题:

将颜色分配给ggplot2中具有稳定映射的分类变量的好方法是什么?我需要在一组图表中具有一致的颜色,这些图表具有不同的子集和不同数量的分类变量 .

例如,

plot1 <- ggplot(data, aes(xData, yData,color=categoricaldData)) + geom_line()

其中 categoricalData 有5个级别 .

然后

plot2 <- ggplot(data.subset, aes(xData.subset, yData.subset, 
                                 color=categoricaldData.subset)) + geom_line()

其中 categoricalData.subset 有3个级别 .

但是,两组中的特定级别将以不同的颜色结束,这使得更难以一起阅读图形 .

我是否需要在数据框中创建颜色矢量?或者是否有另一种方法可以为类别指定特定颜色?

5 回答

  • 157

    这是一篇很老的帖子,但我一直在寻找这个问题的答案,

    为什么不尝试类似的东西:

    scale_color_manual(values = c("foo" = "#999999", "bar" = "#E69F00"))
    

    如果你有分类值,我看不出为什么这不起作用的原因 .

  • 35

    对于像OP中的确切示例这样的简单情况,我同意Thierry _2566772有用指出另一种方法,当您尝试在多个数据帧之间保持一致的颜色方案时,这种方法变得更加容易数据框 . 如果从单独的文件中提取多个数据框中的因子级别并且并非所有因子级别都出现在每个文件中,则可能会变得单调乏味 .

    解决此问题的一种方法是创建自定义手动色标,如下所示:

    #Some test data
    dat <- data.frame(x=runif(10),y=runif(10),
            grp = rep(LETTERS[1:5],each = 2),stringsAsFactors = TRUE)
    
    #Create a custom color scale
    library(RColorBrewer)
    myColors <- brewer.pal(5,"Set1")
    names(myColors) <- levels(dat$grp)
    colScale <- scale_colour_manual(name = "grp",values = myColors)
    

    然后根据需要将颜色比例添加到绘图中:

    #One plot with all the data
    p <- ggplot(dat,aes(x,y,colour = grp)) + geom_point()
    p1 <- p + colScale
    
    #A second plot with only four of the levels
    p2 <- p %+% droplevels(subset(dat[4:10,])) + colScale
    

    第一个情节看起来像这样:

    enter image description here

    第二个情节看起来像这样:

    enter image description here

    这样,您无需记住或检查每个数据框,以确定它们具有适当的级别 .

  • 12

    malcookhis comment指出的情况相同:不幸的是answerThierry与ggplot2版本0.9.3.1不兼容 .

    png("figure_%d.png")
    set.seed(2014)
    library(ggplot2)
    dataset <- data.frame(category = rep(LETTERS[1:5], 100),
        x = rnorm(500, mean = rep(1:5, 100)),
        y = rnorm(500, mean = rep(1:5, 100)))
    dataset$fCategory <- factor(dataset$category)
    subdata <- subset(dataset, category %in% c("A", "D", "E"))
    
    ggplot(dataset, aes(x = x, y = y, colour = fCategory)) + geom_point()
    ggplot(subdata, aes(x = x, y = y, colour = fCategory)) + geom_point()
    

    这是第一个数字:

    ggplot A-E, mixed colors

    和第二个数字:

    ggplot ADE, mixed colors

    我们可以看到颜色不会保持固定,例如E从品红色切换到蓝色 .

    正如his comment中的malcookhis comment中的hadley所建议的那样,使用 limits 的代码可以正常工作:

    ggplot(subdata, aes(x = x, y = y, colour = fCategory)) +       
        geom_point() + 
        scale_colour_discrete(drop=TRUE,
            limits = levels(dataset$fCategory))
    

    给出下图,这是正确的:

    correct ggplot

    这是 sessionInfo() 的输出:

    R version 3.0.2 (2013-09-25)
    Platform: x86_64-pc-linux-gnu (64-bit)
    
    locale:
     [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
     [3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8    
     [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8   
     [7] LC_PAPER=en_US.UTF-8       LC_NAME=C                 
     [9] LC_ADDRESS=C               LC_TELEPHONE=C            
    [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       
    
    attached base packages:
    [1] methods   stats     graphics  grDevices utils     datasets  base     
    
    other attached packages:
    [1] ggplot2_0.9.3.1
    
    loaded via a namespace (and not attached):
     [1] colorspace_1.2-4   dichromat_2.0-0    digest_0.6.4       grid_3.0.2        
     [5] gtable_0.1.2       labeling_0.2       MASS_7.3-29        munsell_0.4.2     
     [9] plyr_1.8           proto_0.3-10       RColorBrewer_1.0-5 reshape2_1.2.2    
    [13] scales_0.2.3       stringr_0.6.2
    
  • 19

    最简单的解决方案是将分类变量转换为子集之前的因子 . 底线是您需要一个因子变量,在所有子集中具有完全相同的级别 .

    library(ggplot2)
    dataset <- data.frame(category = rep(LETTERS[1:5], 100), 
        x = rnorm(500, mean = rep(1:5, 100)), y = rnorm(500, mean = rep(1:5, 100)))
    dataset$fCategory <- factor(dataset$category)
    subdata <- subset(dataset, category %in% c("A", "D", "E"))
    

    带有字符变量

    ggplot(dataset, aes(x = x, y = y, colour = category)) + geom_point()
    ggplot(subdata, aes(x = x, y = y, colour = category)) + geom_point()
    

    使用因子变量

    ggplot(dataset, aes(x = x, y = y, colour = fCategory)) + geom_point()
    ggplot(subdata, aes(x = x, y = y, colour = fCategory)) + geom_point()
    
  • 4

    根据joran非常有用的答案,我能够为布尔因子( TRUEFALSE )提供稳定色标的解决方案 .

    boolColors <- as.character(c("TRUE"="#5aae61", "FALSE"="#7b3294"))
    boolScale <- scale_colour_manual(name="myboolean", values=boolColors)
    
    ggplot(myDataFrame, aes(date, duration)) + 
      geom_point(aes(colour = myboolean)) +
      boolScale
    

    由于ColorBrewer对二进制色标没有多大帮助,因此手动定义了所需的两种颜色 .

    这里 mybooleanmyDataFrame 中保持TRUE / FALSE因子的列的名称 . dateduration 是在此示例中要映射到绘图的x和y轴的列名 .

相关问题