我试图用ggplot2绘制火山图。我想根据以下标准有三种不同的颜色:
之前已经在这里提出了类似的问题,我尝试过关注它们,但不断收到错误消息。任何建议都将受到高度赞赏。
这是原始数据文件:
chr start end strand pvalue qvalue meth.diff
16 chr1 37801 38100 * 2.246550e-05 4.487042e-04 -36.485769
17 chr1 38101 38400 * 5.699781e-06 1.376471e-04 55.755181
29 chr1 49501 49800 * 1.453030e-18 2.442391e-16 -18.381131
35 chr1 62701 63000 * 5.547627e-03 3.686303e-02 -31.871711
54 chr1 122401 122700 * 3.917230e-03 2.845933e-02 63.443366
57 chr1 130201 130500 * 8.941091e-04 9.253737e-03 -8.347167
myDiff1p$threshold = factor(ifelse(myDiff1p$meth.diff>25 & myDiff1p$qvalue< 0.05, 1,
ifelse(myDiff1p$meth.diff<-25 & myDiff1p$qvalue< 0.05,-1,0)))
ggplot(data=myDiff1p, aes(x=meth.diff, y=-log10(qvalue))) +
geom_point(aes(color=myDiff1p$threshold), alpha=0.4, size=1.75)+
geom_vline(xintercept=c(-25,25), color="red", alpha=1.0)+
geom_hline(yintercept=2, color="blue", alpha=1.0)+
xlab("Differential Methylation")+
ylab("-log10 (qvalue)")+
theme_bw()+
xlim(c(-75, 75)) +
ylim(c(0, 300))
错误:提供给连续刻度的离散值
答案 0 :(得分:2)
你在这一行中犯了一个几乎无法察觉的错误:
myDiff1p$threshold = factor(ifelse(myDiff1p$meth.diff>25 & myDiff1p$qvalue< 0.05, 1,
ifelse(myDiff1p$meth.diff<-25 & myDiff1p$qvalue< 0.05,-1,0)))
由于myDiff1p$meth.diff<-25
中没有空格,因此它被解释为myDiff1p$meth.diff <- 25
而不是myDiff1p$meth.diff < -25
。结果,meth.diff
搞砸了。
以下是我的建议:
library(dplyr)
myDiff1p <- myDiff1p %>%
mutate(threshold = factor(case_when(meth.diff > 25 & qvalue < 0.05 ~ "cond1",
meth.diff < -25 & qvalue < 0.05 ~ "cond2",
TRUE ~ "cond3")))
ggplot(data=myDiff1p, aes(x=meth.diff, y=-log10(qvalue))) +
geom_point(aes(color=myDiff1p$threshold), alpha=0.4, size=1.75)+
geom_vline(xintercept=c(-25,25), color="red", alpha=1.0)+
geom_hline(yintercept=2, color="blue", alpha=1.0)+
xlab("Differential Methylation")+
ylab("-log10 (qvalue)")+
theme_bw()+
xlim(c(-75, 75)) +
ylim(c(0, 300)) +
scale_color_manual(name = "Threshold",
values = c("cond1" = "red", "cond2" = "green", "cond3" = "grey"))
我按条件标记了阈值因子,&amp;定义条件和条件之间的映射scale_color_manual()
中命名向量中的颜色。此外,这是个人偏好的问题,但我认为dplyr::case_when()
看起来比嵌套的ifelse()
语句更整洁。