У меня есть функция

eq = function(x){x*2}

Для чего я бы построил график на диаграмме рассеяния в R.

Моя попытка заключается в следующем (данные не опубликованы, поэтому это не работает, но синтаксически эквивалентно):

plot(per_class$input_kb, per_class$kb, col="red", ylab="Peak memory usage (kb)",
xlab="Input data (kb)", main="Peak memory per input size") 

Что дает мне сюжет. Я тогда попробую

lines(eq,y=NULL)

Однако я получаю сообщение об ошибке.

Error in as.double(y) : 
cannot coerce type 'closure' to vector of type 'double'

Есть ли способ построить функцию на plot в R (в идеале без ggplot2)? Или мне нужно сделать фрейм данных, представляющий функцию ... похоже, взломан.

0
izaak_pyzaak 7 Сен 2016 в 14:23

3 ответа

Лучший ответ

При построении функции вы можете использовать lines или curve.

Ошибка возникает из-за того, что для lines требуются векторные (или матричные) аргументы (введите "double" в сообщении об ошибке), а вы передаете ему функцию (введите "закрытие").

Функция curve предназначена для непосредственного построения графиков функций и поэтому может быть предпочтительнее. ниже приведен пример построения двух функций, которые оценивают набор точек.

# get sample data
set.seed(1234)
x <- 1:20
y <- x^2 + 0.5 * x + 1 + rnorm(20)
y.est1 <- function(x) 1.1 * x^2 + 0.55 * x - 1
y.est2 <- function(x) .9 * x^2 + 0.45 * x + 2

# scatter plot
plot(x, y)

Используя lines, чтобы нарисовать первую оценку красным цветом.

lines(x, y.est1(x), col="red")

Используя curve, чтобы нанести вторую оценку синим цветом.

curve(y.est2, from=min(x), to=max(x), col="blue", add=TRUE)

Для curve вам необходимо включить аргумент add = TRUE, иначе curve создаст новый график.

Это дает следующий рисунок:

enter image description here

1
lmo 7 Сен 2016 в 11:55

Может быть, abline() поможет. Поскольку это просто добавление линии к сюжету. В вашем случае это должно выглядеть так, если я не ошибаюсь:

abline(a=0, b=2)
0
Benjamin Mohn 7 Сен 2016 в 11:34

Как уже упоминалось в комментариях, lines () принимает два аргумента, оба из которых являются значениями. Вы отправляете eq, функцию и y, который равен NULL. Вы получаете ошибку, потому что NULL не преобразуется в double.

Вы можете попробовать что-то вроде

x <- per_class$input_kb
line(x, eq(x))

Или просто

line(per_class$input_kb, eq(per_class$input_kb))
0
aberrante 7 Сен 2016 в 11:40