Как использовать sec_axis() для дискретных данных в ggplot2 R?
У меня есть скрытые данные, которые выглядят так:
height <- c(1,2,3,4,5,6,7,8)
weight <- c(100,200,300,400,500,600,700,800)
person <- c("Jack","Jim","Jill","Tess","Jack","Jim","Jill","Tess")
set <- c(1,1,1,1,2,2,2,2)
dat <- data.frame(set,person,height,weight)
Я пытаюсь построить график с той же осью X (человек) и 2 разных осей Y (вес и рост). Все примеры, которые я нахожу, пытаются построить вторичную ось (sec_axis) или дискретные данные, используя базовые графики. Есть ли простой способ использовать sec_axis для скрытых данных на ggplot2? Изменить: кто-то в комментариях предложил мне попробовать предложенный ответ. Тем не менее, я сталкиваюсь с этой ошибкой сейчас
Вот мой текущий код:
p1 <- ggplot(data = dat, aes(x = person, y = weight)) +
geom_point(color = "red") + facet_wrap(~set, scales="free")
p2 <- p1 + scale_y_continuous("height",sec_axis(~.*1.2, name="height"))
p2
I get the error: Error in x < range[1] :
comparison (3) is possible only for atomic and list types
В качестве альтернативы, теперь я изменил пример, чтобы он соответствовал опубликованному примеру.
p <- ggplot(dat, aes(x = person))
p <- p + geom_line(aes(y = height, colour = "Height"))
# adding the relative weight data, transformed to match roughly the range of the height
p <- p + geom_line(aes(y = weight/100, colour = "Weight"))
# now adding the secondary axis, following the example in the help file ?scale_y_continuous
# and, very important, reverting the above transformation
p <- p + scale_y_continuous(sec.axis = sec_axis(~.*100, name = "Relative weight [%]"))
# modifying colours and theme options
p <- p + scale_colour_manual(values = c("blue", "red"))
p <- p + labs(y = "Height [inches]",
x = "Person",
colour = "Parameter")
p <- p + theme(legend.position = c(0.8, 0.9))+ facet_wrap(~set, scales="free")
p
Я получаю ошибку, которая говорит
"geom_path: Each group consists of only one observation. Do you need to
adjust the group aesthetic?"
Я получаю шаблон, но не получаю баллы
1 ответ
Аргументы функции R передаются по позиции, если имена аргументов не указаны явно. Как уже упоминалось @Z.Lin в комментариях, вам нужно sec.axis=
до вашего sec_axis
функция, чтобы указать, что вы кормите эту функцию в sec.axis
аргумент scale_y_continuous
, Если вы этого не сделаете, он будет передан во второй аргумент scale_y_continuous
который по умолчанию breaks=
, Таким образом, сообщение об ошибке связано с тем, что вы не указали приемлемый тип данных для breaks
аргумент:
p1 <- ggplot(data = dat, aes(x = person, y = weight)) +
geom_point(color = "red") + facet_wrap(~set, scales="free")
p2 <- p1 + scale_y_continuous("weight", sec.axis = sec_axis(~.*1.2, name="height"))
p2
Первый аргумент (name=
) из scale_y_continuous
для первой шкалы у, где в качестве sec.axis=
аргумент для второй шкалы у. Я изменил ваше первое имя шкалы, чтобы исправить это.