我想在下面的图中添加另一个复杂程度的颜色编码方案。我想说明所绘制的每个值是否都通过了统计检验。因此,如果点数通过测试,则点数将仅根据百分位数进行颜色编码,否则,我希望点为灰色。
在我从第一篇文章Color code points based on percentile in ggplot收到的所有有用的建议之后,这是我的代码(注意:这是一些组成的数据,但我有真实的数据有更多的条目:
dat <- data.frame(key = c("a1-a3", "a1-a2"), position = 1:100, fst = rlnorm(200, 0, 1), fet = rnorm(200, 0.24, 0.54))
#Get quantiles
quants <- quantile(dat$fst, c(0.95, 0.99))
dat$quant <- with(dat, factor(ifelse(fst < quants[1], 0,
ifelse(fst < quants[2], 1, 2))))
dat$fisher <- with(dat, factor(ifelse(fet > 1.30102999566398, 0, 1)))
dat$col <- with(dat, factor(ifelse(fet < 1.30102999566398, 3, quant)))
########theme set
theme_set(theme_bw(base_size = 10))
p1 <- ggplot(dat, aes(x=position, y=fst)) +
geom_point(aes(colour = col, size=0.2)) +
facet_wrap(~key, nrow = 1) +
scale_colour_manual(values = c("black", "blue", "red", "grey"), labels = c("0-95", "95-99", "99-100", "fail")) +
ylab(expression(F[ST])) +
xlab("Genomic Position (Mb)") +
scale_x_continuous(breaks=c(0, 1e+06, 2e+06, 3e+06, 4e+06), labels=c("0", "1", "2", "3", "4")) +
scale_y_continuous(limits=c(0,1)) +
theme(plot.background = element_blank(),
panel.background = element_blank(),
panel.border = element_blank(),
legend.position="none",
legend.title = element_blank()
)
tiff(Fstvalues_colourcode3.tiff", height=2.5, width=6.5, units="in", res = 300, pointsize="10")
p1
dev.off()
我的问题在于:dat $ col&lt; - with(dat,factor(ifelse(fet&lt; 1.30102999566398,3,quant)))。我希望它使用$ quant中的值,如果它的$ fet值高于上面列出的值(或fisher == 0),如果它的$ fet值低于,我希望它能够创建一个新的因子(3)。当我查看数据框时,它正在做一些与此不同的事情。任何意见/建议非常感谢! (我对编码很新,我发现因素并不容易使用!!)
答案 0 :(得分:2)
是的,你是对的,with(dat, factor(ifelse(fet < 1.30102999566398, 3, quant)))
给出了一个意想不到的&#39;结果。 no
ifelse
中的factor
返回值被强制转换为与yes
返回值(3)相同的类,numeric
。看看tail(dat[order(dat$fet), c("fet", "quant", "col")])
:
# fet quant col
# 6 1.202582 0 3
# 40 1.318997 0 1
# 74 1.324552 0 1
# 24 1.415189 1 2
# 38 1.418230 0 1
# 123 1.531584 0 1
对于胎儿&gt; 1.301(test
中的ifelse
),&#39; col&#39;成为1,1,2,1,1,而不是0,0,1,0,0。这样的事情发生了:
# original factor version of quant
quant <- as.factor(0:2)
quant
# [1] 0 1 2
# Levels: 0 1 2
# coerce quant to numeric
as.numeric(quant)
# [1] 1 2 3
比较这两个:
set.seed(1)
df <- data.frame(fet = rnorm(9), quant = factor(0:2))
str(df)
df$col <- with(df, ifelse(fet < 0, 3, quant))
df
set.seed(1)
df <- data.frame(fet = rnorm(9), quant = 0:2)
str(df)
df$col <- with(df, ifelse(fet < 0, 3, quant))
df
因此,请尝试从您创建的factor
来电中删除ifelse
&#39; quant&#39;并看看它是否解决了这个问题。
另见8.2.1:http://www.burns-stat.com/pages/Tutor/R_inferno.pdf。
PS。当你说出你的问题时,单个ifelse
行就是你的实际问题(而不是绘图部分)。如果是这样,您可能希望隔离此问题并压缩您的问题。