我的数据格式如下:
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]))
答案 0 :(得分:3)
在下面的图表中,为了获得所需的排序,我在name
然后name
然后site
对其进行排序后将env
转换为一个因子。
要获得所需的颜色,我使用scale_fill_manual
将所需的颜色映射到env
的每个可能值。添加带有颜色名称的列并不起作用,因为ggplot没有从数据中获取颜色名称。相反,它将数据列中的类别映射到对于所有分类变量都相同的默认调色板,而不管这些变量的值恰好被调用的是什么。要将颜色设置为不同的值,您需要使用scale_fill_***
函数之一。
此外,看起来在数据的下半部分name
应该以&#34; L&#34;而不是&#34; K&#34;所以我做了那个改变。我认为您不需要order1
,order2
或color
列。
读取样本数据的代码位于此答案的底部。
# 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
选项的最佳组合将取决于您尝试显示的内容,是否有很多针对各种列组合的空类别等。例如,您的示例数据每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)