如何更改 geom_miss_point 中缺失值的颜色(有两种不同的色标)

How to change the colour for missing values in geom_miss_point (with two different color scales)

我正在努力修改点的 colour/shape/... 根据它是否为缺失值。

library(ggplot2)
library(naniar)
ggplot(data = airquality,
       aes(x = Ozone,
           y = Solar.R)) +
  geom_miss_point()

What I have

airquality_no_na <-airquality[!(is.na(airquality$Ozone) | is.na(airquality$Solar.R)) ,]
airquality_na <-airquality[(is.na(airquality$Ozone) | is.na(airquality$Solar.R)),]
ggplot() +
  geom_point(data = airquality_no_na,
                  aes(x = Ozone,
                      y = Solar.R, colour = "NoMissing")) +
  geom_miss_point(data = airquality_na,
                  aes(x = Ozone,
                      y = Solar.R, colour = "Missing")) +
  scale_colour_manual(name = 'Legende', 
                    values =c('NoMissing'='green',
                              'Missing'='blue'))


What I would like to have

我不知道如何在不拆分两个数据帧的情况下使绿色的缺失值和蓝色的非缺失值。

编辑:

我的问题有点复杂。我希望能够为第一个数据集(蓝色缺失,绿色不缺失)和第二个数据集(红色缺失,黄色不缺失)选择颜色

#Create dataframes
df1=as.data.frame(matrix(data=runif(n=200, 0,1),ncol=2))
df2=as.data.frame(matrix(data=runif(n=100, 0,1),ncol=2))
#Add missing values
df1[rbinom(n=100,size=1,prob = 0.1) ==1,1] <- NA
df1[rbinom(n=100,size=1,prob = 0.1) ==1,2] <- NA
df2[rbinom(n=50,size=1,prob = 0.1) ==1,1] <- NA
df2[rbinom(n=50,size=1,prob = 0.1) ==1,2] <- NA

#This doesnt work. It only print in blue (missing) and green (not missing)
ggplot() +
  geom_miss_point(data = df1,
                  aes(x = V1,
                      y = V2)) +
  geom_miss_point(data = df2,
                  aes(x = V1,
                      y = V2)) +
  scale_colour_manual(values = c("blue", "green", "yellow","red"))

我不确定这是否是个好主意。但为了“在理论上展示如何做到这一点”。根据我对 quick 查看 naniar 包的了解,颜色美学默认映射到 ..missing..。您需要深入研究实际的 geom 才能改变这种行为。但是有一个简单的解决方法。

使用 ggnewscale 创建第二个色标。

您不会绕过首先对数据进行子集化,但这并不是一件坏事。不要害怕对数据进行子集化,这是一件很正常的事情。

library(tidyverse)
library(naniar)
library(ggnewscale)

ggplot() +
  geom_miss_point(data = df1, aes(V1, V2)) +
  scale_colour_manual(name = "df1", values = c("blue", "green")) +
  new_scale_color() +
  geom_miss_point(data = df2, aes(V1, V2)) +
  scale_colour_manual(name = "df2", values =  c("yellow","red"))

经过反复试验,我想出了一个使用 group 美学的解决方案:

  1. 行绑定您的数据集并添加标识符
  2. 将数据集标识符映射到 group
  3. 映射 ..group..naniar..missing..color 上的交互。 (我首先尝试直接使用 dataset,但没有用。):)
library(ggplot2)
library(naniar)

set.seed(42)

#Create dataframes
df1=as.data.frame(matrix(data=runif(n=200, 0,1),ncol=2))
df2=as.data.frame(matrix(data=runif(n=100, 0,1),ncol=2))
#Add missing values
df1[rbinom(n=100,size=1,prob = 0.1) ==1,1] <- NA
df1[rbinom(n=100,size=1,prob = 0.1) ==1,2] <- NA
df2[rbinom(n=50,size=1,prob = 0.1) ==1,1] <- NA
df2[rbinom(n=50,size=1,prob = 0.1) ==1,2] <- NA

dplyr::bind_rows(df1, df2, .id = "dataset") %>% 
  ggplot() +
  geom_miss_point(aes(x = V1,
                      y = V2, 
                      group = dataset,
                      colour = interaction(..group.., ..missing..))) +
  scale_colour_manual(values = c("blue", "red", "green", "yellow"))