在不查看数据的情况下很难知道自己的对手是什么,但仅增加 14,000 个点 alpha 不太可能使“特殊点”` 足够突出。你可以试试这个:
## create artificial data set for this example
set.seed(1) # for reproducibility
n <- 1.4e4 # 14,000 points
df <- data.frame(SeqIdentityMean =rnorm(n, mean=rep(-3:3, each=n/7)),
SeqIdentityStdDev=rnorm(n, mean=rep(-3:3, each=n/7)),
PfamA_ID=rep(1:7, each=n/7))
df$PfamA_ID <- factor(df$PfamA_ID)
## you start here
library(ggplot2)
special.points <- sample(1:n, 7)
ggp <- ggplot(df, aes(x=SeqIdentityMean, y=SeqIdentityStdDev, color=PfamA_ID))+
geom_point(alpha=0.05)+
geom_point(data=df[special.points,], aes(fill=PfamA_ID), color="black", alpha=1, size=4, shape=21)+
scale_color_discrete(guide=guide_legend(override.aes=list(alpha=1, size=3)))+
scale_fill_discrete(guide="none", drop=FALSE)
ggp
通过使用shape=21(实心圆圈),您可以给特殊点一个黑色轮廓,然后使用aes(fill=...)作为颜色。 IMO 这使他们更加突出。最直接的方法是使用仅包含特殊点的特定于层的数据集额外调用geom_point(...)。
最后,即使是这个人为的例子,这些组都被混合在一起了。如果您的真实数据是这种情况,我会倾向于尝试分面:
ggp + facet_wrap(~PfamA_ID)
这样做的好处是可以突出特殊点属于哪些组 (PfamA_ID),这在前面的情节中并不明显。
关于您的代码的其他几点:
- 这是非常糟糕的做法,例如
ggplot(df, aes(x=df$a, y=df$b, ...), ...)。改为使用:ggplot(df, aes(x=a, y=b, ...), ...)。映射的全部意义在于将美学(x、y、颜色等)与 df 中的列相关联,使用列名。您将列作为独立向量传递。
- 在示例中,我将
df$PfamA_ID 设置为data.frame 中的一个因子,而不是在对aes(...) 的调用中。这很重要,因为事实证明特殊点子集缺少一些因子水平。如果换一种方式,特殊图层中的填充颜色将不会与主图层中的点颜色对齐。
-
当您设置alpha=0.05(或其他)时,图例将使用该 alpha,这使得图例几乎无用。要绕过这种用法:
scale_color_discrete(guide=guide_legend(override.aes=list(alpha=1, size=3)))
编辑:响应 OP 的最后评论/请求。
所以听起来您想对除第一种颜色(不饱和红色)之外的所有内容使用 ggplot 的默认离散色标。这不是一个好主意,但这里有一种方法:
# create custom color palette containing ggplot defaults for all but first color; use black for first color
n.col <- length(levels(df$PfamA_ID))
cols <- c("#000000", hcl(h=seq(15, 375, length=n.col+1), l=65, c=100)[2:n.col])
# set color and fill palette manually
ggp <- ggplot(df, aes(x=SeqIdentityMean, y=SeqIdentityStdDev, color=PfamA_ID))+
geom_point(alpha=0.05)+
geom_point(data=df[special.points,], aes(fill=PfamA_ID), color="black", alpha=1, size=4, shape=21)+
scale_color_manual(values=cols, guide=guide_legend(override.aes=list(alpha=1, size=3)))+
scale_fill_manual(values=cols, guide="none", drop=FALSE)
ggp