Ошибка: эстетика должна быть либо длиной 1, либо такой же, как у данных (13): ymax

#r #ggplot2

#r #ggplot2

Вопрос:

Я пытаюсь построить график, показывающий оптимумы видов и допуски для трех разных моделей wap, lg и reg, однако я продолжаю получать сообщение об ошибке Error: Aesthetics must be either length 1 or the same as the data (13): ymax , которое я прочитал, что это как-то связано с заливкой, но я уверен, что я правильно определил заливки? Я также попытался просто сохранить виды, общие для всех трех моделей, чтобы в фрейме данных не было NAS, но я получил ту же ошибку. Кто-нибудь может решить проблему?

 

specoptima<-read.csv("regspecopt.csv",header=TRUE)

ggplot() 
geom_point(data = specoptima, aes(x = Species, y = wapopt), color = "red",pch=21,size=3) 
geom_point(data = specoptima, aes(x = Species, y = lgopt), color = "blue",pch=23,size=3) 
geom_point(data = specoptima, aes(x = Species, y = regopt), color = "green",pch=23,size=3) 
  xlab('Species')  
  ylab('Height m AHD') theme_classic() 
  geom_errorbar(aes(x=specoptima$Species,ymin=specoptima$wapopt-specoptima$waptol, ymax=specoptima$waopt specoptima$waptol), width=0) 
  geom_errorbar(aes(x=specoptima$Species,ymin=specoptima$lgopt-specoptima$lgtol, ymax=specoptima$lgopt spectopima$lgtol), width=0) 
  geom_errorbar(aes(x=specoptima$Species,ymin=specoptima$regopt-specoptima$regtol, ymax=specoptima$regopt specoptima$regtol), width=0)

structure(list(Species = structure(c(13L, 12L, 4L, 9L, 11L, 5L
), .Label = c("A.agglutinans", "A.exiguus", "A.subcatenulatus", 
"H.wilberti", "J.macrescens", "M.fusca", "P.hyperhalina", "P.ipohalina", 
"S.lobata", "T.inflata", "T.irregularis", "T.salsa", "Textularia"
), class = "factor"), wapopt = c(NA, 178.2315, 177.5775, 177.1053, 
169.4055, 167.8907), waptol = c(NA, 15.21344, 6.385151, 8.477989, 
10.844778, 9.444243), lgopt = c(190.3974, 187.1097, 177.6777, 
170.332, 173.4925, 174.8782), lgtol = c(8.236862, 4.204461, 12.198399, 
9.714885, 10.590835, 8.939749), regopt = c(190.3974, 186.8404, 
177.6699, 174.0947, 173.2112, 172.8087), regtol = c(8.609964, 
4.767529, 11.754856, 9.363322, 10.508812, 9.539666)), row.names = c(NA, 
6L), class = "data.frame")
  
  
  

Комментарии:

1. Возможно, вы могли бы включить data = specoptima inside of initial ggplot() , тогда вам не нужно будет повторять specoptima$... для извлечения столбцов и вы сможете последовательно ссылаться на один и тот же фрейм данных повсюду. Кроме того, сначала есть ошибка в geom_errorbar написании «waopt», которая должна быть «wapopt».

2. Привет, Бен, хорошая идея, спасибо! Я все еще новичок в программировании, поэтому любые подсказки и советы, подобные этому, великолепны! Спасибо, что тоже заметили опечатку 🙂

Ответ №1:

Как говорит Дак, у вас была пара опечаток. Но вот почему у вас была пара опечаток — ненужное повторение в вашем коде. Чем больше раз вам придется вводить имя вашего фрейма данных, тем больше вероятность того, что у вас будет опечатка. Длинные и громоздкие строки кода с минимальным интервалом между операторами также затрудняют их просмотр.

Все ваши геометрические фигуры могут наследовать свои данные от ggplot вызова, и вам не нужно выполнять specoptima$variable вызовы внутри geom или stat, поэтому ваш код упрощается до:

 ggplot(data = specoptima, aes(x = Species))  
  geom_point(aes(y = wapopt), color = "red", pch = 21, size = 3)  
  geom_point(aes(y = lgopt), color = "blue", pch = 23, size = 3)  
  geom_point(aes(y = regopt), color = "green", pch = 23, size = 3)  
  geom_errorbar(aes(ymin = wapopt - waptol, ymax = wapopt   waptol), width = 0)  
  geom_errorbar(aes(ymin = lgopt - lgtol, ymax = lgopt   lgtol), width = 0)  
  geom_errorbar(aes(ymin = regopt - regtol, ymax = regopt   regtol), width = 0)  
  xlab('Species')  
  ylab('Height m AHD')  
  theme_classic()
  

введите описание изображения здесь

Или, что еще лучше, измените свои данные, чтобы избежать повторных вызовов geom:

 tidyr::pivot_longer(specoptima, cols = -1,
                    names_sep = -3, names_to = c("type", "b")) %>% 
  tidyr::pivot_wider(names_from = b) %>%
  mutate(ymin = opt - tol, ymax = opt   tol) %>%
  ggplot(aes(x = Species, color = type))  
  geom_point(aes(y = ymin), pch = 23)   
  geom_point(aes(y = ymax), pch = 23)  
  geom_errorbar(aes(ymin = ymin, ymax = ymax), width = 0, color = "black")
  

Комментарии:

1. Спасибо, я забыл, что я мог бы просто указать аргумент data, это будет удобно для будущего кода.

Ответ №2:

Попробуйте это. Проблема заключалась в том, что вы вызывали переменную, которой не было в ваших данных (буквально вы неправильно написали ее имя). Здесь код:

 library(ggplot2)
#Code
ggplot() 
  geom_point(data = specoptima, aes(x = Species, y = wapopt), color = "red",pch=21,size=3) 
  geom_point(data = specoptima, aes(x = Species, y = lgopt), color = "blue",pch=23,size=3) 
  geom_point(data = specoptima, aes(x = Species, y = regopt), color = "green",pch=23,size=3) 
  xlab('Species')  
  ylab('Height m AHD') theme_classic() 
  geom_errorbar(aes(x=specoptima$Species,ymin=specoptima$wapopt-specoptima$waptol,
                    ymax=specoptima$wapopt specoptima$waptol), width=0) 
  geom_errorbar(aes(x=specoptima$Species,ymin=specoptima$lgopt-specoptima$lgtol,
                    ymax=specoptima$lgopt specoptima$lgtol), width=0) 
  geom_errorbar(aes(x=specoptima$Species,
                    ymin=specoptima$regopt-specoptima$regtol,
                    ymax=specoptima$regopt specoptima$regtol), width=0)
  

Вывод:

введите описание изображения здесь