Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如何为ggplot2中具有稳定映射的分类变量指定颜色?_R_Ggplot2 - Fatal编程技术网

R 如何为ggplot2中具有稳定映射的分类变量指定颜色?

R 如何为ggplot2中具有稳定映射的分类变量指定颜色?,r,ggplot2,R,Ggplot2,上个月我一直在学习R 我的问题是: 为ggplot2中具有稳定映射的分类变量指定颜色的好方法是什么?我需要在一组具有不同子集和不同分类变量数的图中使用一致的颜色 比如说, plot1 <- ggplot(data, aes(xData, yData,color=categoricaldData)) + geom_line() 其中,categoricalData.subset有3个级别 但是,两个集合中的特定级别最终将使用不同的颜色,这使得一起读取图形变得更加困难 我是否需要在数据帧中创

上个月我一直在学习R

我的问题是:

为ggplot2中具有稳定映射的分类变量指定颜色的好方法是什么?我需要在一组具有不同子集和不同分类变量数的图中使用一致的颜色

比如说,

plot1 <- ggplot(data, aes(xData, yData,color=categoricaldData)) + geom_line()
其中,
categoricalData.subset
有3个级别

但是,两个集合中的特定级别最终将使用不同的颜色,这使得一起读取图形变得更加困难


我是否需要在数据帧中创建颜色向量?或者有没有其他方法为类别指定特定的颜色?

对于简单的情况,如OP中的确切示例,我同意Thierry的答案是最好的。然而,我认为指出另一种方法是很有用的,当您试图在多个数据帧之间保持一致的配色方案时,这种方法变得更容易,而这些配色方案并非都是通过对单个大数据帧进行子集设置而获得的。如果从单独的文件中提取多个数据帧中的因子级别,并且并非所有因子级别都显示在每个文件中,则管理多个数据帧中的因子级别可能会变得单调乏味

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

#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)
#一些测试数据

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

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()

我的情况与in所指出的相同:不幸的是,by不适用于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()
给出了正确的下图:

这是来自
sessionInfo()
的输出:


基于joran非常有用的回答,我能够为布尔因子(
TRUE
FALSE
)提供稳定色阶的解决方案


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

为什么不试试这样的方法呢:

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

如果您有分类值,我看不出这不起作用的原因。

这会起作用,但可能过于复杂。我认为你不需要为此创建手动比例。你所需要的只是一个在所有绘图之间通用的
因子。@Andrie-对于单个子集,是的。但是,如果你处理大量的数据集,而这些数据集并不是全部由一个原始数据帧子集创建的,我发现这个策略要简单得多。@joran谢谢joran。这对我有用!它创建了一个具有正确数量因子的图例。我喜欢这种方法,并且在不同的数据集之间获得颜色映射非常值得这三行代码!我在
fillScale中添加了最简单的方法是使用limitscold,并在此上下文中提供了一个示例Hadley?“我不知道如何使用带系数的限制。”蒂埃里,谢谢。我很高兴在我的第一篇文章中得到回复。感谢Thierry或添加了我应该在我的帖子中添加的可复制代码…我的分类变量是正确的类型因子。另一个问题是我不希望图例显示未使用的因子。R在构建图例时忽略未使用的字符变量。然而,未使用的因素仍然存在。如果我使用:subdata$category@Thierry-在我的手中,使用ggplot2_0.9.3.1,将它们丢弃,那么这个方法(不再)起作用;两个图中指定给fCategory的颜色不同。然而,令人高兴的是,@wintour,我发现@hadley建议
+scale\u color\u discrete(drop=TRUE,limits=levels(dataset$fCategory))
来保留颜色与因素的关联,但是,这是有效的,除了在我手中,没有得到尊重(我希望它能从图例中删除级别)。德拉特。。。还是我?@malcook,不是drop=TRUE,你需要通过“中断”指定你想要保持的级别:你应该将此作为一个新问题发布,引用此问题并说明为什么这里的解决方案不起作用。有人问了一个类似的问题,但我想指出的是,被接受的答案很好。因此我知道这很古老,但我想知道是否有一种方法可以做到这一点,而不必在图例中添加额外的颜色。这实际上是Joran的答案,但使用
myColors,Joran的答案不会硬编码颜色的值。在某些情况下,您需要为给定的因素指定一个特定的颜色值。虽然我在某些情况下得到了“硬编码”的缺点,但我认为抽象开发人员/编码人员添加的层往往会使他们的工作变得不易访问,而不是更多。在这种情况下,意图是100%清楚的。另外,很容易想到如何创建一个实用函数,该函数在本例中进行扩展,返回特定颜色的命名向量。另一种方法是对列应用“as.character()”。这将使它成为一个字符串列,可以很好地与scale_*\u手册配合使用
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(subdata, aes(x = x, y = y, colour = fCategory)) +       
    geom_point() + 
    scale_colour_discrete(drop=TRUE,
        limits = levels(dataset$fCategory))
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 
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
scale_color_manual(values = c("foo" = "#999999", "bar" = "#E69F00"))