2014-06-23 6 views
2

Я разрабатываю пакет, который содержит функцию построения графика, которая использует ggplot2. Я хочу изменить цвета для шкал по умолчанию, но не влияя на глобальную среду. Я назначаю новую функцию scale_colour_continuous с новым набором цветов по умолчанию.Изменение масштаба по умолчанию ggplot2 внутри функции

library(ggplot2) 
dat  <- data.frame(a = 1:5, b = 1:5) 
home.plot <- function(x){ 
scale_colour_continuous <- function(...) ggplot2::scale_colour_continuous(..., low = "purple", high = "green") 
ggplot(dat, aes(x = a, y = b)) + geom_point(aes(colour = a), size = 10) 
} 

home.plot(dat) 

Это не работает, и цвета не меняются от черного и синего до фиолетового и зеленого. Я думаю, это потому, что ggplot2 ищет функцию scale_colour_continuous() вне среды функции home.plot.

Если попробовать то же самое, но в глобальной среде он работает:

scale_colour_continuous <- function(...) ggplot2::scale_colour_continuous(..., low = "purple", high = "green") 
ggplot(dat, aes(x = a, y = b)) + geom_point(aes(colour = a), size = 10) 

Но это изменяет поведение ggplot для всех последующих участков, а не только те, которые созданы home.plot.

Я знаю, что я могу изменить цвета после того, как объект ggplot был создан + scale_colour_continuous(), но home.plot не знает, нарисовал ли пользователь дискретную или непрерывную переменную, и поэтому мне нужно изменить поведение весов до создания объекта ggplot.

Любая помощь приветствуется.

ответ

2
dat  <- data.frame(a = 1:5, b = 1:5) 
home.plot <- function(x,y=1){ 

    gg <- ggplot(dat, aes(x = a, y = b)) + 
    geom_point(aes(colour = a), size = 10) 
    if(y==1){ 
    gg <- gg+scale_colour_gradient(low="purple", high="green") 
    }else{ 
    gg <- gg+scale_colour_gradientn(colours=c("red","yellow", 
               "green","cyan","blue")) 
    } 
    return(gg) 
} 

home.plot(dat) 

enter image description here

home.plot(dat,2) 

enter image description here

Это должно работать. Для 2 цветов вы можете использовать градиент, bur для нескольких градиентов.

+0

Благодарим вас за ответ. Я бы предпочел избежать решения if else. В пакете я рисую довольно сложные сюжеты с несколькими слоями и масштабами, и они потребуют значительного количества if() s. –

+0

«если» - это просто показать возможности, вы можете пропустить его и иметь только фиолетово-зеленый градиент – Pigeon

+0

Прошу прощения, если неясно, чего я намереваюсь выполнить. Как я писал в сообщении выше, я знаю, что я могу изменить масштаб после создания объекта ggplot. Это недостаточно гибко, потому что я не знаю характера входных переменных в моей функции построения графика. Они могут быть числовыми векторами и факторами. –

Смежные вопросы