R ggplot2:在不同图层上绘制数据子集时保持原始颜色和组级顺序

Posted

技术标签:

【中文标题】R ggplot2:在不同图层上绘制数据子集时保持原始颜色和组级顺序【英文标题】:R ggplot2: maintain original colors and group level order when plotting subsets of data on different layers 【发布时间】:2021-12-22 06:35:13 【问题描述】:

我有一个非常简单(虽然很大)的数据框,其中包含 2 个数字列和 1 个字符分组列,包含多个 NAs

我将以iris 为例。下面,我只是在我要用于分组和着色的Species列中引入随机NAs

我在这里所做的是将Species 列重新制作为最后带有“NA”(字符)的因子。我最后用gray做了一个调色板,我想对应“NA”。

data("iris")
set.seed(123)
na_rows <- sample(nrow(iris), 100, replace = F)
iris$Species <- as.character(iris$Species)
iris$Species[na_rows] <- "NA"
mylevels <- iris$Species[which(iris$Species!="NA")]
mylevels <- c(gtools::mixedsort(unique(mylevels)), "NA")
iris$Species <- factor(iris$Species, levels=mylevels)
plot_palette <- c("red","blue","green")
plot_palette <- c(plot_palette[1:length(mylevels)-1], "gray")

到这里为止一切顺利。现在我把我的散点图画成这样:

grDevices::pdf(file="test1.pdf", height=10, width=10)
P <- ggplot2::ggplot(data=iris, ggplot2::aes(x=Sepal.Length, y=Sepal.Width, color=Species)) +
     ggplot2::scale_color_manual(values=plot_palette)
P1 <- P + ggplot2::geom_point(pch=16, size=10, alpha=0.75)
print(P1)
grDevices::dev.off()

这会产生这个情节:

到这里为止一切都还好。这和我想要的很接近,但是我的实际数据框很大,很多non-NA点都隐藏在NA后面。

为了避免这种情况,我试图首先绘制NA 数据的子集,然后在上层绘制non-NA 数据的子集。我试试下面的代码:

grDevices::pdf(file="test2.pdf", height=10, width=10)
P <- ggplot2::ggplot(data=iris, ggplot2::aes(x=Sepal.Length, y=Sepal.Width, color=Species)) +
     ggplot2::scale_color_manual(values=plot_palette)
P1 <- P + ggplot2::geom_point(data=function(x)x[x$Species == "NA", ], pch=15, size=10, alpha=0.75) +
          ggplot2::geom_point(data=function(x)x[x$Species != "NA", ], pch=16, size=10, alpha=0.75)
print(P1)
grDevices::dev.off()

这会产生这个情节:

我这里的问题很明显,但我不知道如何解决。

我只希望第二个情节与第一个情节完全相同,除了“分层”,NA 点在后面。我想保持图例中Species级别的原始顺序,以NA结尾,颜色对应相同,NA关联到gray

请注意,我还将 pch 更改为 NA 点。额外的好处是,NA(在底部)的图例只有正方形,其他样本只有圆圈。

有什么帮助吗?谢谢!

【问题讨论】:

【参考方案1】:

不需要多层。您可以简单地重新排序您的数据集,以便首先绘制 NAs 并且您可以将 Species 映射到 shape aes 上并通过 scale_shape_manual 设置所需的形状:

iris1 <- dplyr::arrange(iris, desc(Species))

P <- ggplot2::ggplot(data=iris1, ggplot2::aes(x=Sepal.Length, y=Sepal.Width, color=Species, shape = Species)) +
  ggplot2::scale_color_manual(values=plot_palette)
P + ggplot2::geom_point(size=10, alpha=0.75) + ggplot2::scale_shape_manual(values = c(16, 16, 16, 15))

【讨论】:

以上是关于R ggplot2:在不同图层上绘制数据子集时保持原始颜色和组级顺序的主要内容,如果未能解决你的问题,请参考以下文章

R语言ggplot2 简介

iPhone:在两个不同的图层上同步动画

R 绘制交互式地图 Mapview

「青莲科普」R语言系列——取其精华,去其糟粕的ggplot2你会用吗?

在 cocos2d 图层上画线或矩形

如何在闪亮中使用 ggplot2 绘制数据框的子集