首页 > 解决方案 > 如何更改 geom_miss_point 中缺失值的颜色(使用两种不同的色标)

问题描述

我正在努力根据是否缺失值来修改点的颜色/形状/...。

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

是)我有的

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


我想拥有什么

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

编辑 :

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

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

标签: rggplot2naniar

解决方案


我不确定这是否是个好主意。但是为了“在理论上展示如何做到这一点”。从我对包装的快速浏览了解到,默认情况下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"))


推荐阅读