以重复模式为ggplot中的boxplot列着色

A D*_*A D 1 plot r ggplot2

我在ggplot中有几列数据,希望在箱线图中绘制。每个框代表一列数据。盒子应该以四个为一组(红色,绿色,蓝色,黄色)上色,即,每个第二个盒子被涂成绿色,每四个盒子被涂成黄色等。

样本数据

X1 X1.1 X1.2 X1.3 X2 X2.1 X2.2 X2.3
1    2   3    4    3   2    3    1
2    4   5    5    5   2    1    2
2    3   2    1    2   1    2    5
Run Code Online (Sandbox Code Playgroud)

我得到的最接近的是用重复的颜色值填充矢量colorVec并尝试将其应用于ggplot。

graph<-ggplot(expressionframemelted, aes(x = Var2, y=value)) +     
geom_boxplot(aes(fill = factor(Var2)))+
ggtitle("Expression Values and Medians")+xlab(valueAmountsP)+ylab("Counts log 10")+
stat_summary(fun.y = median, geom = "point", position = position_dodge(width = .9),
size = 6, shape = 4, show_guide = F)+
theme(axis.text.x=element_text(angle=90))+
scale_x_discrete(labels=nameVecGraph)+
scale_y_log10()+
scale_fill_manual( values = colorVec)
Run Code Online (Sandbox Code Playgroud)

问题是,如果列值真的很低或为零,或者由于某种原因在图表ggplot上没有出现框的点,则跳过对它们的填充,并继续进行下一个列,从而弄乱了颜色的顺序。

还有更简单的方法吗?

编辑:我尝试了Epi的答案,但ggplot跳过具有低值的列并弄乱颜色顺序的问题仍然存在。我发现这可能是由于使用了对数刻度。例如尝试

ggplot(dfmelt, aes(variable, value, fill=variable)) +
geom_boxplot() +
theme(axis.text.x=element_text(angle=90))+
scale_x_discrete(labels=c('C1','C2','C3','C4','C5','C6','C7','C8'))+
scale_y_log10()+
scale_fill_manual(values=rep(c("red","green","blue","yellow"),2))
Run Code Online (Sandbox Code Playgroud)

df = read.table(text="X1 X1.1 X1.2 X1.3 X2 X2.1 X2.2 X2.3
            1    0   3    4    3   2    3    1
            2    'NA'   5    5    5   2    1    2
            2     'NA'   2    1    2   1    2    5", header=TRUE)
Run Code Online (Sandbox Code Playgroud)

eip*_*i10 5

这样的事情怎么样:

df = read.table(text="X1 X1.1 X1.2 X1.3 X2 X2.1 X2.2 X2.3
1    2   3    4    3   2    3    1
2    4   5    5    5   2    1    2
2    3   2    1    2   1    2    5", header=TRUE)

library(reshape2)
library(dplyr)
library(ggplot2)

ggplot(df %>% melt(), aes(variable, value, fill=variable)) +
  geom_boxplot() +
  scale_fill_manual(values=rep(c("red","green","blue","yellow"),2))
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

如果您使代码具有可复制性(在这种情况下,这意味着要提供一个可以与您发布的代码一起使用的数据示例),我可以针对您的问题更直接地调整我的答案。

更新:为回答您编辑过的问题和您的评论:ggplot不会绘制更新数据集中的第二列,因为它不包含正值。在对数转换下,零变为-Inf负值NA(对于实数),因此没有要绘制的内容,ggplot在分配颜色时会跳过或丢弃该x值。要保持着色顺序,请添加drop=FALSEscale_fill_manual

ggplot(dfmelt, aes(variable, value, fill=variable)) +
  geom_boxplot(show_guide=FALSE) +
  theme(axis.text.x=element_text(angle=90, vjust=0.5)) +
  scale_x_discrete(labels=c('C1','C2','C3','C4','C5','C6','C7','C8')) +
  scale_y_log10(breaks=1:5) +
  scale_fill_manual(values=rep(c("red","green","blue","yellow"),2), drop=FALSE)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明