R - пропустить NA при построении только подмножества уровней x и использовании scale_fill_manual - PullRequest
0 голосов
/ 29 декабря 2018

Я пытаюсь создать коробку с X-образами, обнаруживающими 3 типа определенного рода птиц (Vermivora): два вида и гибриды двух.Были также случаи, когда ни один из 3 не был обнаружен, давая 4-й уровень X, «нет», в дополнение к «gwwa», «bwwa» и «hybrid».

Я только хочу построить сюжет «gwwa»"и" bwwa ", и я хочу, чтобы" gwwa "был желтым, а" bwwa "- светло-голубым.

Я не могу сгенерировать блокпост без третьего окна" NA ", и когда я пытаюсьпропустите NA, тогда есть еще третье поле «ЛОЖЬ».

Повторяющееся сообщение об ошибке, которое я получаю при попытке избежать этих двух результатов, выглядит так:

Ошибка: эстетика должна быть либо длины 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"))

Извините, это мой первый пост, и яя не могу понять, как добавить скриншот, и я не могу понять, как поместить каждую строку моего кода в отдельную строку без пустой строки между ними.

1 Ответ

0 голосов
/ 30 декабря 2018

Я просто догадываюсь, как выглядят ваши данные (так как вы их не предоставили), поэтому я составил 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()

enter image description here


Решение с 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"))

enter image description here

Если вам нужен определенный порядок на оси 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"))

enter image description here


Решение с 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.
...