循环更改图表颜色比例

时间:2018-12-21 02:50:46

标签: r ggplot2

我有一个数据框,数据在“变量”列中按类别组织。我想为每个类别生成一个单独的geom_point()图表,并且我希望根据“变量”列中类别的值以及每个图表的图例指定图表的颜色。我不想使用facetting来执行此操作,因为我的实际用例比该例要复杂得多。

以下是一些示例代码:

df <- rbind(data.frame(date = 1:100, value = rnorm(100, 0, 1), variable = "a_variable"),    
            data.frame(date = 1:100, value = rnorm(100, 0, 1), variable = "b_variable"))

a_list_of_colours <- list()    
a_list_of_colours[["a_variable"]] <- "red"    
a_list_of_colours[["b_variable"]] <- "blue"

循环1

a_list_of_charts <- list()   

for(i in 1:length(a_list_of_colours)){

  print(a_list_of_colours[[i]])

  a_list_of_charts[[i]] <- ggplot(df %>% 
                                    filter(variable == names(a_list_of_colours)[i]), 
                                  aes(x = date, y = value, colour = variable)) +
    geom_point(shape = 19, size = 2) +
    scale_colour_manual(values = a_list_of_colours[[names(a_list_of_colours)[i]]])

}

循环2

a_list_of_charts <- list()

for(i in 1:length(a_list_of_colours)){

  print(a_list_of_colours[[i]])

  a_list_of_charts[[i]] <- ggplot(df %>% 
                                    filter(variable == names(a_list_of_colours)[i]), 
                                  aes(x = date, y = value, colour = variable)) +
    geom_point(data = df, aes(x = date, y = value, colour = variable),
               shape = 19, size = 2, 
               colour = a_list_of_colours[[names(a_list_of_colours)[i]]])
}

循环3

a_list_of_charts <- list()

for(i in 1:length(a_list_of_colours)){

  print(a_list_of_colours[[i]])

  a_list_of_charts[[i]] <- ggplot() +    
    geom_point(data = df %>% 
                 filter(variable == names(a_list_of_colours)[i]), 
               aes(x = date, y = value, colour = variable),
               shape = 19, size = 2,
               colour = a_list_of_colours[[names(a_list_of_colours)[i]]])
}

我希望这些循环中的任何一个都能产生两个图表,一个为红色,一个为蓝点。我主要是想知道为什么将值传递给scale_colour_manual()的第一个循环不起作用并且总是生成蓝色图表。但是,我也对解决方案感兴趣。我奇怪地无法通过将变量传递给geom_point()来产生后两个循环的图例。任何想法都很感激。

1 个答案:

答案 0 :(得分:0)

循环1

尝试将您的ggplot2软件包版本更新为最新版本(3.1.0),它应该可以正常工作(至少在我的产品上如此)。怀疑是由于this change导致了强制参数,尽管我不太了解其基本细节。

循环2

此代码有一个问题:当在ggplot()geom_point()中都提供数据参数时,后者将覆盖前者,因此实际上是在两个图中绘制整个数据集。 >

a_list_of_charts[[i]] <- ggplot(df %>% 
                                  filter(variable == names(a_list_of_colours)[i]), 
                                aes(x = date, y = value, colour = variable)) +
  geom_point(data = df, aes(x = date, y = value, colour = variable),
             shape = 19, size = 2, 
             colour = a_list_of_colours[[names(a_list_of_colours)[i]]])

循环3

此代码可显示具有正确颜色的正确数据子集。虽然如果您也想使用图例,则最好使用Loop 1(假设您能够更新软件包的版本)。