Добавление линии с точками на график в ggplot2 - PullRequest
5 голосов
/ 29 июня 2011

Для моего удобства я хочу написать функцию, которая добавляет линейный график и точечный график к уже существующему графику.Я определил:

addlinetoplot <- function(dataset, varx, vary)
     { 
       p <- geom_line(data=dataset, aes_string(x=varx, y=vary)) + 
            geom_point(data=dataset, aes_string(x=varx, y=vary))

       p
     }

Вышеуказанная функция не работает.Это работает, если я уберу знак + и часть geom_point().Выше не работает, потому что по какой-то причине нельзя добавить эти два geoms.Следующий пример иллюстрирует проблему.

Затем я попытался:

df1 <- data.frame(c1 = c(1:10), c2 = c(1:10))
c1 <- c(1:10)
csq <- c1^2
df2 <- data.frame(c1 = c(1:10), csq)
pltbase <- ggplot() + geom_line(df1, aes(x="c1", y="c2")) 

# This does not work.
pltbase + addlinetoplot(dataset=df2, varx = "c1", vary = "csq")

Я понял, что проблема в выражении:

addthistotheplot <- geom_line(data=df2, aes_string(x="c1", y="csq")) + 
                    geom_point(data=df2, aes_string(x="c1", y="csq"))

Попытка определить приведенное выше выражение выдает ошибку:числовой аргумент для бинарного оператора.

Как определить функцию addlinetoplot(), чтобы я мог:

pltbase + addlinetoplot(dataset=df2, varx = "c1", vary = "csq")

работать.Один из способов - разделить geom_line и geom_point и получить разные определения функций для каждого.Есть ли способ сделать это в той же функции?

Спасибо!

1 Ответ

11 голосов
/ 29 июня 2011

Я не могу найти ссылку сейчас, но где-то есть ответ на SO, который объясняет, что вы можете добавить к графику ggplot, передав новые аргументы в виде списка. Соответственно, ваша функция становится:

addlinetoplot <- function(dataset, varx, vary) { 
  list(
    geom_line(data=dataset, aes_string(x=varx, y=vary)), 
    geom_point(data=dataset, aes_string(x=varx, y=vary))
  )
}

И тогда ваш код прорисовки выглядит так:

pltbase <- ggplot() + geom_line(data = df1, aes(x=c1, y=c2))
pltbase + addlinetoplot(df2, varx = "c1", vary = "csq")

Результат:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...