【问题标题】:How to change the colour for missing values in geom_miss_point (with two different color scales)如何更改 geom_miss_point 中缺失值的颜色(使用两种不同的色标)
【发布时间】:2021-01-11 17:59:05
【问题描述】:

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

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

【问题讨论】:

  • + scale_colour_manual(values = c("blue", "green"))?
  • 谢谢,但这并不能解决我的问题。我已经更新了我的问题。

标签: r ggplot2 naniar


【解决方案1】:

我不确定这是否是个好主意。但是为了“在理论上展示如何做到这一点”。根据我对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"))

【讨论】:

  • 谢谢。真的很容易使用它。我不会一个人找到它。我找不到用相同的解决方法修改形状/大小的方法,但我会不用它。
【解决方案2】:

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

  1. 行绑定数据集并添加标识符
  2. 将数据集标识符映射到group
  3. color 上映射..group..naniars ..missing.. 的交互。 (我第一次尝试直接使用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"))

【讨论】:

  • 很好,我正在尝试类似的方法,但我被交互调用卡住了,使用 ..group.. 很棒。
  • @tjebo 谢谢。我首先尝试在interaction 中直接使用标识符,这通常可以工作,但......总是出错。所以刚刚尝试了group,瞧。 ((:
猜你喜欢
  • 2023-03-21
  • 2018-05-31
  • 2023-03-25
  • 1970-01-01
  • 2013-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多