R ggplot2 boxplot按2个因子排序并指定颜色

时间:2016-05-10 10:35:27

标签: r ggplot2 boxplot

我的数据格式如下:

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

我想在箱线图中绘制数据,这样箱子按站点名称排序,在此之内,它们由麻木列排序,最后它们遵循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]))

1 个答案:

答案 0 :(得分:3)

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

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

此外,看起来在数据的下半部分name应该以&#34; L&#34;而不是&#34; K&#34;所以我做了那个改变。我认为您不需要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"))

enter image description here

作为另一种选择,通过刻面可能更容易阅读情节。例如:

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

enter image description here

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

enter image description here

分面和fill选项的最佳组合将取决于您尝试显示的内容,是否有很多针对各种列组合的空类别等。例如,您的示例数据每site最多只有numb个,所以很多箱线图都是#{1}}。在上面的第二个分面示例中是空的,但也许您的真实数据有更多的类别组合。

读入样本数据:

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)