首页 > 解决方案 > R - 仅绘制 x 水平的子集并使用 scale_fill_manual 时省略 NA

问题描述

我正在尝试制作一个箱线图,其中 X 是对某种鸟类属(Vermivora)的 3 种类型的检测:两个物种和两者的杂交种。在某些情况下,这 3 个都没有被检测到,除了“gwwa”、“bwwa”和“hybrid”之外,产生了第 4 级 X,“none”。

我只想绘制“gwwa”和“bwwa”,我希望“gwwa”为黄色,“bwwa”为浅蓝色。

如果没有第三个框“NA”,我无法生成箱线图,当我尝试省略 NA 时,仍然有第三个框“FALSE”。

我在尝试避免这两种结果时收到的反复出现的错误消息是:

错误:美学必须是长度1或与数据相同(3):填充

这是我写的:


library(tidyverse)
VERM <- read.csv("C:/1Zack/GWWA Map Stuff/GWWA_bySpecies.csv")
Vermivora <- factor(VERM$Species,levels(VERM$Species)[c(2,1)])
Road_Proximity <- VERM$RoadCount_2km

ggplot(data=VERM, mapping = aes(Vermivora, y=Road_Proximity, fill=Vermivora))+
geom_boxplot()+
scale_fill_manual(values=c("yellow", "lightblue"))

抱歉,这是我的第一篇文章,我不知道如何包含屏幕截图,我不知道如何将我的代码的每一行放在自己的行上,而它们之间没有一个完整的空行。

标签: rggplot2boxplotnafill

解决方案


我只是在猜测您的数据是什么样的(因为您没有提供它)所以我VERM在下面的示例中编造了一些 data.frame。主要思想是您应该过滤Vermivora变量(列)中需要的值。

library(tidyverse)
# Some made up data
VERM <- data.frame(Vermivora = c("gwwa", "bwwa", "hybrid", NA),
                   Road_Proximity = sample(4*10))

我认为这与您根据问题的描述得到的相似:

ggplot(VERM, aes(Vermivora, Road_Proximity, fill = Vermivora)) + 
  geom_boxplot()

在此处输入图像描述


解决方案dyplr

在变量 Vermivora 中过滤您需要的值。

VERM %>%
  filter(Vermivora %in% c("gwwa", "bwwa")) %>% 
  ggplot(aes(x = Vermivora, y = Road_Proximity, fill = Vermivora)) + 
  geom_boxplot() +
  scale_fill_manual(values = c("gwwa" = "yellow", 
                               "bwwa" = "lightblue"))

在此处输入图像描述

如果您需要 OX 轴上的特定顺序,请订购因子 Vermivora。

VERM %>%
  filter(Vermivora %in% c("gwwa", "bwwa")) %>% 
  mutate(Vermivora = ordered(x = Vermivora, 
                             levels = c("gwwa", "bwwa"))) %>% 
  ggplot(aes(x = Vermivora, y = Road_Proximity, fill = Vermivora)) + 
  geom_boxplot() +
  scale_fill_manual(values = c("gwwa" = "yellow", 
                               "bwwa" = "lightblue"))

在此处输入图像描述


解决方案data.table

使用更简洁的语法data.table

library(data.table)
library(magrittr) # for piping with %>% (not only dyplr use it; 
# pipeline is a Unix trait not a dyplr trait)

setDT(VERM) # converts to data.table from data.frame

VERM[Vermivora %in% c("gwwa", "bwwa")] %>% 
  ggplot(aes(x = Vermivora, y = Road_Proximity, fill = Vermivora)) + 
  geom_boxplot() +
  scale_fill_manual(values = c("gwwa" = "yellow", 
                               "bwwa" = "lightblue"))

# If you need to order the factor Vermivora:
VERM[Vermivora %in% c("gwwa", "bwwa")] %>% 
  .[, Vermivora := ordered(x = Vermivora, levels = c("gwwa", "bwwa"))] %>% 
  ggplot(aes(x = Vermivora, y = Road_Proximity, fill = Vermivora)) + 
  geom_boxplot() +
  scale_fill_manual(values = c("gwwa" = "yellow", 
                               "bwwa" = "lightblue"))

请注意,在解决问题时,几乎总是需要查看与您的问题相关的一些数据。您可以通过发布以下行之一的输出来尝试:

dput(VERM) # the entire data
dput(head(VERM, 20)) # the first 20 rows
dput(VERM[sample(x = nrow(VERM), size = 20),]) # a sample of 20 rows
# Or make up some data like I did in the above example.

推荐阅读