#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 initialggplot()
, тогда вам не нужно будет повторять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)
Вывод: