如何为ggplot的嵌套循环中的绘图中的因子分配相同的颜色?

时间:2017-10-02 00:59:28

标签: r plot ggplot2 subset nested-loops

我正在尝试使用scale_fill_manual为嵌套for循环中的多个绘图中的因子指定相应的颜色。然而,由此产生的阴影最终都是黑色的。

我的整体循环如下:

for(i in seq(from=0, to=100, by=10)){
   for{j in seq(from=0, to=100, by=10)){
       print(ggplot(aes(x , y), data = df)+
        geom_point(inherit.aes = FALSE,data = subset(df,factor_x==i&factor_y==j), aes(x, y, size=point,color=Group))+
        theme_bw()}}

我正在尝试将“Group”中的每个因素分配为一致的颜色。我尝试过使用:

col<-colorRampPalette(brewer.pal(9,"Set1"))(16)

然后我将每种颜色分配给“Group”中的特定因子。

但是,在嵌套循环中使用缩放手动时,因素根本没有颜色。

for(i in seq(from=0, to=100, by=10)){
   for{j in seq(from=0, to=100, by=10)){
       print(ggplot(aes(x , y), data = df)+
        geom_point(inherit.aes = FALSE,data = subset(df,factor_x==i&factor_y==j), aes(x, y, size=point))+
        theme_bw()+scale_fill_manual(values=col)}}

如何在循环中生成的多个图表中为“组”中的分类值集成颜色方案?

1 个答案:

答案 0 :(得分:4)

我们的想法是创建一个命名的颜色向量,为您绘制的图中颜色(或填充)美学使用的因子变量的每个潜在级别指定所需的颜色。然后在scale_color_manual(或scale_fill_manual)中使用该颜色矢量来设置绘图颜色。无论用于给定绘图的特定数据帧中是否存在给定的因子水平,这都会将所需的颜色分配到所需的因子水平。

这是一个简单的例子:

library(ggplot2)

# Plotting function
pfunc = function(data, x, y, col_var, color_vec, drop=TRUE) {
  ggplot(data, aes_string(x, y, colour=col_var)) +
    geom_point(size=3) +
    scale_colour_manual(values=color_vec, drop=drop)
}

现在使用整个数据框和数据子集运行内置iris数据框的函数。

# Named vector giving desired color for each Species
col = setNames(c("green","red","blue"), levels(iris$Species))

pfunc(iris, "Petal.Width", "Petal.Length", "Species", col)
pfunc(subset(iris, Species=="versicolor"), 
      "Petal.Width", "Petal.Length", "Species", col)
pfunc(subset(iris, Species=="versicolor"), 
      "Petal.Width", "Petal.Length", "Species", col, drop=FALSE)

enter image description here

或使用diamonds数据框:

n = length(levels(diamonds$color))
col = setNames(hcl(seq(15,375,length=n+1)[1:n], 100, 65), levels(diamonds$color))

set.seed(2)
dat = diamonds[sample(1:nrow(diamonds), 200), ]

pfunc(dat, "carat", "price", "color", col)
pfunc(subset(dat, color %in% c("D","G")), "carat", "price", "color", col)
pfunc(subset(dat, color %in% c("G","I")), "carat", "price", "color", col)

enter image description here