如何根据我的分组值而不是 R 中 ggplot 中的填充值更改颜色?

How can I change the color based on my grouping value instead of fill value in ggplot in R?

我想根据分组值或单独更改箱线图的颜色,而不是 ggplot 中的填充值。我怎样才能做到这一点?我需要定义 fill 变量,以便能够按照我的意图将组细分为类型,但我似乎无法再控制颜色了。

这是一些示例数据以及我如何定义绘图:

library(ggplot2)

data <- data.frame( id    = rep(1:120),
                    group = as.factor(rep(1:3, times = 40)), 
                    type  = as.factor(rep(1:2, times = 60)), 
                    value = rnorm(120)+1)

ggplot(data, aes(x = group, y = value, fill = type)) +
  geom_boxplot(aes(fill = type)) +
  geom_point(aes(fill = type), position = position_jitterdodge(dodge.width = 0.65, jitter.width = 0.1, jitter.height = 0.1))

生成此图像的结果:

现在颜色基于“类型”分组。但我想分别控制 6 个单独的箱线图。例如,我想像这样给它们上色:

colors <- c("#b76e79", "#80a3dd",
            "#a5bf9f", "#e3f0cd",
            "#8a9a5b", "#ffdead")

添加 scale_fill_manual 似乎没有按我想要的方式工作。

    ggplot(data, aes(x = group, y = value, fill = type)) +
      geom_boxplot(aes(fill = type)) +
      geom_point(aes(fill = type), position = position_jitterdodge(dodge.width = 0.65, jitter.width = 0.1, jitter.height = 0.1)) + 
scale_fill_manual(values = colors)

有什么建议吗?

我们通过 'group'、'type' 的 interaction 创建一个新列,并在 scale_fill_manual

中使用它
library(dplyr)
library(ggplot2)
data <- data %>%
      mutate(grptype = interaction(group, type)) 
gg <-  ggplot(data, aes(x = group, y = value, fill = grptype)) +
      geom_boxplot(aes(fill = grptype)) +
      geom_point(aes(fill = grptype), position = position_jitterdodge(dodge.width = 0.65, jitter.width = 0.1, jitter.height = 0.1)) 
      
colors <- c("#b76e79", "#80a3dd",
            "#a5bf9f", "#e3f0cd",
            "#8a9a5b", "#ffdead")
  
gg + 
    scale_fill_manual(name="grptype", 
                             labels = levels(data$grptype),
                             values = setNames(colors, levels(data$grptype))) +


     theme(legend.title = element_text(size=12, color = "black", face="bold"),
                                       legend.justification=c(0,1), 
                                       legend.position=c(0.05, 0.95),
                                       legend.background = element_blank(),
                                       legend.key = element_blank())
    

-输出