r - 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"))
抱歉,这是我的第一篇文章,我不知道如何包含屏幕截图,我不知道如何将我的代码的每一行放在自己的行上,而它们之间没有一个完整的空行。
解决方案
我只是在猜测您的数据是什么样的(因为您没有提供它)所以我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.
推荐阅读
- android - java.lang.ArrayIndexOutOfBoundsException 使用 tensorflow 进行画廊图像分类
- windows - Windows 上适用于 Python 3.6 的小型编译器
- cmake - CMake 测试我是否处于脚本模式
- python - Nginx 不为在 uwsgi 上运行的 django 项目提供服务
- java - 如何在 EclipseLink 中级联 @JoinFetch?
- python - 打印文件中包含字符串的行
- javascript - 我正在学习编码,有人可以告诉我有什么问题吗?
- r - 在特定字符值之后,R中的多个字符串拆分
- mongodb - 单个 MongoDB 模式中的多个引用
- msbuild - 从 MSBuild 发布命令中删除版本