R ggplot2 boxplot按2个因素排序并分配颜色

R ggplot2 boxplot order by 2 factors and assign colors

我的数据格式如下:

name          site  numb  env        value     order1  order2 color
K_005_AllHuman  K   5     human       0.02941166    1   1   black
K_005_bacteria  K   5     bacteria    0.02941166    1   2   grey
K_005_oral      K   5     oral        0.02941166    1   3   blue
K_005_env       K   6     environment 0.02941166    1   4   green
K_006_AllHuman  K   6     human       0.02941166    1   1   black
K_006_bacteria  K   6     bacteria    0.02941166    1   2   grey
K_006_oral      K   6     oral        0.02941166    1   3   blue
K_006_env       K   6     environment 0.02945052    1   4   green
K_006_pathogen  K   6     pathogen    0.02945052    1   5   red
K_013_AllHuman  L   13    human       0.02928835    2   1   black
K_013_bacteria  L   13    bacteria    0.02870488    2   2   grey
K_013_oral      L   13    oral        0.02870488    2   3   blue
K_013_env       L   13    environment 0.0283742     2   4   green
K_023_AllHuman  L   23    human       0.0283742     2   1   black
K_023_bacteria  L   23    bacteria    0.0283742     2   2   grey
K_023_oral      L   23    oral        0.0283742     2   3   blue
K_023_env       L   23    environment 0.0283742     2   4   green
K_023_pathogen  L   23    pathogen    0.0283742     2   5   red

我想在箱线图中绘制数据,这样箱子就按站点名称排序,在此,它们按 numb 列排序,最后它们遵循 env 列的排序。最后,我想将颜色分配给颜色列中的框。

我设法产生了顺序,但情节看起来仍然不像我想要的那样(更不用说颜色了,当手动分配时,颜色会完全混合,因为每个样本并不总是有所有的env 列的实际水平)。

这是我到目前为止生成的代码:

    c_df$name <- factor(c_df$name, levels = c_df$name[order(c_df$numb)])
c_df$site <- factor(c_df$site, levels = c_df$site[order(c_df$order1)])
c_df$env <- factor(c_df$env, levels = c_df$env[order(c_df$order2)])


p <- ggplot(data = c_df, aes(x = name, y = value, fill=env)) + 
     geom_boxplot(outlier.size=NA) + theme_bw() 
p + theme(axis.title.x =element_blank(), 
          axis.text.x = element_text(angle = 90, hjust = 1, size =12), 
          legend.position="none") + 
     ggtitle("DeltaD") +ylab(expression(delta[d]))

在下图中,为了获得所需的排序,我将 name 转换为一个因子,然后按 name 然后 site 然后 env 排序。

为了获得所需的颜色,我使用 scale_fill_manual 将所需的颜色映射到 env 的每个可能值。添加带有颜色名称的列不起作用,因为 ggplot 无法从数据中获取颜色名称。相反,它将数据列中的类别映射到所有分类变量都相同的默认调色板,而不管这些变量的值恰好被称为什么。要将颜色设置为不同的值,您需要使用 scale_fill_*** 函数之一。

此外,在数据的下半部分,name 似乎应该以 "L" 开头,而不是 "K",所以我进行了更改。我认为您不需要 order1order2color 列。

读取示例数据的代码位于此答案的底部。

# Bulk up data frame so that we'll have more than one measurement per boxplot    
c_df = rbind(c_df,c_df,c_df,c_df)
c_df$value = rnorm(nrow(c_df), 10, 5)

# Order name by site, numb, and env
c_df = c_df[order(c_df$site, c_df$numb, c_df$env),]
c_df$name = factor(c_df$name, levels=unique(c_df$name))

ggplot(data = c_df, aes(x = name, y = value, fill=env)) + 
  geom_boxplot(outlier.size=NA) + 
  theme_bw() + 
  theme(axis.title.x =element_blank(), 
        axis.text.x = element_text(angle=90, hjust=1, vjust=0.5, size=12),
        legend.position="none") + 
  ggtitle("DeltaD") +ylab(expression(delta[d])) +
  scale_fill_manual(values=c("grey","green","black","blue","red"))

作为另一种选择,使用分面可能更容易阅读情节。例如:

ggplot(data = c_df, aes(x = env, y = value)) + 
  geom_boxplot(outlier.size=NA) + 
  theme_bw() + 
  facet_grid(. ~ site + numb, scales="free_x", space="free_x") +
  ggtitle("DeltaD") + ylab(expression(delta[d])) +
  labs(x="Environment") +
  theme(axis.text.x = element_text(angle=90, hjust=1, vjust=0.5, size=12))

ggplot(data = c_df, aes(x = site, y = value)) + 
  geom_boxplot(outlier.size=NA) + 
  theme_bw() + 
  facet_grid(numb ~ env) +
  ggtitle("DeltaD") + ylab(expression(delta[d])) +
  labs(x="Site") 

分面和 fill 选择的最佳组合将取决于您要显示的内容、各种列组合是否有大量空类别等。例如,您的示例每个 numb 数据最多有一个 site,因此在上面的第二个分面示例中,很多箱线图 "slots" 是空的,但也许您的真实数据存在更多类别组合。


读入示例数据:

c_df=read.table(text="name  site  numb  env  value order1  order2 color
K_005_AllHuman  K   5     human       0.02941166    1   1   black
K_005_bacteria  K   5     bacteria    0.02941166    1   2   grey
K_005_oral      K   5     oral        0.02941166    1   3   blue
K_005_env       K   6     environment 0.02941166    1   4   green
K_006_AllHuman  K   6     human       0.02941166    1   1   black
K_006_bacteria  K   6     bacteria    0.02941166    1   2   grey
K_006_oral      K   6     oral        0.02941166    1   3   blue
K_006_env       K   6     environment 0.02945052    1   4   green
K_006_pathogen  K   6     pathogen    0.02945052    1   5   red
L_013_AllHuman  L   13    human       0.02928835    2   1   black
L_013_bacteria  L   13    bacteria    0.02870488    2   2   grey
L_013_oral      L   13    oral        0.02870488    2   3   blue
L_013_env       L   13    environment 0.0283742     2   4   green
L_023_AllHuman  L   23    human       0.0283742     2   1   black
L_023_bacteria  L   23    bacteria    0.0283742     2   2   grey
L_023_oral      L   23    oral        0.0283742     2   3   blue
L_023_env       L   23    environment 0.0283742     2   4   green
L_023_pathogen  L   23    pathogen    0.0283742     2   5   red",
                header=TRUE, stringsAsFactors=FALSE)