首页 文章

如何使用ggplot2说明不同形状的不可用数据点?

提问于
浏览
0

有没有办法改变R中缺失数据的点的形状?我正在用棒棒糖风格绘制像这样的.csv文件 .

Name,chr,Pos,Reads...ME_016,Reads...ME_017,Reads...ME_018,Reads...ME_019
cg01389728,chr10,6620395,33.82,41.38,41.38,38.46
cg01389728,chr10,6620410,0,-,-,-
cg01389728,chr10,6620430,0,0,-,-
cg01389728,chr10,6620447,0,-,0,-
cg01389728,chr10,6620478,0,-,-,-
cg01389728,chr10,6620510,28.33,29.85,25.64,28.13
cg01389728,chr10,6620520,0,0,-,0
cg01389728,chr10,6620531,0,-,50,-

使用ggplot2,我的图形创建如下:

dataset <-read.table("testset",  sep=",",na.strings="-", header=TRUE)
dataset <- subset(dataset, select=c(-Name, -chr))
dataset <- melt(dataset, id.vars="Pos")
dataset$variable <- gsub("\\.\\.\\.","_",dataset$variable)
xaxes <- unique(dataset$Pos)
dataset$Pos <- as.factor(dataset$Pos)
ggplot(dataset, aes(x=Pos, y=variable,fill=cut(value, breaks=10))) + geom_point(size=4, shape=21) + geom_line() + scale_fill_discrete(labels=c("0-10%","10-20%","20-30%","30-40%","40-50%","50-60%","60-70%","70-80%","80-90%","90-100%")) +
    xlab("CpG Positions") +
    ylab("Sample") +
    labs(fill="Coverage in %") +
    theme_bw() + 
    theme(axis.text.x = element_text(angle=90, hjust=1, vjust=0.5),plot.title = element_text(vjust=2),axis.title.x = element_text(vjust=-0.5),axis.title.y = element_text(vjust=1.5))

但是,我想将绘图中缺失点(“ - ”)的形状设置为“x”,(shape = 4)并在图例中显示它们 . 我尝试过这样的方法:

scale_fill_manual(values=c(value, NA))

要么:

scale_shape_manual(values=c(21,4))

默认情况下,“ - ”也显示为形状21和灰色 . 一定有办法操纵这个吗?编写这样的方法可能是诀窍,但如何为整个列调用它?

formas <- function(x){
+     if(is.na(x)) forma <- 4
+     if(!is.na(x)) forma <- 21
+     return(forma)
+   }

3 回答

  • 2

    我看不出,为什么这不起作用:

    fill.colors <- hcl(h=seq(15, 375, length=11), l=65, c=100)[1:10]
    ggplot(dataset, aes(x=Pos, y=variable
                        ,color=cut(value, breaks=c(-0.01,10,20,30,40,50,60,70,80,90,100))
                        ,shape=ifelse(is.na(value),"Missing","Present"))) + 
      geom_point(size=4) + 
      scale_shape_manual(name="",values=c("Missing"=4,"Present"=19),limits=c("Missing"))+
      scale_color_manual(name="Coverage in %",
                         values=ifelse(is.na(dataset$value),"grey",fill.colors),
                         labels=c("0-10%","10-20%","20-30%","30-40%","40-50%","50-60%","60-70%","70-80%","80-90%","90-100%"),drop=FALSE) +
      theme_bw() +
      theme(axis.text.x = element_text(angle=90, hjust=1, vjust=0.5),
            plot.title = element_text(vjust=2),
            axis.title.x = element_text(vjust=-0.5),
            axis.title.y = element_text(vjust=1.5)) +
      xlab("CpG Positions") +
      ylab("Sample") +
      labs(color="Coverage in %") +
      guides(fill=guide_legend(override.aes=list(colour=fill.colors),order=1))
    

    使用X不再显示NA值,而不是以“灰色”显示它们,90-100%类将以灰色显示 . 没有显示错误消息 - 问题是什么?

  • 0

    我认为这非常接近 .

    ggplot(dataset, aes(x=Pos, y=variable,
                        color=cut(value, breaks=10),
                        shape=ifelse(is.na(value),"Missing","Present"))) + 
      geom_point(size=4) + 
      geom_line() + 
      scale_shape_manual(name="",values=c(Missing=4,Present=19))+
      scale_color_discrete(labels=c("0-10%","10-20%","20-30%","30-40%","40-50%","50-60%","60-70%","70-80%","80-90%","90-100%")) +
      xlab("CpG Positions") +
      ylab("Sample") +
      labs(color="Coverage in %") +
      theme_bw() + 
      theme(axis.text.x = element_text(angle=90, hjust=1, vjust=0.5),plot.title = element_text(vjust=2),axis.title.x = element_text(vjust=-0.5),axis.title.y = element_text(vjust=1.5))
    

    变化是:

    • 使用颜色而不是填充, shape=19 用于带数据的点

    • shape 审美添加到 ggplot(...) 来电 .

    • geom_point(...) 电话中删除 shape=21 .

    • 添加 scale_shape_manual(...) 以定义 MissingPresent 的形状,并关闭指南标签 .

    我知道你想要带有黑色轮廓的填充点(看起来确实更好),但是当我尝试使用增加的形状审美时,填充图例不能正确显示颜色 . 亲自尝试一下 .

  • 0

    这是另一种方法,它更接近于生成您指定的图形(带有黑色轮廓的圆形点和由覆盖率确定的填充颜色) .

    fill.colors <- hcl(h=seq(15, 375, length=11), l=65, c=100)[1:10]
    ggplot(dataset, aes(x=Pos, y=variable,
                        fill=cut(value, breaks=10),
                        shape=ifelse(is.na(value),"Missing","Present"))) + 
      geom_point(size=4) + 
      geom_line() + 
      scale_fill_manual(name="Coverage in %",
                        values=fill.colors,
                        labels=c("0-10%","10-20%","20-30%","30-40%","40-50%","50-60%","60-70%","70-80%","80-90%","90-100%"),
                        drop=FALSE) +
      scale_shape_manual(name="",values=c(Missing=4,Present=21),limits=c("Missing"))+
      xlab("CpG Positions") +
      ylab("Sample") +
      labs(color="Coverage in %") +
      theme_bw() + 
      theme(axis.text.x = element_text(angle=90, hjust=1, vjust=0.5),
            plot.title = element_text(vjust=2),
            axis.title.x = element_text(vjust=-0.5),
            axis.title.y = element_text(vjust=1.5))+
      guides(fill=guide_legend(override.aes=list(colour=fill.colors),order=1))
    

    使用点形状21和填充美学的另一个答案中的问题是,虽然填充颜色在图中正确显示,但它们在图例中无法正确显示 . 一种方法是强制 ggplot 使用设置图例填充颜色

    guides(fill=guide_legend(override.aes=list(colour=fill.colors),order=1))
    

    不幸的是,要做到这一点,你必须手动指定填充颜色(以便实际填充和覆盖填充是相同的) . 这段代码使用

    fill.colors <- hcl(h=seq(15, 375, length=11), l=65, c=100)[1:10]
    

    它创建了一个模仿 ggplot 默认值的调色板 . 你当然可以在这里使用自己的调色板 .

    虽然这确实更接近您的原始意图,但实际上我认为另一个答案提供了更好的数据可视化 . 点周围的黑色轮廓虽然“有吸引力”,但却更难以区分填充颜色,尤其是10种可能的颜色(无论如何都处于可辨别的边缘) .

相关问题