Ответ 1
Ошибка связана с завершением +
после geom_point()
. Удалите это, и он должен работать.
Я пытаюсь создать свою первую функцию в R. Функция должна принимать в кадре данных, х-серии из фрейма данных, y-серии из кадра данных и строить график рассеяния. Кажется довольно простым, но я столкнулся с трудностями, когда пытаюсь проверить дополнительный логический аргумент.
plotScatterChart <- function(data,x,y,scale=y,line=FALSE) {
require(ggplot2)
data$x <- as.numeric(x)
data$y <- as.numeric(y)
plot <- ggplot(data, aes(x, y)) +
geom_point() + # aes(alpha=0.3,color=scale)
#scale_color_gradient(high="red")
if(line) {
plot <- plot + geom_smooth(method="lm")
}
ggsave(file="plot.svg", plot=plot, height=10, width=10)
return(plot)
}
plotScatterChart(data=iris,x=iris$Petal.Length,y=iris$Petal.Width,line=TRUE)
non-numeric argument to binary operator
Другие предложения по улучшению этой функции приветствуются.
Ошибка связана с завершением +
после geom_point()
. Удалите это, и он должен работать.
Кристофер отвечает совершенно правильно. Позвольте мне добавить, что ggplot
также, кажется, принимает списки:
plot <- ggplot(data, aes(x, y)) +
list(
geom_point(),
aes(alpha=0.3,color=scale),
scale_color_gradient(high="red"),
NULL
)
К сожалению, в отличие от Python, где вы можете написать [1, 2, 3, ]
, конструктор list(1, 2, 3, )
создает ошибку в R. Это является причиной окончательного NULL
, который с радостью игнорируется ggplot2
.
Другим возможным обходным решением является запись
plot <- ggplot(data, aes(x, y)) +
geom_point() +
#aes(alpha=0.3,color=scale) +
#scale_color_gradient(high="red") +
list()
Финал list()
должен оставаться на месте, чтобы отменить эффекты последнего знака +
; это нет-op в противном случае.
С версией 2.0.0 ggplot2
получила новую геометрию geom_blank()
, которая ничего не рисует.
Его можно использовать, чтобы избежать этого типа ошибок, когда он помещен в качестве последнего слоя.
plot <- ggplot(data, aes(x, y)) +
geom_point() +
#aes(alpha=0.3,color=scale) +
#scale_color_gradient(high="red") +
geom_blank()
Использование geom_blank()
таким образом аналогично обходному пути в @krlmlr answer, который использует list()
как последний слой.