R 如何使用ggplot2以不同的形状演示不可用的数据点?

R 如何使用ggplot2以不同的形状演示不可用的数据点?,r,plot,ggplot2,R,Plot,Ggplot2,有没有办法改变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,6620

有没有办法改变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))
或:

默认情况下,“-”也显示为形状21和灰色。一定有办法操纵这一切?编写这样的方法可能是一个技巧,但是如何为整个专栏调用它呢

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

formas我认为这非常接近

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(…)
    call
  • geom_point(…)
    调用中删除
    shape=21
  • 添加了
    scale\u shape\u手册(…)
    ,以定义
    缺失的
    存在的
    形状,并关闭导向标签

我知道您希望填充点具有黑色轮廓(看起来确实更好),但当我尝试使用添加的形状美学时,填充图例无法正确显示颜色。您自己试试。

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

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

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

fill.colors我看不出来,为什么这不起作用:

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))

fill.colors非常适合我。好主意,用颜色“覆盖”形状!完美答案!恐怕颜色还是混在一起,显示不正确。谢谢你的提示-到目前为止我还没有注意到。原因是cut(值,break=10)不是从0-100缩放的,而是从min-max缩放的。这就是为什么类从0-5,25-30,30-35。。。更改为cut(值,打断=c(-0.01,10,20,30,40,50,60,70,80,90100)可以解决此问题,但现在绘图中不再显示NA。。
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))
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]
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))